В многопользовательской системе я хочу измерить использование ЦП каждого пользователя в секундах процессорного времени. В целях этого измерения я предполагаю, что, если PID принадлежит пользователю, этот пользователь вызывает процессорное время - который является, я игнорирую демонов и ядро.
В настоящее время я делаю это каждые пять секунд:
ps aux
x
, сумма utime, cutime, stime и cstime от /proc/[pid]/stat
t = x / interval
(интервал является не всегда точно 5 секундами, когда существует высокая загрузка),Если я выполняю это, я получаю разумно выглядящие значения. Например: пользователь в этой системе вращался в Python (while True: pass
), и система проводила экскурсию приблизительно 750 миллисекундам процессорного времени в секунду. Когда система зависла некоторое время, она сообщила о 1 600 мс для одного 1 второго inverval. Который кажется о праве, но я undestand, что эти значения могут быть deceiptful, особенно учитывая, я действительно не понимаю их.
Таким образом, мой вопрос - это:
Что такое ярмарка и корректный способ измерить загрузку ЦП на основе в расчете на пользователя?
Метод должен быть довольно точным. Могло бы быть много сотен пользователей в этой системе, таким образом извлекая проценты от ps aux
не будет достаточно точно, специально для недолгих потоков, которые многим частям программного обеспечения нравится порождать.
В то время как это могло бы быть сложно, я абсолютно знаю, что это возможно. Это было моей начальной точкой:
Ядро отслеживает время создания процессов, а также процессорное время, которое оно использует в течение его времени жизни. Каждый такт системных часов, ядро обновляет количество времени в миге, который текущий процесс потратил в системе и в непривилегированном режиме. — (из Проекта Документации Linux)
Значение, которое я после, является суммой секунд (или миг), который имеет пользователь, тратят на ЦП, не процент использования CPU или системной нагрузки.
Важно, чтобы мы измерили процессорное время, в то время как процессы все еще работают. Некоторые процессы будут только длиться в течение половины секунды, некоторые продержатся в течение многих месяцев - и мы должны поймать оба вида, так, чтобы мы могли считать в течение процессорного времени пользователей с мелкоячеистостью.
Один из наиболее очевидных ответов - просто расширить то, что вы сейчас делаете.
Я сталкивался с этим процессом наблюдения за использованием сценариев bash и mysql для отслеживания времени процессора пользователями, но он охватывал гораздо больший период времени, чем вы говорили.
Надеюсь, это даст вам больше идей о том, в каком направлении вы собираетесь двигаться.
http://www.dba-oracle.com/t_oracle_unix_linux_vmstat_capture.htm
Это даст строку для каждого пользователя, показывающую имя пользователя и его общее время процессора:
ps -w -e --no-header -o uid,user \
| sort -u \
| while read uid user; do
echo -e "$user\t"$(
ps --no-headers -u $uid --cumulative -o time \
| sed -e s/:/*3600+/ -e s/:/*60+/ \
| paste -sd+ \
| bc
);
done
Похоже, вам нужен учет процессов.
http://www.faqs.org/docs/Linux-mini/Process-Accounting.html
В Ubuntu инструменты учета процессов находятся в acct
пакет
Чтобы получить отчет для каждого пользователя, запустите
sa -m
Это также будет обрабатывать процессы, которые выполнялись в течение нескольких дней. Не знаю, как расширяться в течение недель / месяцев / лет.
ps -w -e --no-header -o uid,user \
| sort -u \
| while read uid user; do
echo -e "$user\t"$(
ps --no-headers -u $uid --cumulative -o time \
| sed -e s/-/*86400+/ -e s/:/*3600+/ -e s/:/*60+/
| paste -sd+ \
| bc
);
done