В многопользовательской системе я хочу измерять загрузку процессора каждым пользователем в секундах времени процессора. Для целей этого измерения я предполагаю, что если 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; }'
должен показать нагрузку для {пользователя} в этот момент.Ответы:
Похоже, вам нужен процесс учета.
http://www.faqs.org/docs/Linux-mini/Process-Accounting.html
В Ubuntu инструменты учета процессов находятся в
acct
пакетеЧтобы получить отчет для каждого пользователя, запустите
источник
/proc/[pid]/stat
.sa
учтены (.ps.gz) . И у меня также есть хороший способ «оценить» эти длительные процессы, прежде чем в конечном итоге получить точные значения для них. Так что, в конце концов, мы будем его использовать, и я более чем рад предоставить награду за ваш ответ. Огромное спасибо!Это даст строку для каждого пользователя, показывающую имя пользователя и его общее время процессора:
источник
Один из наиболее очевидных ответов - просто расширить то, что вы сейчас делаете.
Я сталкивался с этим процессом мониторинга для использования сценариев bash и mysql для отслеживания времени процессора у пользователей, но он охватывал гораздо больший промежуток времени, чем вы говорили.
Надеюсь, что это может дать вам больше идей о направлении, в котором вы собираетесь двигаться.
http://www.dba-oracle.com/t_oracle_unix_linux_vmstat_capture.htm
источник
Это также будет обрабатывать процессы, которые выполнялись в течение нескольких дней. Не знаю, как расширяться в течение недель / месяцев / лет.
источник