Як вже зазначали інші, з цього знімка ми бачимо, що процесор, який так важко працює, весь свій час проводить у режимі ядра. (Червоний колір.)
Запуск Powershell як адміністратора, введіть:
Get-Process | Select Name, PrivilegedProcessorTime | `
Sort-Object PrivilegedProcessorTime -Descending
Процес у верхній частині списку - це процес, який зараз використовує найбільше час процесора в режимі ядра. Якщо цей процес не "Системний", то ви тільки що з'ясували, який процес в режимі користувача викликає це використання процесора. Якщо процес із найвищим привілейованим процесорним часом - це система, на яку я підозрюю, що це, то це трохи складніше.
Відкрийте Провідник процесів. За бажанням встановіть свій сервер символів. Переконайтеся, що ви бігаєте з повним підйомом UAC. Клацніть правою кнопкою миші «процес» системи та перейдіть до Властивості. Потім перейдіть на вкладку "Нитки". Сортування потоків за використанням процесора. Тут повинен бути потік, що викликає всю роботу цього режиму ядра. Якщо ви подивитеся на модуль, вказаний у розділі "Початкова адреса", він повинен дати вам зрозуміти, з чим пов'язана робота. Наприклад, це NDIS.sys, наприклад, це драйвер мережевого інтерфейсу. Якщо ви налаштуєте сервер символів, вам слід побачити назву функції в модулі (якщо модуль не є Microsoft), інакше ви просто побачите числове зміщення зі стартової адреси модуля.
Крім того, використовуйте Xperf з інструментарію Windows Performance Toolkit для переривання профілю, DPC тощо.
xperf -on PROC_THREAD+LOADER+DPC+INTERRUPT
і припиніть запис за допомогою xperf -d logfile.etl
Xperf замінює старий інструмент Kernrate, і він може представити вам надзвичайно детальні дані.
Коли центральний процесор працює в режимі ядра, він в основному виконує процедури переривання обслуговування. (ISR) Коли відбувається переривання, на цьому процесорі призупиняється робота в режимі користувача, і ЦП запускає зареєстрований в цьому перериванні ISR. Якщо ви виявите, що ваш процесор витрачає непомірну кількість часу на ці перерви, це, як правило, вказує на несправний драйвер пристрою, який потрібно оновити.
Що мене помиляє (не каламбур) щодо цього сценарію, це те, що він здається, ніби будь-яка нитка ядра, що робить це, здається, є спорідненою до цього одного ядра. Цікаво, чому диспетчер, здається, лише планує потік, щоб він працював на тому, здавалося б, довільному ядрі. Тож у мене виникає відчуття, що нам потрібно знайти того, хто написав цей драйвер пристрою, і показати їм, як робити потокові DPC, а не чітко встановлювати спорідненість у потоках ядра тощо.