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

25

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

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

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

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

Итак, мой вопрос заключается в следующем:

Как правильно и правильно измерить нагрузку на процессор для каждого пользователя?

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

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

Ядро отслеживает время создания процесса, а также время процессора, которое оно потребляет в течение своей жизни. При каждом такте ядра ядро ​​обновляет количество времени, которое текущий процесс провел в системе и в пользовательском режиме. - (из проекта документации Linux )

Значение, которое я получаю, - это количество секунд (или перебоев), которое пользователь потратил на процессор, а не процент загрузки системы или использования процессора.

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

Стефано Палаццо
источник
1
500 репутация: • хороший шанс для начинающих
Тахионы
Немного вне моей лиги, но очень интересный вопрос, поэтому я немного
покопался
1
Вы знаете, topможете сделать пакетный режим? top -b -n 1 -u {user} | awk 'NR>7 { sum += $9; } END { print sum; }'должен показать нагрузку для {пользователя} в этот момент.
Rinzwind

Ответы:

11

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

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

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

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

sa -m
Алан Белл
источник
К сожалению, это не сработает для меня, так как "sa" не будет учитывать длительные процессы. То, что мне нужно (я думаю), это способ обнаружения запуска и завершения процессов, а также для записи времени их процессора, когда они выходят, а также во время их работы.
Стефано Палаццо
@ StefanoPalazzo Я считаю, что это лучшее, что вы получите. Дополните его временем запуска процессов из /proc/[pid]/stat.
Ондрюк
Как выясняется, похоже, что большинство всех процессов будут должным образом saучтены (.ps.gz) . И у меня также есть хороший способ «оценить» эти длительные процессы, прежде чем в конечном итоге получить точные значения для них. Так что, в конце концов, мы будем его использовать, и я более чем рад предоставить награду за ваш ответ. Огромное спасибо!
Стефано Палаццо
3

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

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
Маркес Йоханссон
источник
2

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

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

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

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

Linztm
источник
0

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

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
Патрик Арлос
источник