Диагностика причины 100% использования ЦП системным процессом

У меня есть серверное приложение для Windows, реализованное на C++ с использованием Win32 API, которое выполняет множество последовательных и TCP/IP-связей. По мере работы загрузка ЦП постепенно увеличивается, пока не достигнет 100%. Диспетчер задач указывает, что большая часть (> 75%) использования ЦП приходится на процесс «Система». Если я убью свой серверный процесс, то использование ЦП вернется к норме.

Существуют ли какие-либо «простые» способы точно определить, в чем проблема?

Я подозреваю, что соединения ввода-вывода открываются и никогда не закрываются, поэтому ОС тратит все больше и больше времени на обслуживание этих запросов, но я хотел бы убедиться, что это так, прежде чем пытаться решить проблему.


Обновление: поиграв с xperf, я обнаружил, что системный процесс проводит более половины своего времени в ntoskrnl.exe!KxWaitForSpinLockAndAcquire. Я ничего не знаю об этом, но название функции подсказывает мне, что может возникнуть проблема взаимоблокировки/конфликта.

Другие функции, которые система часто использует, включают NETIO.SYS!FilterMatchEnum, NETIO.SYS!MatchConditionOverlap, NETIO.SYS!IsFilterVisible и MpNWMon.sys!NetFlowUpendByCompletionHandle.


person Kristopher Johnson    schedule 27.07.2010    source источник


Ответы (5)


Я рекомендую ознакомиться с инструментами sysinternals, если вы еще этого не сделали.

Один инструмент, который мне очень нравится, — это инструмент Handle, который показывает вы все файлы, которые открыты в системе.

Другим, который кажется непосредственно применимым к вашему сценарию, является ProcDump, который позволяет вы можете сбрасывать информацию о процессе, когда данный процесс превышает x% использования ЦП.

person dcp    schedule 27.07.2010

Используйте обозреватель процессов, но откройте свой собственный процесс, а не системный. Системный процесс, скорее всего, просто отвечает на ваши запросы. Поскольку у вас нет кода для этого, вам будет трудно понять, что он делает.

для вашего собственного процесса:

  • Откройте вкладку производительности, которая показывает количество дескрипторов и т. д.,
  • Откройте вкладку tcp-ip, которая показывает соединения.
  • Проверьте также панель в нижней половине обозревателя процессов для вашего процесса, показывающего события, файлы и т. д.

Надеюсь, вы можете увидеть, какой ресурс используется одним из них.

Также стоит попробовать Portmon, чтобы убедиться, что активность соответствует ожиданиям.

person idij    schedule 29.07.2010

Я предлагаю использовать sysinternal Process Monitor и Portmon, который должен отображать состояние TCP-соединений и активность последовательного порта.

Если вы видите корреляцию между этим и загрузкой ЦП, то у вас хорошее преимущество.

person orip    schedule 29.07.2010

Дамп пользователя. Получите пользовательский дамп вашего процесса, когда он находится в этой ситуации. Затем загрузите дамп в winDbg и посмотрите, что он делает. Одна действительно полезная команда — !runaway. Это скажет вам, какие потоки используют больше всего ЦП. Затем посмотрите на эти потоки, чтобы увидеть, что они делают.

person Mike    schedule 01.08.2010

Какой у вас счетчик дескрипторов? Если он растет, это указывает на то, что что-то не закрыто.

person Will Dean    schedule 29.07.2010
comment
Спасибо, но количество дескрипторов остается постоянным. - person Kristopher Johnson; 30.07.2010