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

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

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

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

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

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

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

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

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

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

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

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

4 ответа

Решение

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

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

На Ubuntu инструменты учета процессов находятся в acct пакет Установить 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/:/*3600+/ -e s/:/*60+/ \
                                | paste -sd+ \
                                | bc
                );
        done

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

Я сталкивался с этим процессом мониторинга для использования сценариев 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/-/*86400+/ -e s/:/*3600+/ -e s/:/*60+/ 
                          | paste -sd+ \
                          | bc
            );
    done
Другие вопросы по тегам