поиск memory leaks на продакшен
От: MadHuman Россия  
Дата: 26.02.18 15:08
Оценка:
Всем привет!

Коллеги, а поделитесь опытом как можно эффективно искать мемори-лики на боевой продакшен системе?..

особенности такие:
— при утечке на сервере уже расход памяти под завязку, и запуски тулзов типа .net memory profiler, ANTS memory profiler не вариант, тк памяти свободной нет, система еле ворачается, запустить пробывал, но долго долго жуёт (минут 30) и при попытке приатачиться к процессу (ещё минут на дцать замирает) и в итоге падает, а иной раз и рабочий процесс валит.
— вот хорошая техника (через дамп и windbg), но это как я вижу для крэш-дампов. пробывал снять мини-дамп процесса (в processexplorer есть такая фича), но в этом дампе нет инфы о памяти. при попытке снять полный дамп — опять рабочий процесс убился. может какой-то нет тот способ снятия дампа использую (опять юзаю фичу процесс-эксплорера)?...
— интересно именно как-то заатачиться к процессу и понять каков реальный расклад по .Net объектам... тк вариантов возможное овер-дохрена и методом "подумали добавили логов, обновили систему, ждём результатов" можно потратить недели, не вариант. тк и ситуации редкие и раз от разу могут быть разные. интересна техника именно чтоб на рабочей системе снять дамп и проанализировать..

кто-нибудь такое может? или при помощи чего-нибудь?...
Re: поиск memory leaks на продакшен
От: Temnikov Россия  
Дата: 26.02.18 15:18
Оценка:
MH>- вот хорошая техника (через дамп и windbg), но это как я вижу для крэш-дампов. пробывал снять мини-дамп процесса (в processexplorer есть такая фича), но в этом дампе нет инфы о памяти. при попытке снять полный дамп — опять рабочий процесс убился. может какой-то нет тот способ снятия дампа использую (опять юзаю фичу процесс-эксплорера)?...
Процесс-эксплорер видимо снимает минидамп, который тебе не подходит.
Надо так: аттачишься к процессу WinDBG нужной тебе битности, дальше набираешь
.dump -ma <путь\ИмяДампа.dmp>
потом можешь прибить или отсоединится. а дамп уже анализировать у себя локально на компе.
Re: поиск memory leaks на продакшен
От: Qulac Россия  
Дата: 26.02.18 15:23
Оценка:
Здравствуйте, MadHuman, Вы писали:

MH>Всем привет!


MH>Коллеги, а поделитесь опытом как можно эффективно искать мемори-лики на боевой продакшен системе?..


MH>особенности такие:

MH>- при утечке на сервере уже расход памяти под завязку, и запуски тулзов типа .net memory profiler, ANTS memory profiler не вариант, тк памяти свободной нет, система еле ворачается, запустить пробывал, но долго долго жуёт (минут 30) и при попытке приатачиться к процессу (ещё минут на дцать замирает) и в итоге падает, а иной раз и рабочий процесс валит.
MH>- вот хорошая техника (через дамп и windbg), но это как я вижу для крэш-дампов. пробывал снять мини-дамп процесса (в processexplorer есть такая фича), но в этом дампе нет инфы о памяти. при попытке снять полный дамп — опять рабочий процесс убился. может какой-то нет тот способ снятия дампа использую (опять юзаю фичу процесс-эксплорера)?...
MH>- интересно именно как-то заатачиться к процессу и понять каков реальный расклад по .Net объектам... тк вариантов возможное овер-дохрена и методом "подумали добавили логов, обновили систему, ждём результатов" можно потратить недели, не вариант. тк и ситуации редкие и раз от разу могут быть разные. интересна техника именно чтоб на рабочей системе снять дамп и проанализировать..

MH>кто-нибудь такое может? или при помощи чего-нибудь?...


Так в чём проблема в утечке памяти или почему то жрёт много памяти? По мне лучше код внимательно проинспектировать.
Программа – это мысли спрессованные в код
Re: поиск memory leaks на продакшен
От: RushDevion Россия  
Дата: 26.02.18 15:27
Оценка:
WinDbg тоже виснет?
Он, если что, умеет дамп работающего процесса снимать (как-то так).
Еще есть смысл посмотреть на счетчики производительности из .NET CLR Memory (особенно Large Object Heap Size, Bytes in all Heaps, Allocated bytes/sec)
Бывает что по ним уже становится понятно куда примерно копать.
Отредактировано 26.02.2018 15:38 RushDevion . Предыдущая версия .
Re[2]: поиск memory leaks на продакшен
От: MadHuman Россия  
Дата: 26.02.18 15:32
Оценка:
Здравствуйте, Qulac, Вы писали:



Q>Так в чём проблема в утечке памяти или почему то жрёт много памяти?

жрёт много памяти, вероятно вследствии утечки

Q>По мне лучше код внимательно проинспектировать.

это само собой) но в кач-ве дополнительного оружия, хочется овладеть рабочей техникой субжа, дабы "если что" встретить проблему в готовности.
Re[2]: поиск memory leaks на продакшен
От: MadHuman Россия  
Дата: 26.02.18 15:40
Оценка:
Здравствуйте, RushDevion, Вы писали:

RD>WinDbg тоже виснет?

RD>Он, если что, умеет дамп работающего процесса снимать (как-то так)?
WinDbg не пробывал, не нашел пока инсталлер для него. есть в составе студии, но ставить всю студию на рабочий сервер как-то нехочется, также ссылка на инсталлер в статье уже не рабочая.
не знаете случаем где взять можно только сам WinDbg (без доп-го всего ненужного)?..

да, и точно ли это отличается от процесс-эксплорерного фулл-дампа?...
(не понял как скрин вставить в сообщение? хотел показать как в процесс-эксплорер делается фул-дамп)..

RD>Еще есть смысл посмотреть на счетчики производительности из .NET CLR Memory (особенно Large Object Heap Size, Bytes in all Heaps, Allocated bytes/sec)

RD>Бывает что по ним уже становится понятно куда примерно копать.
бывает, но к сожалению не в нашем случае.
хочется всё таки полный расклад научиться получать, раз уж есть возможность... это наиболее объективно будет... и проблему проще и быстрее будет локализовать.
Отредактировано 26.02.2018 15:42 MadHuman . Предыдущая версия .
Re[3]: поиск memory leaks на продакшен
От: RushDevion Россия  
Дата: 26.02.18 15:45
Оценка:
MH>не знаете случаем где взять можно только сам WinDbg (без доп-го всего ненужного)?..

Я точно знаю, что его можно скачать отдельно, но конкретную ссылку не дам.
Попробуй загуглить "WinDbg standalone download".
Вот, например, ссылка на SO (сам не пробовал)
Re[2]: поиск memory leaks на продакшен
От: MadHuman Россия  
Дата: 26.02.18 15:48
Оценка:
Здравствуйте, Temnikov, Вы писали:


T>Процесс-эксплорер видимо снимает минидамп, который тебе не подходит.

T>Надо так: аттачишься к процессу WinDBG нужной тебе битности, дальше набираешь
T>.dump -ma <путь\ИмяДампа.dmp>
T>потом можешь прибить или отсоединится. а дамп уже анализировать у себя локально на компе.

процесс-эксплорер снимает и мини-дамп и фул-дамп. но при попытке снять фул-дамп — процесс завалило и в итоге проблемное состояние было утеряно.
фул-дамп процесс эксплорера это тоже что и фул-дамп WinDbg?

WinDbg не пробывал, не нашел пока инсталлер для него, не попалась инфа. есть в составе студии, но ставить всю студию на рабочий сервер как-то нехочется.
не знаеш случаем где взять можно только сам WinDbg (без доп-го всего ненужного)?..
Re[4]: поиск memory leaks на продакшен
От: MadHuman Россия  
Дата: 26.02.18 15:49
Оценка:
Здравствуйте, RushDevion, Вы писали:

MH>>не знаете случаем где взять можно только сам WinDbg (без доп-го всего ненужного)?..


RD>Я точно знаю, что его можно скачать отдельно, но конкретную ссылку не дам.

RD>Попробуй загуглить "WinDbg standalone download".
RD>Вот, например, ссылка на SO (сам не пробовал)
ок, спасибо, поищу. найду отпишу в корневом топике, для потомков)
ссылка на SO ведет на ту же невалидную страницу что и ссылка в статье ранее) пока мне попадались только такие)
Re: поиск memory leaks на продакшен
От: sergeya Ниоткуда http://blogtani.ru
Дата: 26.02.18 17:25
Оценка:
Здравствуйте, MadHuman, Вы писали:

MH>- при утечке на сервере уже расход памяти под завязку, и запуски тулзов типа .net memory profiler, ANTS memory profiler не вариант, тк памяти свободной нет, система еле ворачается,


А что если ограничить процессу объем доступной памяти и дождать утечек?
При этом остальные процессы на сервере не будут испытывать недостатка в памяти и возможно получиться снять дамп/карту распределения.

Для ограничения можно взять что то вроде Process Governor — https://github.com/lowleveldesign/process-governor

With the --maxmem switch Process Governor allows you to set a limit on a memory committed by a process. On Windows committed memory is actually all private memory that the process uses. This way you may use Process Governor to test your .NET applications (including web applications) for memory leaks. If the process is leaking memory you faster get the OutOfMemoryException.

Мобильная версия сайта RSDN — http://rsdn.org/forum/rsdn/6938747
Автор: sergeya
Дата: 19.10.17
Re[2]: поиск memory leaks на продакшен
От: MadHuman Россия  
Дата: 26.02.18 17:41
Оценка:
Здравствуйте, sergeya, Вы писали:


S>А что если ограничить процессу объем доступной памяти и дождать утечек?

S>При этом остальные процессы на сервере не будут испытывать недостатка в памяти и возможно получиться снять дамп/карту распределения.

S>Для ограничения можно взять что то вроде Process Governor — https://github.com/lowleveldesign/process-governor

S>

S>With the --maxmem switch Process Governor allows you to set a limit on a memory committed by a process. On Windows committed memory is actually all private memory that the process uses. This way you may use Process Governor to test your .NET applications (including web applications) for memory leaks. If the process is leaking memory you faster get the OutOfMemoryException.

спасибо. похоже это самый реальный вариант. добавить памяти стоит денег, но потери из-за неудобств и время на разбор проблем дороже.
похоже что и windbg при недостатке ресурсов валится (и валит процесс), к тому же на время снятия дампа он суспендит процесс на довольно ощутимое время, что вызывает полные тормоза сервиса и повышение уровня гнева клиентов.
Re: поиск memory leaks на продакшен
От: Kolesiki  
Дата: 26.02.18 18:47
Оценка:
Здравствуйте, MadHuman, Вы писали:

MH>- при утечке на сервере уже расход памяти под завязку, и запуски тулзов типа .net memory profiler, ANTS memory profiler не вариант, тк памяти свободной нет


А для чего ждать затыка памяти?? Профайлер и так покажет рост потребления, а ваша задача — узнать, кто ест. Хотя всё равно глупо профайлить, когда сам код должен подсказывать, где у вас большие расходы, очереди, и т.п.
Re[2]: поиск memory leaks на продакшен
От: MadHuman Россия  
Дата: 26.02.18 19:31
Оценка:
Здравствуйте, Kolesiki, Вы писали:

K>А для чего ждать затыка памяти??

чтоб для конкретной ситуации получить детали (сколько каких объектов создано и их данные).

K>Хотя всё равно глупо профайлить, когда сам код должен подсказывать, где у вас большие расходы, очереди, и т.п.

да, есть 2 метода — анализировать код и все потенциалные варианты, и второй зная что именно аномально искать этому причину.
2-й существенно продуктивней, особенно если затыки редкие/разные/слабо повторяемые.
Re: поиск memory leaks на продакшен
От: zou  
Дата: 26.02.18 19:53
Оценка: 35 (4) +1
Здравствуйте, MadHuman, Вы писали:

procdump -r -ma <PID>
Re: поиск memory leaks на продакшен
От: notacat  
Дата: 26.02.18 19:53
Оценка:
а почему именно на продакшен? Т.е. я бы в первую очередь попробовала локально развернуть похожую систему и посмотреть, куда память течет, пока она не вся утекла. Если утечки есть, обычно это можно легко смоделировать, не надо ждать с продакшеном три месяца. А когда оно на сервере уже все съело — что вы поймете из огромного дампа, даже если его снимете? Легче же на птичках
Re[2]: поиск memory leaks на продакшен
От: MadHuman Россия  
Дата: 26.02.18 21:40
Оценка:
Здравствуйте, notacat, Вы писали:

N>а почему именно на продакшен? Т.е. я бы в первую очередь попробовала локально развернуть похожую систему и посмотреть, куда память течет, пока она не вся утекла. Если утечки есть, обычно это можно легко смоделировать, не надо ждать с продакшеном три месяца.

потому что моделировать нечего, как бы всё хорошо и проблем быть не должно, но они есть


N> А когда оно на сервере уже все съело — что вы поймете из огромного дампа, даже если его снимете?

а вот это как раз не проблема, когда дамп будет — поймём, тут как.

дамп на самом деле очень крутая штука. уже неоднократно помогал распутать сложные проблемы/крэши.
без реального состояния при падении, очень трудно понять причину и повторить.
Re[2]: поиск memory leaks на продакшен
От: MadHuman Россия  
Дата: 26.02.18 21:42
Оценка:
Здравствуйте, zou, Вы писали:

zou>Здравствуйте, MadHuman, Вы писали:


zou>procdump -r -ma <PID>


Друг, спасибище!!!
Re: поиск memory leaks на продакшен
От: _NN_ www.nemerleweb.com
Дата: 27.02.18 05:01
Оценка:
Здравствуйте, MadHuman, Вы писали:

MH>Всем привет!


MH>Коллеги, а поделитесь опытом как можно эффективно искать мемори-лики на боевой продакшен системе?..


MH>особенности такие:

MH>- при утечке на сервере уже расход памяти под завязку, и запуски тулзов типа .net memory profiler, ANTS memory profiler не вариант, тк памяти свободной нет, система еле ворачается, запустить пробывал, но долго долго жуёт (минут 30) и при попытке приатачиться к процессу (ещё минут на дцать замирает) и в итоге падает, а иной раз и рабочий процесс валит.
MH>- вот хорошая техника (через дамп и windbg), но это как я вижу для крэш-дампов. пробывал снять мини-дамп процесса (в processexplorer есть такая фича), но в этом дампе нет инфы о памяти. при попытке снять полный дамп — опять рабочий процесс убился. может какой-то нет тот способ снятия дампа использую (опять юзаю фичу процесс-эксплорера)?...
MH>- интересно именно как-то заатачиться к процессу и понять каков реальный расклад по .Net объектам... тк вариантов возможное овер-дохрена и методом "подумали добавили логов, обновили систему, ждём результатов" можно потратить недели, не вариант. тк и ситуации редкие и раз от разу могут быть разные. интересна техника именно чтоб на рабочей системе снять дамп и проанализировать..

MH>кто-нибудь такое может? или при помощи чего-нибудь?...

Можно ещё использовать .NET Memory Profiler или dotMemory и запускать из командной строки.
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[3]: поиск memory leaks на продакшен
От: Temnikov Россия  
Дата: 27.02.18 09:42
Оценка:
MH>WinDbg не пробывал, не нашел пока инсталлер для него, не попалась инфа. есть в составе студии, но ставить всю студию на рабочий сервер как-то нехочется.
MH>не знаеш случаем где взять можно только сам WinDbg (без доп-го всего ненужного)?..
Раньше WinDbg входил в состав любого Windows SDK, сейчас скорее всего то же.
Можно найти на диске с WinSDK (не устанавливая сам WinSDK ) инсталлятор WinDbg, имена файлов (вроде брал из Win8 SDK, точно не помню):
"X64 Debuggers And Tools-x64_en-us.msi"
"X86 Debuggers And Tools-x86_en-us.msi"

Либо запустить уставновку WinSDK, там выбрать в компонентах которые ставятся WinDbg.

WinDbg на мой взгляд очень хороший инструмент, особенно если уметь им пользоваться.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.