Как рассчитать использование процессора многопроцессорным приложением в Linux - PullRequest
5 голосов
/ 11 января 2012

Я пытаюсь создать программу на C / C ++, которая будет вести себя как топ-команда в Linux.Я провел некоторые исследования и уже знал, как подсчитать загрузку ЦП процесса.Мы можем получить использование процессора, вычислив stime + utime из / proc / [PID] / stat в текущее время и через несколько секунд.Затем вычислите различия между временем и временем и разделите результат на разницу времени безотказной работы, после чего мы получим процент использования ЦП.Это будет так просто на одном процессе / многопоточном процессе.

Проблема в случае, подобном httpd, где он работает как многопроцессорный.Когда веб-сервер занят, httpd разветвляет дочерние процессы для обслуживания группы запросов.Затем я подсчитываю общее количество процессов, скажем, 500. Я хочу рассчитать использование ЦП этих процессов, но суммировать их, чтобы я увидел только 1 httpd Использование ЦП.Но если я сделаю алгоритм, как я упоминал выше, когда число процессов уменьшится до <500 через несколько секунд, я получу отрицательные значения, так как вычисление будет таким (например, я выбираю случайное число, просто чтобыдать вам краткое описание): </p>

Uptime: 155123, No of processes : 500, Stime + Utime total of 500 processes : 3887481923874
Uptime: 155545, No of processes : 390, Stime + Utime total of 390 processes : 2887123343874

Если вы посмотрите на пример выше, дельта Stime + Utime приведет к отрицательному значению, так как число процессов уменьшается, и даст меньшее значение через несколько миллисекунд,Я просто хочу знать, есть ли другой способ рассчитать такой процесс поведения, как это?Спасибо.

Ответы [ 2 ]

1 голос
/ 11 января 2012

Я предлагаю хранить данные для каждого процесса отдельно.
Если у вас есть новый образец, каждый процесс может быть отнесен к одной из трех категорий:
1. Существовали как до, так и после - вычитайте старое из нового.
2. Существует сейчас, но не раньше - просто примите новые значения.
3. Существовал раньше, но не сейчас - игнорируйте его.Вам здесь чего-то не хватает, потому что он мог использовать процессор в течение 90% периода выборки, но я надеюсь, что вам не нужна идеальная точность.

Это позволяет вам хранить больше данных между выборками,и требует использования более сложной структуры данных, но это должно дать разумные результаты.

0 голосов
/ 11 января 2012

Если вам нужен точный результат или если время жизни процессов короткое, вы должны прочитать время использования процесса, когда он завершен.

Существует как минимум два пути:

1) Используйте функции wait4(2) или wait3(2) для ожидания завершения процесса. Эти функции будут возвращать время и состояние процесса.

2) Сохранять завершенные процессы в состоянии зомби до считывания /prox/<pid>/stat.

...