Диагностика причины 100% загрузки ЦП по «системному» процессу - PullRequest
4 голосов
/ 27 июля 2010

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

Есть ли "простые" способы точно диагностировать, в чем проблема?

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


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

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

Ответы [ 5 ]

3 голосов
/ 27 июля 2010

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

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

Еще один пример, который напрямую применим к вашему сценарию, - это ProcDump , который позволяет вывести информацию о процессе, когда данный процесс превышает x% загрузки ЦП.

2 голосов
/ 30 июля 2010

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

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

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

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

1 голос
/ 01 августа 2010

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

1 голос
/ 30 июля 2010

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

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

0 голосов
/ 30 июля 2010

Каков ваш счетчик - если он растет, это будет указывать на то, что что-то не закрывается.

...