У системі з декількома користувачами я хочу виміряти використання CPU кожного користувача в секундах процесорного часу. З метою цього вимірювання я припускаю, що якщо PID належить користувачеві, цей користувач викликає час процесора - тобто я ігнорую демони та ядро.
В даний час я роблю це кожні п’ять секунд:
- Отримайте кожного користувача та PID, через які він працює
ps aux
- Отримайте для кожного PID
x
суму суми timeime, cutime, stime та cstime від/proc/[pid]/stat
- обчислити
t = x / interval
(інтервал не завжди рівно 5 секунд при великому навантаженні)
Якщо я запускаю це, я отримую розумні значення. Наприклад: Користувач цієї системи крутився в python ( while True: pass
), і система показувала близько 750 мілісекунд часу процесора в секунду. Коли система трохи зависла, вона повідомляла про 1600 мс за одну інверсію 1 секунди. Яке здається правильним, але я заперечую, що ці цінності можуть бути оманливими, особливо з огляду на те, що я їх не дуже розумію.
Отже, моє запитання таке:
Який справедливий і правильний спосіб вимірювати завантаження процесора на основі кожного користувача?
Метод повинен бути досить точним. У цій системі може бути багато сотень користувачів, тому вилучення відсотків із цього ps aux
буде недостатньо точним, особливо для короткотривалих потоків, які багато програмного забезпечення люблять нерестувати.
Хоча це може бути складним, я абсолютно знаю, що це можливо. Це було моєю відправною точкою:
Ядро відстежує час створення процесів, а також час процесора, який він споживає протягом свого життя. Кожен годинник, ядро оновлює кількість часу в джиффах, які поточний процес провів у системі та в режимі користувача. - (від документаційного проекту Linux )
Значення, на яке я звертаюсь, - це кількість секунд (або джиґів), яку користувач витратив на процесор, а не відсоток завантаження системи або використання процесора.
Важливо, щоб ми вимірювали час процесора, поки процеси ще працюють. Деякі процеси триватимуть лише півсекунди, деякі триватимуть багато місяців - і нам потрібно вловлювати обидва типи, щоб ми могли чітко пояснювати час процесора користувачів.
top
можете робити пакетний режим? top -b -n 1 -u {user} | awk 'NR>7 { sum += $9; } END { print sum; }'
має вказати навантаження для {user} у цей момент.