Високе завантаження CPU процесом System (Ntoskrnl.exe) в Windows

На одному їх комп'ютерів з тільки що встановленою 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, знайти утиліту можна в каталозі ... \ Tools \ Other \ amd64.

запустіть утиліту 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 тисячі двадцять чотири -MaxFile 256 -FileMode Circular && timeout -1 && xperf -d cpuusage.etl

Порада. Цей спосіб зручно використовувати, якщо після завантаження система геть зависає і працювати в ній просто неможливо. Швидше за все вам також буде корисна стаття з методикою діагностики довгої завантаження Windows.
Отриманий файл потрібно зберегти і відкрити в WPA. Розгорніть стек процесу System. У цьому прикладі видно, що високе навантаження на процесор викликає драйвер athrx.sys (Wi-Fi адаптер Atheros Wireless Network Adapter).


Отже, проблемний драйвер виявлений. Що робити далі?

Для вирішення проблеми потрібно спробувати встановити новішу (або стару) версію драйвера або ж зовсім відключити обладнання, якщо проблема спостерігається з усіма версіями драйвера. Оновлений драйвер можна додатково перевірити стрес-тестом за допомогою Driver Verifier.