Определение «загрузки системы» - PullRequest
3 голосов
/ 06 июня 2009

Кто-нибудь знает элегантный способ определения «загрузки системы», предпочтительно с помощью счетчиков производительности Windows? В данном случае я имею в виду «Системная нагрузка» в классическом (UNIX) смысле этого термина, а не в общепринятом проценте использования ЦП.

Основываясь на моем прочтении… «Системная нагрузка» обычно представляется как число с плавающей запятой, определяющее количество процессов в работоспособном состоянии (т.е. не включая количество процессов, которые в настоящее время заблокированы по той или иной причине), которые могут быть запущены в данный момент. Википедия дает хорошее объяснение здесь - http://en.wikipedia.org/wiki/Load_(computing).

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

1 Ответ

4 голосов
/ 06 июня 2009

Системная нагрузка в смысле 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. '
...