Чому 1 з 24 моїх процесорів прив’язаний до 100%?


12

У мене є система HP ProLiant DL380 G7, що використовує 2 6-ядерних процесора з увімкненою Hyper-Thading, для загальної кількості 24 логічних процесорів (як це бачило Windows).

Під час запуску нашого додатка загальне використання системного процесора добре, але одна з 24 CUP прив’язана до 100%: введіть тут опис зображення

Редагувати: це дані PerfMon для системного процесу за цей час та для процесора з високим рівнем використання: введіть тут опис зображення

Це нормально? Якщо ні, чи є спосіб визначити, які процеси використовують цей логічний процесор? Windows PerfMon, ResMon, диспетчер завдань та провідник процесів не допомогли, окрім того, щоб визначити, що CPU на 100%.


29
Я гадаю, що він використовується, тому що процес використовує його.
HopelessN00b

1
Ви знаєте, що ви можете навести курсор миші на графік і отримати підказку про те, який процес займає найбільше процесора на цьому процесорі ?!
Lieven Keersmaekers

Мені було б підозріло до дельти переривання 100k. Ви повинні опублікувати скріншот списку процесів Провідника процесів, де ми можемо побачити, що він говорить про такі речі, як Система, DPC, Переривання.
Гейб

@RyanRies; наш "додаток" складається з декількох сервісів .Net WCF, які також WebSphere MQ та деякого сторонніх програмного забезпечення для моніторингу.
Патрік Кафф

2
Переміщення процесу з одного процесора на інший порівняно з тим, щоб він був запланований на одному процесорі, порівняно дорого, тому якщо процес дійсно вимагає процесора, то ОС досить часто воліє не переміщувати його.
Майкл Хемптон

Відповіді:


11

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

Запуск 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, а не чітко встановлювати спорідненість у потоках ядра тощо.


IIRC, це цілком стандартна поведінка для ОС, щоб використовувати лише один центральний процесор для обробки апаратних перерв ...
Massimo

1
@Massimo Це могло статися зі старими операційними системами, але не більше. Кожен процесор отримує власну таблицю дескрипторів переривань, а кожен процесор має власну IRQL. Якщо один процесор застряг на високому IRQL з якихось причин (тобто він вже обслуговує переривання), він не може отримувати перерви того ж або нижчого рівня, і тому Windows або передасть переривання іншому процесору, або просто тримається за нього поки CPU не стане доступним. Навіть таймери (об'єкт, який раніше був відомим для роботи лише на CPU0), тепер мають алгоритм вибору процесора.
Ryan Ries

Але так, це може бути настільки просто, як запустити спадщину або погано написаний додаток, який погано афінізований, а згодом робить багато системних дзвінків. Зазвичай переривання потрібно починати і закінчувати на тому самому процесорі, з якого вони були викликані ... але, як правило, навіть однопотоковий додаток отримає "збалансований навантаження" серед ядер під час його запуску ... у цього, здається, є дивний спорідненість.
Райан Різ

@RyanRies; Я встановив інструментарій Windows Performance Toolkit і використав записувач продуктивності Windows; команда xperf вище продовжувала видавати помилки. Високий процесор виглядає так, що він походить від: Process - System; Модуль - ntoskrnl.exe; Нитка - Phase1Initialize; Функція - KeZeroPages. Це трапляється лише тоді, коли програма працює, тому я думаю (сподіваюсь) мені достатньо повернутись розробникам, але мене також цікавлять будь-які ідеї, які у вас можуть виникнути.
Патрік Кафф

23

Покажіть стовпець «Час процесора» на вкладці «Деталі» в «Диспетчері завдань» та шукайте процес із кількістю часу процесора, який постійно збільшується. Це ваш укладений процес. Він повинен постійно використовувати близько 4,17% процесора.


10

Здається, весь час в ядрі, може бути Переривання, їх може обробляти лише один процесор.


+1 - Це, звичайно, схоже на час ядра, чи не так.
Еван Андерсон

Це відображатиметься в процесі "Система"? Дані PerfMon, які ми зібрали під час пробного запуску, мають 100% ЦП для процесу "Система".
Патрік Кафф

Так, я думаю, що це потрапить у систему (якщо вона взагалі перерахована ...)
MichelZ

6
Чи не може це бути помилками драйвера чи несправним обладнанням, що взаємодіє з драйвером без відновлення помилок? Або, можливо, програмне забезпечення, що дзвонить у ядро, у щільному циклі.
Zan Lynx

1
@MichelZ, Користувальницький процес, що здійснює купу системних викликів (які б включали будь-який тип вводу-виводу), виглядав би так.
reirab

6

Шукайте процес із постійною витратою процесора ~ 4% (= 1/24 від загальної кількості доступних процесорів). Це має бути той, хто постійно займає один процесор.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.