У меня есть сервер веб-сокетов, который накапливает память в течение нескольких дней, вплоть до момента, когда Kubernetes в конечном итоге убьет ее.Мы контролируем его, используя prometheous-net .
# dotnet --info
Host (useful for support):
Version: 2.1.6
Commit: 3f4f8eebd8
.NET Core SDKs installed:
No SDKs were found.
.NET Core runtimes installed:
Microsoft.AspNetCore.All 2.1.6 [/usr/share/dotnet/shared/Microsoft.AspNetCore.All]
Microsoft.AspNetCore.App 2.1.6 [/usr/share/dotnet/shared/Microsoft.AspNetCore.App]
Microsoft.NETCore.App 2.1.6 [/usr/share/dotnet/shared/Microsoft.NETCore.App]
Но когда я подключаюсь удаленно и получаю дамп памяти (используя createdump
), внезапно память падает ... без обслуживанияостановка, перезапуск или потеря любого подключенного пользователя.См. Зеленую линию на рисунке.
Я вижу на графиках, что GC собирает регулярно во всех поколениях.
Сервер GC отключен с помощью:
<PropertyGroup>
<ServerGarbageCollection>false</ServerGarbageCollection>
</PropertyGroup>
Прежде чем отключить GC Server, сервис раньше увеличивал объем памяти.Теперь потребуется 5 недель, чтобы получить 512 МБ.
Другие службы, использующие ASP.NET Core по запросу / ответу, не показывают эту проблему.При этом используются веб-сокеты, где каждое соединение обычно длится около 10 минут ... поэтому, я думаю, все, что связано с этим соединением, длится до поколения 2. Легко.
Обратите внимание, что есть два модуля, показывая то же самое поведение, и затем одна (зеленая) внезапно падает в использовании памяти из-за взятия дампа памяти.
Стручки сделалине перезагружаться при получении дампа памяти:
Нет потери соединения или перезапуска.
Кучи:
(lldb) eeheap -gc
Number of GC Heaps: 1
generation 0 starts at 0x00007F8481C8D0B0
generation 1 starts at 0x00007F8481C7E820
generation 2 starts at 0x00007F852A1D7000
ephemeral segment allocation context: none
segment begin allocated size
00007F852A1D6000 00007F852A1D7000 00007F853A1D5E90 0xfffee90(268430992)
00007F84807D0000 00007F84807D1000 00007F8482278000 0x1aa7000(27947008)
Large object heap starts at 0x00007F853A1D7000
segment begin allocated size
00007F853A1D6000 00007F853A1D7000 00007F853A7C60F8 0x5ef0f8(6222072)
Total Size: Size: 0x12094f88 (302600072) bytes.
------------------------------
GC Heap Size: Size: 0x12094f88 (302600072) bytes.
(lldb)
Свободнообъекты:
(lldb) dumpheap -type Free -stat
Statistics:
MT Count TotalSize Class Name
00000000010c52b0 219774 10740482 Free
Total 219774 objects
Есть ли объяснение этому поведению?