|
Гадаю и снимаю порчу по фотографии
|
|||
---|---|---|---|
#18+
Добрый день коллеги, необходим ваш ценный опыт по отладке приложений. Если быть точнее, по отладке Dump файлов и ваши глубокие познания о работе CLR и GC. Есть некое веб приложение, которое работает в проде. Заказчик выражает беспокойство по поводу того, что программа занимает в памяти 17 гб. Так как прямого доступа к серверу нет, высылают полный DUMP процесса. Анализ дампа показал, что большая часть памяти не используется, а зарезервирована GC Вот данный по основным сегментам из clrmd авторa62b4a1000,GCSegment,Ephemeral,68698112; a62f625000,ReservedGCSegment,Ephemeral,4226265088; aa2b4a1000,GCSegment,LargeObject,602112; aa2b534000,ReservedGCSegment,LargeObject,267829248; a72b4a1000,GCSegment,Ephemeral,81014784; a7301e4000,ReservedGCSegment,Ephemeral,4213948416; aa3b4a1000,GCSegment,LargeObject,6557696; aa3bae2000,ReservedGCSegment,LargeObject,261873664; a82b4a1000,GCSegment,Ephemeral,72179712; a82f977000,ReservedGCSegment,Ephemeral,4222783488; aa4b4a1000,GCSegment,LargeObject,2043904; aa4b694000,ReservedGCSegment,LargeObject,266387456; a92b4a1000,GCSegment,Ephemeral,100347904; a931454000,ReservedGCSegment,Ephemeral,4194615296; aa5b4a1000,GCSegment,LargeObject,6922240; aa5bb3b000,ReservedGCSegment,LargeObject,261509120; как видно из списка в памяти есть 4 сегмента по 4 гб каждый, данные сегменты эфемерны, то есть выделен под обычную кучу (Heap) (не LOH). Есть идеи о том, как понять, что именно приводит к тому, что данный сегмент разрастается до таких размеров? Предположим, некий код порождает огромное количество малых по размеру объектов, которые занимают большой объем памяти, после того как они стали недостижимы, они финализируются (удаляются), а на каком то этапе память дефрагментируется согласно своим поколениям. В итоге остается большая свободная область. Как мне казалось ранее, GC должен эту область деалоцировать, но по какой то причине он этого не делает. Так же вопрос, почему мы имеем 4 эфемерных сегмента, хоть в теории может быть только один? я не жду от вас решения моей проблемы, а хотел бы получить от вас советы, в каком направлении стоит копать, какие то идеи, предположения, теории, гипотезы ... |
|||
:
Нравится:
Не нравится:
|
|||
25.06.2019, 13:24 |
|
Гадаю и снимаю порчу по фотографии
|
|||
---|---|---|---|
#18+
Roman Mejtes, сколько адер? ... |
|||
:
Нравится:
Не нравится:
|
|||
25.06.2019, 13:49 |
|
Гадаю и снимаю порчу по фотографии
|
|||
---|---|---|---|
#18+
Roman Mejtes, я просто в статейке видел такой текст mattwarren.orgThe .NET GC creates 1 or more Heaps, depending on the number of CPU cores available and the mode it is running in (Server/Workstation) ... |
|||
:
Нравится:
Не нравится:
|
|||
25.06.2019, 13:59 |
|
Гадаю и снимаю порчу по фотографии
|
|||
---|---|---|---|
#18+
buser, спасибо :) буду знать. вообще тут еще почитал в одном месте, что в ASP.NET память не деалоцируется, в отличии от Desktop приложений в целях оптимизации, скорее всего какие то объекты забивают память, скорее всего доживают до 1-2 поколения и только потом удаляются. Вот такая у меня пока рабочая гипотеза, осталось найти этих тварей и понять, где они обитают :) Так же очень напрягают динамические сборки которых на момент дампа загружено уже около 100 штук ... |
|||
:
Нравится:
Не нравится:
|
|||
25.06.2019, 14:05 |
|
Гадаю и снимаю порчу по фотографии
|
|||
---|---|---|---|
#18+
Roman MejtesЕсть идеи о том, как понять, что именно приводит к тому, что данный сегмент разрастается до таких размеров? 1. при интенсивной работе с данными память не переиспользуется -- по возможности переиспользовать в таких местах 2. слишком большой объём данных, загружаемый в память для работы -- по возможности работать с данными маленькими порциями и оперировать на стороне БД (если это БД) 3. остаются достижимые ссылки, часто это не очевидно -- инкапсулировать и изолировать работу с данными, не отдавать ссылки на элементы наружу, лучше копировать 4. данные слишком долго живут, что приводит к перемещению в след. поколение, при этом блоки памяти остаются выделенными, так как для серверного ПО политики работы с памятью немного другими -- не держать в памяти данные, которые сейчас не используются, перемещение данных относительно дешёвая операция, долговременное хранение -- дорогая, или см. п.1 5. нужно удостовериться, что работает GC Server ... |
|||
:
Нравится:
Не нравится:
|
|||
28.06.2019, 11:00 |
|
Гадаю и снимаю порчу по фотографии
|
|||
---|---|---|---|
#18+
Roman Mejtes, Надо везде, где возможно, использовать конструкцию Код: c# 1. 2. 3. 4.
... |
|||
:
Нравится:
Не нравится:
|
|||
29.06.2019, 16:45 |
|
Гадаю и снимаю порчу по фотографии
|
|||
---|---|---|---|
#18+
Cat2, на самом деле, это не верное утверждение в контексте вопроса: 1. using не освобождает используемую память, хотя в Dispose конечно могут удаляться ссылки и даже блоки памяти, но сам using этого не делает 2. при использовании DI, using чаще вреден, чем полезен для локальных переменных можно просто повысить уровень предупреждения до ошибки: https://docs.microsoft.com/en-us/visualstudio/code-quality/ca2000-dispose-objects-before-losing-scope ... |
|||
:
Нравится:
Не нравится:
|
|||
30.06.2019, 01:15 |
|
|
start [/forum/topic.php?fid=20&fpage=19&tid=1398893]: |
0ms |
get settings: |
9ms |
get forum list: |
12ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
29ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
43ms |
get tp. blocked users: |
2ms |
others: | 260ms |
total: | 376ms |
0 / 0 |