.NET 4.0 Выполнение процесса приостанавливается на несколько секунд, в соответствии с Full GC, вызванным активностью файла подкачки? - PullRequest
3 голосов
/ 28 февраля 2012

У меня есть несколько основных серверов Windows 2008 R2 24, которые запускают один и тот же процесс, но каждый экземпляр процесса имеет свой набор данных.Обычно на каждом сервере выполняется 2-4 экземпляра процесса.Процессы скомпилированы для x64, имеют графический интерфейс и используют GC рабочей станции.

Каждую секунду процесс выводит счетчики GC в файл журнала на локальном диске.Журнал используется и для многих других вещей.Время от времени я обнаруживаю, что один из этих процессов приостанавливает выполнение на 5 и более секунд.Я вижу, что ничего не записывается в журнал за этот промежуток времени.Каждый раз, когда это происходит, число GC Gen2 увеличивается на 1.

Это редкое событие.Это может происходить, может быть, один раз каждые 10000 генераторов GC2 во всех процессах.

На каждой машине более чем достаточно ОЗУ для хранения всех процессов в ОЗУ.

Сегодня утром у меня была 9-секундная пауза в одном изпроцессы и на этот раз я захватил счетчики производительности для затронутого процесса и всей машины.Ни один из других процессов, запущенных в то время, не был затронут.Анализ счетчиков производительности показывает следующее:

Сравнение после паузы с перед паузой:

  • Виртуальные байты, Байты файла подкачки, Виртуальные байты, Рабочий набор и Рабочий набор-Приватныйдля процесса упал примерно на столько же - 1Гб.Чтобы дать представление о размере процесса, число приватных байтов сократилось с 3,1 ГБ до 2,1 ГБ.
  • Количество дескрипторов процесса уменьшилось с 8835 до 8705
  • Доступно байт для всей машиныувеличилось примерно на 1 Гбайт
  • Неисправности страниц / сек.
  • Загрузка ЦП была стабильной во время паузы

Может ли кто-нибудь подтвердить, что это действие можно отнести кзамена?Учитывая, что на машинах более чем достаточно оперативной памяти, есть ли какие-либо предложения по исправлению этих пауз?

Обновление № 1 (05.03.2012):

Пережил 6,5-секундную паузу в одном изпроцессы сегодня.Счетчики производительности памяти .NET Clr показывают, что размер LOH не изменился, но размер кучи Gen 2, а также размер всех куч и общее количество принятых байтов сократились на 700 Мб.Всего зарезервированных байтов уменьшено на 250 Мб.Похоже, что в этом конкретном GC было исправлено много мусора в Gen2.

Обновление № 2 (3/6/2012):

Сегодня в одном из процессов произошла 7-секундная пауза,Отброшены следующие значения: размер кучи поколения 2 (память .NET CLR) на 900 МБ Num байт во всех кучах (память .NET CLR) на 900 МБ Num Total Commited Bytes (.NET CLR Memory) на 800 МБ Num всего зарезервированных байтов (.NET CLR Memory) на 540 МБ виртуальных байтов (процесс) на 550 МБ рабочего набора (процесс) на 800 МБ рабочего набора - частный (процесс) Байты файла страницы (процесс) на 800 МБ частные байты (процесс) на 800 МБ

LOH остался прежним

Ответы [ 2 ]

3 голосов
/ 28 февраля 2012

Похоже, что поведение вашего приложения таково, что многие сегменты в куче больших объектов могут стать «мертвыми» в одном и том же цикле GC 2 (см. эту ссылку в msdn ). Когда сегмент в LOH не работает после GC 2, он возвращается в ОС, что может быть дорогостоящим, если вы возвращаете множество из них одновременно.

Ваше приложение может находиться за пределами конверта, для которого настроены режимы CLR GC. Если ваше приложение неоднократно выделяет большие объекты, такие как большие массивы, вы можете увидеть, получаете ли вы более предсказуемое поведение GC, объединяя и повторно используя их самостоятельно, а не полагаясь на GC.

2 голосов
/ 26 апреля 2012

Похоже, что добросовестный Gen2 GC занимает пару секунд на процесс размером в несколько гигов.

Так почему некоторые GC Gen2 занимают 5 секунд, а другие почти не занимают время?Поскольку у меня включен Concurrent / Background Gc, и кажется, что когда Concurrent GC завершает работу, счетчик GC Gen2 увеличивается.Я думаю, что это вводит в заблуждение.

При отключенном параллельном GC счетчики G2 Gen2 существенно падают, и каждый GC Gen2 занимает несколько секунд.

...