На одном их компьютеров с только что установленной Windows 10 пользователь стал жаловаться на постоянные зависания и медленную работу ОС. В диспетчере устройств видно, что более 50% ресурсов процессора используется процесс System ( ntoskrnl.exe ). В этой статье я постараюсь описать основные методики диагностики высокой загрузки CPU различными процессами и методы выявления проблемного компонента Windows.
Ситуация, когда процесс System потребляет более половины процессорных ресурсов системы — это не нормально. Сам по себе файл Ntoskrnl.exe представляет собой исполняемый файл ядра ОС. Это базовый процесс системы. В рамках ядра ОС выполняется запуск системных драйверов устройств, которые скорее всего и являются источником проблемы (далеко не все драйверы соответствующим образом тестируются разработчиками оборудования).
Как правило, проблема утечки в коде драйверов и высокая нагрузка на процессор, память или диск возникает после установки нового оборудования, установки новой версии драйвера (в том числе при автоматическом обновлении драйверов, которое можно отключить ) или после апгрейда Windows.
Чтобы понять, какой конкретно драйвер или модуль вызывает высокую загрузку процессора можно воспользоваться бесплатной утилитой Process Explorer . Скачайте и запустите ее с правами администратора.
В списке запушенных процессов найдите процесс System , щелкните по нему ПКМ и откройте его свойства Properties .
Перейдите на вкладку Threads . Отсортируйте список модулей, загруженных ядром по степени использования процессора (столбец CPU). В строке Start Address указано имя функции или драйвера, вызывающего высокую загрузку (скриншот не с проблемной системы).
Также, чтобы выявить драйвер, который вызывает высокую загрузку CPU, можно воспользоваться бесплатной утилитой Microsoft — kernrate.exe (Kernrate Viewer). Утилита входит в состав WDK (Windows Device Kit). После установки WDK, найти утилиту можно в каталоге …ToolsOtheramd64.
Запустите утилиту kernrate.exe без аргументов и подождите некоторое время, пока идет сбор данных (10-15 минут), после чего прервите работу утилиты сочетанием клавиш Ctrl-C : Посмотрите на список модулей в секции Result for Kernel Mode .
Как вы видите, в нашем примере высокую нагрузку на CPU вызывает модуль b57nd60x . С помощью Google или утилиты sigcheck (смотри пример ) можно определить, что проблему вызывает драйвер сетевой карты Broadcom NetXtream Gigabit Ethernet NDIS6.0 Driver.
Кроме того, проанализировать использование CPU при загрузки системы можно с помощью Windows Performance Toolkit (WPT). Нужно установить компонент и запустить сбор данных с помощью графической консоли Windows Perfomance Recorder (First level triangle + CPU usage -> Start)
Либо так:
xperf -on latency -stackwalk profile -buffersize 1024 -MaxFile 256 -FileMode Circular && timeout -1 && xperf -d cpuusage.etl
Полученный файл нужно сохранить и открыть в WPA. Разверните стек процесса System. В этом примере видно, что высокую нагрузку на процессор вызывает драйвер athrx.sys (Wi-Fi адаптер Atheros Wireless Network Adapter).
Итак, проблемный драйвер обнаружен. Что делать дальше?
Для решения проблемы нужно попробовать установить более новую (или старую) версию драйвера или же совсем отключить оборудование, если проблема наблюдается со всеми версиями драйвера. Обновленный драйвер можно дополнительно проверить стресс-тестом с помощью Driver Verifier .