Всем привет!
Есть сервис, asp.net под IIS, .Net (не Core). Нагрзука относительно небольшая — 30 запросов/сек, в штатном режиме процесс w3wp потребляет 4-5ГБ озу, 20-40% CPU.
Всё работает норм, уже не 1-й год. И вот некоторое время назад, случилось что 2 раза рабочий процесс начинал потреблять 100% CPU, аномально много памяти (>12ГБ), такое продолжалось минут 10, обработка реквестов практически умирала, рабочий процесс приходилось рестартовать.
При последнем таком разе удалось выяснить что CPU потребляли потоки GC и практически вся потреблённая память — в .Net Generation 2 (при помощи ProcessExplorer).
Как такое возможно?
Что и как вдруг может начать (при казалось бы обычной нагрузке — но это нельзя утверждать 100%) производить столько мусора, что все ресурсы уходят на его сборку?
Странно и то, что раз в основном долгое время работают потоки GC (на них почти 100% cpu), то рабочие потоки простаивают и не способны уже генерировать мусор..
Кто тогда создаёт мусор для сборки, да ещё в таком кол-ве чтоб 4 потока GC столько времени (10 минут) его собирали?...
Или это глюк какой-то в .Net?
Здравствуйте, MadHuman, Вы писали:
MH>Всем привет! MH>Есть сервис, asp.net под IIS, .Net (не Core). Нагрзука относительно небольшая — 30 запросов/сек, в штатном режиме процесс w3wp потребляет 4-5ГБ озу, 20-40% CPU. MH>Всё работает норм, уже не 1-й год. И вот некоторое время назад, случилось что 2 раза рабочий процесс начинал потреблять 100% CPU, аномально много памяти (>12ГБ), такое продолжалось минут 10, обработка реквестов практически умирала, рабочий процесс приходилось рестартовать. MH>При последнем таком разе удалось выяснить что CPU потребляли потоки GC и практически вся потреблённая память — в .Net Generation 2 (при помощи ProcessExplorer).
MH>Как такое возможно? MH>Что и как вдруг может начать (при казалось бы обычной нагрузке — но это нельзя утверждать 100%) производить столько мусора, что все ресурсы уходят на его сборку? MH>Странно и то, что раз в основном долгое время работают потоки GC (на них почти 100% cpu), то рабочие потоки простаивают и не способны уже генерировать мусор.. MH>Кто тогда создаёт мусор для сборки, да ещё в таком кол-ве чтоб 4 потока GC столько времени (10 минут) его собирали?... MH>Или это глюк какой-то в .Net?
Все ли в порядке с железом (память/диск)?
Какая ОС на сервере (ставятся ли апдейты на регулярной основе)?
Какая версия .NET?
Какой режим GC?
Если с вышеперечисленным — все ОК.
То взять дамп памяти (доступ к серваку есть, я так понимаю) и посмотреть, что за объекты такие лежат в Gen2 и почему они туда попадают.
MH>Как такое возможно?
Итоги расследования (для тех кому интересно что же было и когда такое бывает).
Оказалось что в хитром случае, при обработке одного из реквестов из-за определённого сочетания настроек происходило зацикливание в нашей логике. В этом цикле и генерился мусор.
После некоторого времени работы (нескольких минут) постепенно выжыралась вся доступная память, далее время работы GC росло и начинало занимать почти всё CPU.
Порулило (как и в большинстве таких случаев) снятие дампа (при помощи procdump с условием — высокий расход памяти процессом) и его анализ (каких объектов аномально много, кто их держит, в каком потоке созданы, разбор стэка потока).