В многопользовательской системе я хочу измерять загрузку процессора каждым пользователем в секундах времени процессора. Для целей этого измерения я предполагаю, что если PID принадлежит пользователю, этот пользователь вызывает процессорное время - то есть я игнорирую демоны и ядро.
В настоящее время я делаю это каждые пять секунд:
- Получить каждого пользователя и PID, через которые он работает
ps aux
- Для каждого PID получите
x
сумму utime, cutime, stime и cstime из/proc/[pid]/stat
- рассчитать
t = x / interval
(интервал не всегда точно 5 секунд при высокой нагрузке)
Если я запускаю это, я получаю разумно выглядящие ценности. Например: пользователь в этой системе вращался в python ( while True: pass
), и система показала около 750 миллисекунд процессорного времени в секунду. Когда система немного зависла, она сообщила 1600 мс за один 1-секундный инверс. Это кажется правильным, но я понимаю, что эти ценности могут быть обманчивы, особенно если учесть, что я их не очень понимаю.
Итак, мой вопрос заключается в следующем:
Как правильно и правильно измерить нагрузку на процессор для каждого пользователя?
Метод должен быть достаточно точным. В этой системе может быть много сотен пользователей, поэтому извлечение процентов из ps aux
будет недостаточно точным, особенно для недолговечных потоков, которые порождают многие части программного обеспечения.
Хотя это может быть сложно, я точно знаю, что это возможно. Это было моей отправной точкой:
Ядро отслеживает время создания процесса, а также время процессора, которое оно потребляет в течение своей жизни. При каждом такте ядра ядро обновляет количество времени, которое текущий процесс провел в системе и в пользовательском режиме. - (из проекта документации Linux )
Значение, которое я получаю, - это количество секунд (или перебоев), которое пользователь потратил на процессор, а не процент загрузки системы или использования процессора.
Важно, чтобы мы измеряли процессорное время, пока процессы еще работают. Некоторые процессы будут длиться только полсекунды, некоторые - много месяцев - и нам нужно отловить оба вида, чтобы мы могли с высокой степенью детализации учитывать время ЦП пользователей.
top
можете сделать пакетный режим? top -b -n 1 -u {user} | awk 'NR>7 { sum += $9; } END { print sum; }'
должен показать нагрузку для {пользователя} в этот момент.