У меня есть серверное приложение для Windows, реализованное на C++ с использованием Win32 API, которое выполняет множество последовательных и TCP/IP-связей. По мере работы загрузка ЦП постепенно увеличивается, пока не достигнет 100%. Диспетчер задач указывает, что большая часть (> 75%) использования ЦП приходится на процесс «Система». Если я убью свой серверный процесс, то использование ЦП вернется к норме.
Существуют ли какие-либо «простые» способы точно определить, в чем проблема?
Я подозреваю, что соединения ввода-вывода открываются и никогда не закрываются, поэтому ОС тратит все больше и больше времени на обслуживание этих запросов, но я хотел бы убедиться, что это так, прежде чем пытаться решить проблему.
Обновление: поиграв с xperf
, я обнаружил, что системный процесс проводит более половины своего времени в ntoskrnl.exe!KxWaitForSpinLockAndAcquire
. Я ничего не знаю об этом, но название функции подсказывает мне, что может возникнуть проблема взаимоблокировки/конфликта.
Другие функции, которые система часто использует, включают NETIO.SYS!FilterMatchEnum
, NETIO.SYS!MatchConditionOverlap
, NETIO.SYS!IsFilterVisible
и MpNWMon.sys!NetFlowUpendByCompletionHandle
.