Який найсправедливіший спосіб відстежувати загальний час процесора - на користувача?


25

У системі з декількома користувачами я хочу виміряти використання CPU кожного користувача в секундах процесорного часу. З метою цього вимірювання я припускаю, що якщо PID належить користувачеві, цей користувач викликає час процесора - тобто я ігнорую демони та ядро.

В даний час я роблю це кожні п’ять секунд:

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

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

Отже, моє запитання таке:

Який справедливий і правильний спосіб вимірювати завантаження процесора на основі кожного користувача?

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

Хоча це може бути складним, я абсолютно знаю, що це можливо. Це було моєю відправною точкою:

Ядро відстежує час створення процесів, а також час процесора, який він споживає протягом свого життя. Кожен годинник, ядро ​​оновлює кількість часу в джиффах, які поточний процес провів у системі та в режимі користувача. - (від документаційного проекту Linux )

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

Важливо, щоб ми вимірювали час процесора, поки процеси ще працюють. Деякі процеси триватимуть лише півсекунди, деякі триватимуть багато місяців - і нам потрібно вловлювати обидва типи, щоб ми могли чітко пояснювати час процесора користувачів.


1
500 репутації: o хороший шанс для
початківців

Дещо з моєї ліги, але дуже цікаве питання , так що я викопав трохи і знайшов те , що я сподіваюся, по крайней мере , корисно , щоб допомогти вам вирішити цю: stackoverflow.com/a/1424556/905573
kingmilo

1
Ви знаєте, чи topможете робити пакетний режим? top -b -n 1 -u {user} | awk 'NR>7 { sum += $9; } END { print sum; }'має вказати навантаження для {user} у цей момент.
Rinzwind

Відповіді:


11

Здається, вам потрібен облік процесів.

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

На Ubuntu в пакеті знаходяться інструменти обліку процесівacct Встановіть acct

Щоб отримати звіт про кожного користувача, запустіть

sa -m

На жаль, це не спрацює для мене, оскільки "sa" не враховуватиме тривалі процеси. Що мені потрібно (я думаю) - це спосіб виявити запущені та припинені процеси, а також записати їхній процесорний час, коли вони виходять, а також під час їх запуску.
Стефано Палацо

@StefanoPalazzo Я вважаю, що це найкраще, що ти отримаєш. Доповніть його часом із запуском процесів із /proc/[pid]/stat.
ændrük

Як виявляється, здається, що більшість всіх процесів буде належним чином обліковуватися 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


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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.