Системная нагрузка в смысле UNIX (и, если я правильно помню) - это число процессов, которые могут быть запущены и которые на самом деле не работают на ЦП (усреднено за период времени). Такие утилиты, как top
, показывают эту загрузку, например, за последние 1, 5 и 15 минут.
Я не верю, что это возможно со стандартными классами Win32 WMI process . Поле состояния процесса (ExecutionState)
в объектах WMI Win32_Process
задокументировано как неиспользуемое.
Однако класс потоков предоставляет эту информацию (и, вероятно, это лучший показатель, поскольку современные операционные системы обычно планируют потоки, а не процессы). Класс Win32_Thread
имеет поле ExecutionState
, которое установлено в одно из:
- 0 Неизвестно
- 1 Другое
- 2 Готов
- 3 Бег
- 4 Заблокировано
- 5 Приостановлено Заблокировано
- 6 Приостановлено Готово
Если вы сделаете запрос этого класса и посчитаете число типа 2 (и, возможно, типа 6; я думаю, что в этом контексте означает «приостановлено»), это должно дать вам ваш снимок загрузки. Затем вам нужно будет усреднить их самостоятельно, если вы хотите получить средние значения.
Кроме того, в этом классе также есть ThreadState
:
- 0 Инициализировано (распознается микроядром).
- 1 Готов (готов к работе на следующем доступном процессоре).
- 2 Выполняется (выполняется).
- 3 Ожидание (собирается работать, только один поток может быть в этом состоянии одновременно).
- 4 Прекращено (завершено).
- 5 Ожидание (не готово к процессору, когда будет готово, оно будет перенесено).
- 6 Переход (ожидание ресурсов, отличных от процессора).
- 7 Неизвестно (состояние неизвестно).
чтобы вы могли посчитать их в состоянии 1 или 3.
Не спрашивайте меня почему есть два поля, показывающие схожую информацию или в чем разница. Я уже давно перестал догадываться о Microsoft с ее информацией о WMI, я просто должен убедить силы в том, что мой выбор жизнеспособен: -)
Только что завершив разработку клиента Windows для нашего собственного приложения мониторинга, я бы просто предложил сделать 1-секундные снимки и усреднить их за любой период времени, за который вам нужно отчитаться. VBScript и WMI кажутся удивительно устойчивыми даже при одном запросе в секунду - он не слишком сильно загружает процессор и, пока вы освобождаете все, что используете, вы можете работать в течение продолжительных периодов времени.
Итак, каждую секунду вы будете делать что-то вроде (в VBScript и из памяти, поскольку у меня нет готового доступа к коду отсюда):
set objWmi = GetObject("winmgmts:\\.\root\cimv2")
set threadList = objWmi.ExecQuery("select * from Win32_Thread",,48)
sysLoad = 0
for each objThread in threadList
if objThread.ThreadState = 1 or objThread.ThreadState = 3 then
sysLoad = sysLoad + 1
end if
next
' sysLoad now contains number of threads waiting for a CPU. '