Как контролировать использование ЦП ntoskrnl.exe! MiWalkPageTablesRecursively

832
Vijay

После публикации о том, как ядро ​​отслеживает высокую загрузку ЦП, я подумал, что отладил проблему, которая меня мучила, а именно 20-30% -ную согласованную загрузку ЦП процессом System. Смотрите мой предыдущий пост об этом.

Я настроил Windows Performance Analyzer и смог проследить процесс до этого: WPA Trace Log я думал, что это связано с угадыванием файла подкачки по именам функций, отключил мой файл подкачки и перезапустил, но вместо этого вместо окна появился файл подкачки и выкинул ошибка. Поэтому я создал небольшой файл подкачки размером около 100 - 2048 МБ.

Казалось, это решило проблему за несколько недель, но теперь оно снова здесь, хотя размер файла подкачки составляет всего 2 ГБ. Похоже, это происходит после того, как система некоторое время работала. Текущее время работы составляет 8 дней.

Если какой-нибудь эксперт по ядру может дать совет о том, что мне следует попробовать дальше, я был бы рад сделать это.

Однако Process Explorer показывает другой поток под образ системы. Я не знаю, как примирить эту разницу:

InitAnsiStringEx

Обозреватель процессов обычно показывает вышеупомянутое, хотя в других случаях он может показывать состояние фильтра отладки ... и т. Д.

enter image description here

(Это всегда ThreadID 56, я полагаю) Но несколько журналов трассировки всегда, кажется, показывают то, что мы видели выше как проблему.

РЕДАКТИРОВАТЬ

Добавлены изображения по запросу для оперативной памяти. Это после нового перезапуска, где проблема не существует.

RAM Usage Process Details working set

Настроенные пути символов в соответствии с рекомендациями блога для ускорения загрузки символов

Process Explorer

procexp symbols path

WPA

WPA symbols path

Размеры файлов папок кеша

symbols info

В системе найдено несколько версий dbghelp.dll. В настоящее время указывает на систему, но не знаю, на какую она должна указывать.

dbghelp.dll versions


ОБНОВИТЬ

Перейдя по ссылке для поиска процессов зомби, я обнаружил следующие данные (усеченные для удаления второстепенных записей)

374 total zombie processes. 334 zombies held by explorer.exe(1768) 298 zombies of Fences.exe 9 zombies of LogonUI.exe 7 zombies of chrome.exe 10 zombies held by ctfmon.exe(4568) 2 zombies of chrome.exe 7 zombies held by dopus.exe(27672) 3 zombies of AcroRd32.exe 2 zombies held by RuntimeBroker.exe(12184) 2 zombies of WWAHost.exe 1 zombie held by SkypeHost.exe(190152) 1 zombie of SkypeApp.exe 1 zombie held by SecurityHealthService.exe(4536) 1 zombie of MsMpEng.exe 1 zombie held by svchost.exe(1988) 1 zombie of userinit.exe 

Это означает, что причиной является FENCES.exe, поэтому я обновил эту программу и проверим ее позже. Также отключена синергия, чтобы убедиться, что причина не в этом.

Обновление 2

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

Это версия заборов

enter image description here

и список процессов зомби после нового перезапуска.

16 total zombie processes. 7 zombies held by explorer.exe(9484) 5 zombies of Fences.exe 1 zombie of GoogleUpdateCore.exe 1 zombie of DropboxUpdate.exe 1 zombie held by svchost.exe(1788) 1 zombie of userinit.exe 

Примечание

Не было бы здорово, если бы у нас был программный ИИ, который мог бы помочь со всеми этими вещами?

1
Вы не опубликовали свои спецификации HW и свою рабочую нагрузку. Я думаю, вам просто нужно установить больше оперативной памяти, чтобы Windows не урезал рабочие наборы magicandre1981 6 лет назад 0
@ magicandre1981 У меня 32 ГБ оперативной памяти. Я обновил пост с деталями, заданными ответом ниже Джейми Ханрахан Vijay 6 лет назад 0
@magicandre Windows _always_ запускает триммер рабочего набора. Это может на самом деле ничего не обрезать, в зависимости от давления ОЗУ - но он всегда смотрит, стоит ли это делать. Jamie Hanrahan 6 лет назад 0
ETL указывает на проблемы с памятью. Я вижу доступ к D: \ pagefile.sys. [ищите Zombie Proceses] (https://superuser.com/a/1326187/174557), потому что вы запускаете несколько synergys.exe с течением времени и, возможно, они не освобождают память. magicandre1981 6 лет назад 2
@ magicandre1981 Спасибо за обновление. Я обновил пост с найденными деталями и пытался узнать, что можно сделать, чтобы уничтожить зомби! Yaay Vijay 6 лет назад 0
ок, обнови / удали Фанты и посмотри что получится magicandre1981 6 лет назад 0
@ magicandre1981 Я полагаю, я вспомнил предыдущий вопрос, в котором была обнаружена синергия, которая оставила вокруг себя процессы зомби. Ото, ты имел в виду "Заборы" под Stardock? Если так, я запускаю это и не видел таких проблем. Jamie Hanrahan 6 лет назад 0
@JamieHanrahan Да, это заборы от Стардока. Я перестал его использовать и отключил заборы. Может быть, в процедуре отключения есть ошибка? но это старая версия 3.0.5 я верю. Я обновил его и буду тестировать и сообщать Vijay 6 лет назад 0
Новое количество ZombieProcesses намного лучше. Проблема теперь ушла? magicandre1981 6 лет назад 0
Количество по-прежнему неуклонно растет. Об этом сообщили в stardock. Мне придется удалить его и посмотреть Vijay 6 лет назад 0
Хорошо, теперь у меня 220 заборов с зомби, но загрузка процессора нормальная. Поэтому я подозреваю, что причиной была синергия, так как я это тоже отключил. Vijay 6 лет назад 0

1 ответ на вопрос

2
Jamie Hanrahan

Быстрый ответ: дайте этой рутине меньше работы. Что я думаю, означает либо использовать меньше виртуального адресного пространства за один раз, либо добавить больше оперативной памяти.

Детали: во-первых, процедура, которую вы видите, MiWalkPageTablesRecursivelyимеет непосредственное отношение не к файлу страницы, а к таблицам страниц . Таблицы страниц являются структурами в памяти (и присутствуют во всех системах Windows независимо от конфигурации файла подкачки). Каждый процесс имеет набор таблиц страниц, а также набор адресного пространства ОС («пространство ядра»).

Таблицы страниц состоят из записей таблицы страниц; есть один PTE для каждой страницы - 4K - определенного виртуального адресного пространства процесса. Под «определенным» я подразумеваю, что оно включает отображенное и частное зафиксированное адресное пространство процесса и регионы AWE, если таковые имеются; оно не включает зарезервированное или свободное адресное пространство - регионы, которые могут вызвать нарушение прав доступа, если вы попытаетесь их прочитать или записать.

(Между прочим: у вас не только будут таблицы страниц, даже если у вас нет файла подкачки. У вас также останутся страницы и ошибки страниц на диске и с диска, даже если у вас нет файла подкачки.)

Проблема здесь, вероятно, не присуща MiWalkPageTablesRecursively. Ведь эта функция (или эквивалент под другим именем) была частью Windows начиная с NT 3.1. Дело в том, что приходится много работать. Это, вероятно, означает, что его часто вызывают.

Подсказка, почему это так, видна в подпрограммах, ранее находящихся в стеке. (То есть ближе к верхней части экрана WPA.) Похоже, что вызывающий объект MiWalkPageTablesRecursivelyв этом сценарии MiWalkPageTables, который, в свою очередь, вызывается MiAgeWorkingSet, который, в свою очередь, вызывается MiTrimOrAgeWorkingSet, который, в свою очередь, вызывается MiProcessWorkingSets, который в свою очередь вызывается ... это так далеко, как нам нужно идти.

Каждый процесс в системе Windows имеет структуру, называемую «список рабочих наборов». Это список всех номеров физических страниц, которые были сбиты в ОЗУ в результате сбоев страниц процесса. Поток (поток «Balance Set Manager») пробуждается раз в секунду для очистки и обслуживания каждого рабочего набора процесса. Так MiProcessWorkingSetsитерирует по процессам, работая с рабочим набором каждого процесса по очереди.

Для каждого процесса в системе MiProcessWorkingSetsзвонки MiTrimOrAgeWorkingSet. Это имя подпрограммы относится к «обрезке» рабочего набора (что означает идентификацию давно неиспользуемых страниц и удаление их из процесса, чтобы освободить место в ОЗУ для других вещей), или «старению» рабочего набора, что означает увеличение «возраста» счетчик для каждой записи списка рабочих наборов, к которой не обращались с момента последнего сканирования, или обнуление счетчика, если оно было. (Название относится к задаче «старения», которая выполняется в бухгалтерском учете, обычно каждый месяц или каждый день.) Затем счетчик «возраста» используется функцией «обрезки» для идентификации наиболее неиспользуемых страниц.

Из того, что MiTrimOrAgeWorkingSetзаканчивается MiWalkPageTablesRecursively, мы можем сделать вывод, что они сканируют виртуальное адресное пространство, как определено в таблицах страниц, чтобы найти страницы, которые находятся в рабочем наборе. Теперь рассмотрим: время, необходимое MiTrimOrAgeWorkingSetдля обработки каждого процесса, будет примерно пропорционально размеру виртуального адресного пространства процесса. И общее время, необходимое для каждого прохождения, MiProcessWorkingSetsбудет примерно пропорционально количеству процессов.

Либо эта вещь имеет дело с очень большим количеством страниц в рабочем наборе одного процесса, либо она имеет дело с большим количеством процессов.

И ... с чего бы это быть таким занятым? Он не «обрезает» рабочие наборы до тех пор, пока они не состарятся, и количество, на которое «обрезает» рабочие наборы, зависит от нагрузки на ОЗУ, то есть от того, насколько мало у вас ОЗУ.

Ваша система не хватает оперативной памяти? Пожалуйста, опубликуйте снимки вкладки «Диспетчер задач» | Страница памяти плюс страница «Подробности», отсортированная по столбцу «Рабочий набор»; плюс вкладка Память монитора ресурсов, отсортированная по столбцу Hard Faults; и страницу использования счетчиков RAMmap.

Кроме того, пожалуйста, опубликуйте больше ваших трассировок WPA, показывая больше «глубины» вызовов. Или разместите файл .etl где-нибудь на сервисе обмена ссылками и дайте ссылку на него здесь. (Сначала застегните молнию - они сжимаются очень хорошо.)

В сторону: почему имена подпрограмм не совпадают между WPA и Process Explorer

Что касается имен подпрограмм, то реальным вопросом будет «почему имена подпрограмм, отображаемые в Process Explorer, просто неверны». Есть две причины для этого в вашем случае, и вы должны исправить обе из них.

Первая проблема заключается в том, что, похоже, у вас неправильно настроены символы для Process Explorer. Конфигурирование их для Windows Performance Analyzer недостаточно.

Верным признаком того, что у вас нет этого права, является то, что все или почти все потоки в процессе «Система» отображаются с именем модуля (нечто.sys или что-то.exe, обычно ntoskrnl.exe), за которым следует смещение, например, +0x245- как в вашей шапке экрана. Можно видеть несколько таких, но вы должны увидеть целую кучу ntoskrnl! рутинное имя с последующим без смещения.

Чтобы это исправить, см. Эту страницу в Руководстве по анализу производительности Windows . Вам нужно установить путь поиска символов в Process Explorer - вы можете использовать тот же путь к файлу символов, который вы установили для WPA, - и вам нужно указать ProcExp на DLL, которая поставляется с Windows Debugging Tools. Таким образом, вам нужно будет установить средства отладки - не то, что вы используете отладчик напрямую, а Process Explorer нужна эта DLL.

Вторая причина расхождения заключается в том, что даже после правильной настройки файлов символов для Process Explorer отображаемые имена подпрограмм не всегда совпадают с именами подпрограмм внутреннего уровня, определенных Performance Analyzer. Тем не менее, вы должны найти совпадение в имени процедуры в начале стека (отображается в верхней части дерева вызовов процедуры, как показано в WPA).

Например - в вашем случае первая интересная процедура KeBalanceSetManager. (Два предыдущих варианта одинаковы для каждого потока в системном процессе, но KeBalanceSetManagerэто процедура, которая является процедурой «верхнего уровня» для этого потока.) После того как символы настроены правильно, Process Explorer должен показать вам поток с этим как «Начальный адрес», как показано здесь:

here

Process Explorer не может показать вам, MiWalkPageTablesRecursivelyпотому что это около шести вызовов в стек из того, что записано как начальный адрес потока, и это даже не текущая внутренняя подпрограмма (то есть она не находится на вершине стека). Такая информация (даже если она легко доступна, а это не так) будет меняться слишком быстро, чтобы быть полезной на дисплее Process Explorer, поэтому она не пытается.

Примечание. Даже с правильными символами нередко можно найти несколько потоков в системном процессе, показывающих «Начальный адрес», например GemCCID.sys+0xd138, как вы увидите в моем примере. Рассматриваемый модуль (GemCCID.sys), очевидно, не является тем, для которого Microsoft предоставляет файлы символов, поэтому Process Explorer просто должен сказать, что «начальный адрес потока находится в 0xd138 байтах от начала кода в этом файле, и это все, что я знать об этом. "

Надеюсь это поможет! Пожалуйста, дайте мне знать, если у вас есть дополнительные вопросы.

Огромное спасибо за подробный ответ @jamiehanrahan Я обновил пост с деталями, которые вы искали. По вашему мнению, это еще один процесс, который виноват правильно? Я думаю, что это будет Google Chrome, так как это наиболее ресурсоемкое приложение, которое я запускаю с множеством открытых окон и вкладок. Как подключиться к анализу вызовов системных функций для этого? Vijay 6 лет назад 0
какие-либо предложения о том, что делать дальше? Думая о переходе на Ubuntu: P Vijay 6 лет назад 0
Можете ли вы поделиться .etl файлом? Jamie Hanrahan 6 лет назад 1
О - для настроек символов Process Explorer: если вы находитесь на 64-битной машине, для пути dbghelp.dll вы хотите `C: \ Program File (x86) \ Windows Kits \ 10 \ Debuggers \ x64 \ dbghelp.dll` , Для пути символов Process Explorer вы ** не ** хотите указать на ... \ NGenPdbs_Cache! Он содержит только кэшированные PDB из модулей, обеспечивающих поддержку кода dot-net, что совершенно не относится к коду режима ядра, выполняющемуся в системном процессе. Измените его на `srv * c: \ symbols * http: // msdl.microsoft.com / download / symbols`. (Прод.) Jamie Hanrahan 6 лет назад 1
(...) Вы можете использовать `srv * c: \ symcache * http: // msdl.microsoft.com / download / symbols`, если хотите. Просто знайте, что Process Explorer не знает о новом формате кэшированных символов (файлы .symcache), описанном в этом блоге. Однако два кэша могут сосуществовать, так что все работает. Не беспокойтесь о времени загрузки символов в Process Explorer; Кэш файловых символов старого типа на основе папок достаточно быстр для ProcExp, так как он имеет _far_ меньше символов для поиска, чем WPA. Jamie Hanrahan 6 лет назад 1
О, и если говорить об этом блоге - в конфигурации символов WPA _ignore_ совет отключить путь символов, который относится к серверу символов MS (вы отключили его в своем снимке экрана). Все, что вам нужно сделать, это убедиться, что он последний в списке. Таким образом, WPA всегда будет использовать локальные кэши перед выходом в Интернет и будет использовать новый быстрый symcache перед использованием старого кеша на основе папок. Jamie Hanrahan 6 лет назад 1
После добавления `srv * c: \ symcache * http: // msdl.microsoft.com / download / symbols` в обозреватель процессов теперь отображается` KeBalanceSetManager` в виде TID 56 и согласованное использование процессора около 7% после времени работы в течение 2 дней. , Vijay 6 лет назад 0
[Файл ETL] (http://www.mediafire.com/file/1f4sz17ra94bqc4/MGMT-001.09-20-2018.20-50-30.7z/file) пароль равен `test` Vijay 6 лет назад 0
Как видно из дерева вызовов на снимке экрана WPA, KeBalanceSetManager действительно является процедурой верхнего уровня этого потока (не считая двух над ним, которые одинаковы для каждого потока в этом процессе). Я должен буду посмотреть на ETL завтра. Jamie Hanrahan 6 лет назад 1
Как вы думаете, процесс Zombie объясняет все использование процессора, которое мы видим в KeBalanceSetManager? Vijay 6 лет назад 0
Зомби обрабатывает множественное число. Очень во множественном числе ... Это возможно. Я не верю, что KeBalanceSetManager имеет какой-либо способ проверить, является ли процесс, на который он смотрит, зомби или нет, поэтому все эти зомби просто дают ему больше работы. Вы все еще получаете зомби, которых обвиняют в Заборах, даже если вы отключили это? Может быть, вы должны просто попытаться удалить его. Jamie Hanrahan 6 лет назад 0