В многопользовательской системе я хочу измерять загрузку процессора каждым пользователем в секундах времени процессора. Для целей этого измерения я предполагаю, что если 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; }'должен показать нагрузку для {пользователя} в этот момент.