Что самый справедливый путь состоит в том, чтобы контролировать общее процессорное время - на пользователя?

В многопользовательской системе я хочу измерить использование ЦП каждого пользователя в секундах процессорного времени. В целях этого измерения я предполагаю, что, если PID принадлежит пользователю, этот пользователь вызывает процессорное время - который является, я игнорирую демонов и ядро.

В настоящее время я делаю это каждые пять секунд:

  1. Получите каждого пользователя и PIDs, через который они работают ps aux
  2. Для каждого PID добраться x, сумма utime, cutime, stime и cstime от /proc/[pid]/stat
  3. вычислить t = x / interval (интервал является не всегда точно 5 секундами, когда существует высокая загрузка),

Если я выполняю это, я получаю разумно выглядящие значения. Например: пользователь в этой системе вращался в Python (while True: pass), и система проводила экскурсию приблизительно 750 миллисекундам процессорного времени в секунду. Когда система зависла некоторое время, она сообщила о 1 600 мс для одного 1 второго inverval. Который кажется о праве, но я undestand, что эти значения могут быть deceiptful, особенно учитывая, я действительно не понимаю их.

Таким образом, мой вопрос - это:

Что такое ярмарка и корректный способ измерить загрузку ЦП на основе в расчете на пользователя?

Метод должен быть довольно точным. Могло бы быть много сотен пользователей в этой системе, таким образом извлекая проценты от ps aux не будет достаточно точно, специально для недолгих потоков, которые многим частям программного обеспечения нравится порождать.

В то время как это могло бы быть сложно, я абсолютно знаю, что это возможно. Это было моей начальной точкой:

Ядро отслеживает время создания процессов, а также процессорное время, которое оно использует в течение его времени жизни. Каждый такт системных часов, ядро обновляет количество времени в миге, который текущий процесс потратил в системе и в непривилегированном режиме. — (из Проекта Документации Linux)

Значение, которое я после, является суммой секунд (или миг), который имеет пользователь, тратят на ЦП, не процент использования CPU или системной нагрузки.

Важно, чтобы мы измерили процессорное время, в то время как процессы все еще работают. Некоторые процессы будут только длиться в течение половины секунды, некоторые продержатся в течение многих месяцев - и мы должны поймать оба вида, так, чтобы мы могли считать в течение процессорного времени пользователей с мелкоячеистостью.

25
задан 27 February 2012 в 22:02

4 ответа

Один из наиболее очевидных ответов - просто расширить то, что вы сейчас делаете.

Я сталкивался с этим процессом наблюдения за использованием сценариев bash и mysql для отслеживания времени процессора пользователями, но он охватывал гораздо больший период времени, чем вы говорили.

Надеюсь, это даст вам больше идей о том, в каком направлении вы собираетесь двигаться.

http://www.dba-oracle.com/t_oracle_unix_linux_vmstat_capture.htm

0
ответ дан 27 February 2012 в 22:02

Это даст строку для каждого пользователя, показывающую имя пользователя и его общее время процессора:

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
0
ответ дан 27 February 2012 в 22:02

Похоже, вам нужен учет процессов.

http://www.faqs.org/docs/Linux-mini/Process-Accounting.html

В Ubuntu инструменты учета процессов находятся в acct пакет Install acct

Чтобы получить отчет для каждого пользователя, запустите

sa -m
0
ответ дан 27 February 2012 в 22:02

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

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
0
ответ дан 27 February 2012 в 22:02

Другие вопросы по тегам:

Похожие вопросы: