Почему 1 из моих 24 процессоров привязан на 100%?

12

У меня есть система HP ProLiant DL380 G7, использующая 2 6-ядерных ЦП с включенной гиперпоточностью, всего 24 логических ЦП (как видно из Windows).

При запуске нашего приложения общая загрузка ЦП системы хорошая, но один из 24 CUP привязан к 100%: введите описание изображения здесь

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

Это нормально? Если нет, есть ли способ определить, какой процесс (ы) используют этот логический процессор? Windows PerfMon, ResMon, диспетчер задач и Process Explorer не помогли, кроме определения того, что загрузка процессора составляет 100%.

Патрик Кафф
источник
29
Я думаю, что он используется, потому что процесс использует его.
HopelessN00b
1
Вы знаете, что можете навести курсор на график и получить подсказку о том, какой процесс занимает больше всего процессора на этом процессоре ?!
Ливен Керсмакерс
Я бы с подозрением отнесся к перебоям прерываний в 100 тысяч. Вам следует опубликовать скриншот списка процессов в Process Explorer, где мы увидим, что он говорит о таких вещах, как система, DPC, прерывания.
Гейб
@RyanRies; наше «приложение» состоит из нескольких .Net WCF-сервисов, а также WebSphere MQ и некоторого стороннего программного обеспечения для мониторинга.
Патрик Кафф
2
Перемещение процесса с одного процессора на другой обходится относительно дорого, по сравнению с тем, чтобы планировать его на одном и том же процессоре, поэтому, если процесс действительно требует процессора, ОС часто предпочитает не перемещать его.
Майкл Хэмптон

Ответы:

11

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

Запустив Powershell от имени администратора, введите:

Get-Process | Select Name, PrivilegedProcessorTime | `
Sort-Object PrivilegedProcessorTime -Descending

Процесс в верхней части списка - это процесс, который в настоящее время использует больше всего процессорного времени в режиме ядра. Если этот процесс не является «Системным», то вы только что выяснили, какой процесс пользовательского режима вызывает использование этого ЦП. Если процесс с наивысшим временем привилегированного процессора - это система, что, как я подозреваю, так и происходит, то это немного сложнее.

Откройте Process Explorer. При желании настройте свой сервер символов. Убедитесь, что вы работаете с полным уровнем UAC. Щелкните правой кнопкой мыши «Процесс» системы и перейдите в Свойства. Затем перейдите на вкладку Темы. Сортировка потоков по загрузке процессора. Поток, который вызывает всю эту работу в режиме ядра, должен быть здесь. Если вы посмотрите на модуль, указанный в поле «Начальный адрес», он должен дать вам представление о том, с чем связана работа. Например, если это NDIS.sys, это драйвер сетевого интерфейса. Если вы настроили сервер символов, вы должны увидеть имя функции в модуле (если модуль не является Microsoft), иначе вы просто увидите числовое смещение от начального адреса модуля.

В качестве альтернативы можно использовать Xperf из Windows Performance Toolkit для профилирования прерываний, DPC и т. Д.

xperf -on PROC_THREAD+LOADER+DPC+INTERRUPT

и прекратить запись с xperf -d logfile.etl

Xperf заменяет старый инструмент Kernrate и может предоставить вам очень подробные данные.

Когда процессор выполняет работу в режиме ядра, он в основном выполняет процедуры обработки прерываний. (ISR) Когда происходит прерывание, работа в пользовательском режиме приостанавливается на этом процессоре, и CPU запускает ISR, зарегистрированный для этого прерывания. Если ваш процессор тратит слишком много времени на эти прерывания, это обычно указывает на неисправный драйвер устройства, который необходимо обновить.

Что меня беспокоит (без каламбура) в этом сценарии, так это то, что кажется, что какой-то поток ядра, который делает это, кажется, привязан к этому ядру. Интересно, почему диспетчер, кажется, только планирует поток для запуска на этом, казалось бы, произвольном ядре. Поэтому у меня есть ощущение, что нам нужно найти того, кто написал этот драйвер устройства, и показать им, как делать многопоточные ЦОД, а не явно устанавливать привязку к потокам ядра и т. Д.

Райан Райс
источник
IIRC, для ОС достаточно стандартное поведение - использовать только один процессор для обработки аппаратных прерываний ...
Massimo
1
@Massimo Это могло быть в случае со старыми операционными системами, но не больше. Каждый процессор получает свою собственную таблицу дескрипторов прерываний, и каждый процессор имеет свой собственный IRQL. Если по какой-то причине один процессор застрял на высоком уровне IRQL (то есть уже обслуживает прерывание), он не может получать прерывания того же или более низкого уровня, и поэтому Windows либо передает прерывание другому процессору, либо просто удерживает его пока процессор не станет доступным. Даже таймеры (объект, ранее известный тем, что он работает только на CPU0) теперь имеют алгоритм выбора процессора.
Райан Райс
Но да, это может быть так же просто, как запустить устаревшее или плохо написанное приложение, которое плохо аффинитизируется и впоследствии вызывает много системных вызовов. Прерывания, как правило, должны начинаться и заканчиваться на том же процессоре, с которого они были вызваны ... но обычно даже однопоточное приложение получало бы "балансировку нагрузки" между ядрами во время работы ... это кажется странным сродства.
Райан Райс
@RyanRies; Я установил Windows Performance Toolkit в системе и использовал Windows Performance Recorder; Команда xperf выше продолжала давать ошибки. Высокая загрузка ЦП выглядит так, как будто она исходит из: Процесс - Система; Модуль - ntoskrnl.exe; Thread - Phase1Initialize; Функция - KeZeroPages. Это происходит только во время работы приложения, поэтому я думаю (надеюсь), что у меня достаточно, чтобы вернуться к разработчикам, но меня также интересуют любые ваши идеи.
Патрик Кафф
23

Отобразите столбец «Время ЦП» на вкладке «Сведения» в «Диспетчере задач» и найдите процесс с постоянно увеличивающимся счетчиком времени ЦП. Это ваш заклиненный процесс. Он должен использовать около 4,17% ЦП постоянно.

Эван Андерсон
источник
10

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

MichelZ
источник
+1 - это действительно похоже на время ядра, не так ли?
Эван Андерсон
Появится ли это в процессе «Система»? Данные PerfMon, которые мы собрали во время тестового прогона, имеют 100% ЦП для процесса «Система».
Патрик Кафф
Да, я думаю, что это подпадает под систему (если она вообще есть в списке ...)
MichelZ
6
Не может ли это быть также ошибкой драйвера или плохим оборудованием, взаимодействующим с драйвером без восстановления после ошибки? Или, может быть, программное обеспечение вызывает ядро ​​в тесном цикле.
Zan Lynx
1
@MichelZ, пользовательский процесс, выполняющий несколько системных вызовов (которые будут включать в себя любые виды ввода / вывода), будет выглядеть так.
Рейраб
6

Ищите процесс с постоянной загрузкой ЦП ~ 4% (= 1/24 от общего доступного ЦП). Это должен быть тот, который постоянно занимает один процессор.

Massimo
источник