GC жрёт 100% CPU
От: MadHuman Россия  
Дата: 30.04.19 08:24
Оценка:
Всем привет!
Есть сервис, 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?
Re: GC жрёт 100% CPU
От: Egorio Россия  
Дата: 30.04.19 09:05
Оценка:
Здравствуйте, 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?

Большое кол-во "мусора" создает неправильный код
Re: GC жрёт 100% CPU
От: RushDevion Россия  
Дата: 30.04.19 09:43
Оценка:
Все ли в порядке с железом (память/диск)?
Какая ОС на сервере (ставятся ли апдейты на регулярной основе)?
Какая версия .NET?
Какой режим GC?

Если с вышеперечисленным — все ОК.
То взять дамп памяти (доступ к серваку есть, я так понимаю) и посмотреть, что за объекты такие лежат в Gen2 и почему они туда попадают.
Re: GC жрёт 100% CPU
От: HotDog Швейцария www.denebspace.com
Дата: 30.04.19 18:59
Оценка: 3 (1)
Здравствуйте, MadHuman, Вы писали:

MH>Как такое возможно?


Проверьте код на наличие GC.WaitingFor... GC.Collect().
У нас четыре подобные строки ставили в ступор весь сервер при определенной нагрузке
Re: GC жрёт 100% CPU
От: MadHuman Россия  
Дата: 07.05.19 06:54
Оценка: 86 (4)
Здравствуйте, MadHuman, Вы писали:


MH>Как такое возможно?

Итоги расследования (для тех кому интересно что же было и когда такое бывает).
Оказалось что в хитром случае, при обработке одного из реквестов из-за определённого сочетания настроек происходило зацикливание в нашей логике. В этом цикле и генерился мусор.
После некоторого времени работы (нескольких минут) постепенно выжыралась вся доступная память, далее время работы GC росло и начинало занимать почти всё CPU.
Порулило (как и в большинстве таких случаев) снятие дампа (при помощи procdump с условием — высокий расход памяти процессом) и его анализ (каких объектов аномально много, кто их держит, в каком потоке созданы, разбор стэка потока).
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.