Мониторинг подпроцесса / можно ли получить TotalProcessorTime для группы процессов? - PullRequest
0 голосов
/ 14 мая 2009

Есть ли способ получить Process.TotalProcessorTime , который отражает процесс PLUS любых процессов, которые он породил?

В качестве альтернативы, как я могу убедиться, что процесс (или его потомки) все еще "активно" работает?


Мое приложение порождает внешний процесс и ожидает его завершения. Для данных выборки требуется 5-20 минут ; Я не догадываюсь о разумном максимальном таймауте. Поэтому мое приложение проверяет значение Process.TotalProcessorTime для другого процесса через определенные промежутки времени, чтобы убедиться, что оно продолжает расти.

Это прекрасно работает, но я обнаружил, что процесс - это просто «оболочка», которая порождает подпроцесс, который, в свою очередь, порождает несколько других подпроцессов, которые занимают все время процессора.

И я обнаружил, что TotalProcessorTime возвращает лишь небольшую долю секунды после нескольких минут загрузки процессора на 100%.

Ответы [ 2 ]

0 голосов
/ 13 октября 2009

Я не реализовал это, но выяснил, как это может работать. Это утомительно, но не так уж сложно.

  1. Создать фоновый поток, который каждые несколько секунд будет:

    • Построить дерево процессов (см. этот ответ для упрощенной версии кода),
    • Завершить (поток монитора), если процесс завершился.
    • Поддерживать хэш накопленного использования ЦП с помощью PID,
    • Сохранение суммы всех значений по всем процессам,
    • Сохранение разницы суммы от последнего запуска потока.
  2. Это должно позволить вызывающему коду легко проверить, что процесс (дерево) не зависает ( процессы, связанные с вводом / выводом, могут иметь проблемы здесь, но это не относится на мой случай ).

Ничего из этого не кажется трудным, за исключением возможного исключения использования процессором ЦП процесса, не порожденного (напрямую) потоком мониторинга.

Я обновлю этот ответ, если / когда я реализую код, но это может занять много времени.

0 голосов
/ 15 мая 2009

Вы можете использовать счетчик производительности для извлечения родительского процесса следующим образом:

PerformanceCounter pc = new PerformanceCounter("Process", 
    "Creating Process Id", " windbg");
Process p = Process.GetProcessById((int)pc.RawValue);

Имея эту информацию, вы можете отслеживать процессы в системе, поддерживать структуру всего дерева процессов и вычислять TotalProcessorTime для дерева. Надеюсь, это поможет

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...