. NET Утечка памяти в Windows Диагностика службы с помощью WinDbg - PullRequest
0 голосов
/ 03 мая 2020

Проблема:

В течение нескольких дней объем памяти будет увеличиваться до тех пор, пока у нее не останется памяти с 32-разрядным приложением, которое может выделить только 3,5 ГБ. Эта программа генерирует отчеты на основе различных ERP, веб-сервисов, FTP, которые отправляют их в различных форматах CSV, SMS и т. Д.

Приложение:

Я использую следующие основные установленные пакеты:

  • Hangfire v1.7.10
  • Hangfire SqlSever v1.7.10
  • SimpleImpersonation v3.0
  • CsvHelper v15.0.4
  • Dapper v2.0.35
  • esendex-do tnet -sdk v3.8
  • FastMember v1.5
  • FluentFTP v23.3.1
  • Microsoft.Owin v4.1
  • Newtonsoft. Json v12.0.3
  • Serilog v2.9
  • Serilog.Sinks.Seq v4.0
  • Interop.SageDataObject250 v25 (только для x86)

Это Windows Использование службы. NET Framework v4.7.2, скомпилированный для x86 из-за ссылки на Sage.

Шаги, которые я пытался диагностировать проблема:

Я запустил диспетчер задач в x86 и сгенерировал DMP, используя C: \ Windows \ SysWOW64 \ taskmgr.exe

Я скопировал DMP на мое развитие P C и запускал WinDbg в режиме x86 с помощью команды -debugArch x86

Я выполнил команду .loadby sos clr затем !address -summary, которая дает следующие результаты:

--- Usage Summary ---------------- RgnCount ----------- Total Size -------- %ofBusy %ofTotal
Heap                                  26731          c4ece000 (   3.077 GB)  84.59%   76.93%
<unknown>                               962          17b0b000 ( 379.043 MB)  10.18%    9.25%
Free                                    266          1733e000 ( 371.242 MB)            9.06%
Image                                   958           8b55000 ( 139.332 MB)   3.74%    3.40%
Stack                                   171           36c0000 (  54.750 MB)   1.47%    1.34%
TEB                                      57             7b000 ( 492.000 kB)   0.01%    0.01%
Other                                     8             46000 ( 280.000 kB)   0.01%    0.01%
PEB                                       1              3000 (  12.000 kB)   0.00%    0.00%

--- Type Summary (for busy) ------ RgnCount ----------- Total Size -------- %ofBusy %ofTotal
MEM_PRIVATE                           27660          dd421000 (   3.457 GB)  95.04%   86.43%
MEM_IMAGE                              1186           93e7000 ( 147.902 MB)   3.97%    3.61%
MEM_MAPPED                               42           24aa000 (  36.664 MB)   0.98%    0.90%

--- State Summary ---------------- RgnCount ----------- Total Size -------- %ofBusy %ofTotal
MEM_COMMIT                            26966          d4334000 (   3.316 GB)  91.15%   82.89%
MEM_FREE                                266          1733e000 ( 371.242 MB)            9.06%
MEM_RESERVE                            1922          1497e000 ( 329.492 MB)   8.85%    8.04%

--- Protect Summary (for commit) - RgnCount ----------- Total Size -------- %ofBusy %ofTotal
PAGE_READWRITE                        14073          c60df000 (   3.095 GB)  85.08%   77.37%
PAGE_EXECUTE_READ                       108           6730000 ( 103.188 MB)   2.77%    2.52%
PAGE_READONLY                           365           4181000 (  65.504 MB)   1.76%    1.60%
PAGE_NOACCESS                         11990           2ed6000 (  46.836 MB)   1.26%    1.14%
PAGE_WRITECOPY                          270            791000 (   7.566 MB)   0.20%    0.18%
PAGE_EXECUTE_READWRITE                   46            220000 (   2.125 MB)   0.06%    0.05%
PAGE_READWRITE|PAGE_GUARD               114            11d000 (   1.113 MB)   0.03%    0.03%

--- Largest Region by Usage ----------- Base Address -------- Region Size ----------
Heap                                        d69a7000            2b8000 (   2.719 MB)
<unknown>                                   f7f62000           1a88000 (  26.531 MB)
Free                                        fb230000           3920000 (  57.125 MB)
Image                                       70630000            f55000 (  15.332 MB)
Stack                                        1c60000             fc000 (1008.000 kB)
TEB                                           e68000              3000 (  12.000 kB)
Other                                       fecb0000             23000 ( 140.000 kB)
PEB                                           f53000              3000 (  12.000 kB)

I можно увидеть 3 ГБ в куче, поэтому я запустил !eeheap -gc

Number of GC Heaps: 1
generation 0 starts at 0xf161e75c
generation 1 starts at 0xf1612484
generation 2 starts at 0x01e11000
ephemeral segment allocation context: none
 segment     begin  allocated      size
01e10000  01e11000  02e0ff68  0xffef68(16772968)
2ac00000  2ac01000  2bbfff58  0xffef58(16772952)
e1b70000  e1b71000  e2b6fe3c  0xffee3c(16772668)
dbba0000  dbba1000  dcba0000  0xfff000(16773120)
95e60000  95e61000  96e5ff30  0xffef30(16772912)
c6e40000  c6e41000  c7e3ff70  0xffef70(16772976)
dcba0000  dcba1000  ddb9ff54  0xffef54(16772948)
ddba0000  ddba1000  deb9fccc  0xffeccc(16772300)
dfb70000  dfb71000  e0b6ff2c  0xffef2c(16772908)
e3b40000  e3b41000  e4b3ffac  0xffefac(16773036)
e4b40000  e4b41000  e5b3fec0  0xffeec0(16772800)
f07e0000  f07e1000  f17c17bc  0xfe07bc(16648124)
Large object heap starts at 0x02e11000
 segment     begin  allocated      size
02e10000  02e11000  030f2dd8  0x2e1dd8(3022296)
e0b70000  e0b71000  e1af14c0  0xf804c0(16254144)
f3780000  f3781000  f42012a0  0xa802a0(11010720)
Total Size:              Size: 0xdcb7248 (231436872) bytes.
------------------------------
GC Heap Size:    Size: 0xdcb7248 (231436872) bytes.

231436872 B = 231,436872 МБ Итак, где же остальная часть памяти?

!heap -s

************************************************************************************************************************
                                              NT HEAP STATS BELOW
************************************************************************************************************************
LFH Key                   : 0x71f51955
Termination on corruption : ENABLED
  Heap     Flags   Reserv  Commit  Virt   Free  List   UCR  Virt  Lock  Fast 
                    (k)     (k)    (k)     (k) length      blocks cont. heap 
-----------------------------------------------------------------------------
01440000 00000002 3221644 3049200 3221588  31845  2238  1075    0     83   LFH
01360000 00001002    1136     88   1080     20     9     2    0      0   LFH
01930000 00001002    1136    132   1080     10    11     2    0      0   LFH
018c0000 00001002    1136    216   1080      4    50     2    0      0   LFH
01e00000 00041002      60      4     60      2     1     1    0      0      
04420000 00041002     116     28     60      3     2     1    0      0   LFH
091c0000 00001002      60     12     60      4     2     1    0      0      
0a8b0000 00001002    1136    212   1080     73    10     2    0      0   LFH
-----------------------------------------------------------------------------

!dumpheap -stat

7030f850      238        74436 System.Char[]
7030bff0     1279        86972 System.Reflection.RuntimeParameterInfo
01df8d24      218       131672 System.Collections.Generic.Dictionary`2+Entry[[System.Single, mscorlib],[OfficeOpenXml.FontSizeInfo, EPPlus]][]
703109ac     1179       134016 System.Int32[]
7030f378     1416       156412 System.Object[]
7030b680     3479       208740 System.Reflection.RuntimeMethodInfo
6b01c4c8        2       524312 System.Data.DataRow[]
6b01cc24      104      2594016 System.Data.RBTree`1+Node[[System.Data.DataRow, System.Data]][]
70312158     3995      2676025 System.Byte[]
6b01bd4c    80417      5468356 System.Data.DataRow
0145b368      183      6617958      Free
7030f964      406     24582180 System.String[]
7030f0d4  3392330    183245330 System.String

Итак. NET куче не выделено много памяти. Я урезал его, так как список был огромным, но они были снизу самой большой выделенной памятью.

Я не слишком знаком с WinDbg, но я предполагаю, что это утечка памяти кучи?

Итак, единственное, что я могу придумать, для чего могут использоваться нативные кучи и т. Д., Это SimpleImpersonation и Sage из-за того, что он использует COM-объекты?

Если у кого-нибудь есть какие-либо советы или вы можете дать мне sh правильное направление было бы здорово. Спасибо.

Я просмотрел свой код, чтобы убедиться, что все, что имеет IDisposable, использует оператор using.

...