Отримання використання процесора кожного разу однаково


13

Коли я виконую наступну команду для використання CPU, я отримую приємне + користувальницьке використання CPU.

top -b -n1 | grep "Cpu(s)" | awk '{print $2 + $4}' 

Вихід:

14.5

Тут у мене виникає проблема в тому, що вихід залежить від верхньої команди, тому він не змінюється миттєво як верхня команда. Тому я не отримую правильний процесор миттєво. Це дає такий же вихід і не змінюється.

Я хочу отримати в режимі реального часу cpuusage на виході. Будь ласка, допоможіть мені покращити моє командування.


1
І питання в цьому?
Денніс Каарсемейкер

Спробуйте запустити команду, попередньо за допомогою якої time. У моїй системі це займає всього 0,165 с.
Декап

Будь ласка, дайте мені відредаговану команду.
Ketan Patel

Спробуйте:time (top -b -n1 | grep "Cpu(s)" | awk '{print $2 + $4}' )
depquid

немає різниці у випуску після тестування в різних системах
Ketan Patel

Відповіді:


13

Ви маєте рацію, topздається, ви даєте неправильне використання ЦП під час першої ітерації. Ви можете вирішити цю проблему так:

top -b -n2 | grep "Cpu(s)"|tail -n 1 | awk '{print $2 + $4}'

Це, звичайно, займе вдвічі більше часу, але все одно воно буде працювати.

Якщо ви все ще хочете, щоб це працювало швидше, ви можете скористатися -dопцією, наприклад, за 1 секунду загального періоду вимірювання використовуйте половину його:

top -d 0.5 -b -n2 | grep "Cpu(s)"|tail -n 1 | awk '{print $2 + $4}'

serverfault.com/a/436499/134517 також знадобиться набагато більше ніж удвічі більше часу, оскільки це займе приблизно одну секунду замість майже жодної.
altendky

Окрім коментаря altendky, див. Також відповідь тердоном для пояснення, чому це питання стоїть в першу чергу.
Руслан

6

Технічно перший topне завжди виводить однакове значення; він просто видає середнє завантаження процесора з останнього завантаження. Оскільки topвикористовується дельта /proc/statстатистики для обчислення навантаження на процесор, перше значення обчислюється при порівнянні з нулем, даючи невірний (але WAD) результат.

Якщо ви не хочете використовувати top, ви можете безпосередньо проаналізувати /proc/stat:

cat <(grep 'cpu ' /proc/stat) <(sleep 1 && grep 'cpu ' /proc/stat) | awk -v RS="" '{print ($13-$2+$15-$4)*100/($13-$2+$15-$4+$16-$5) "%"}'

Це також швидше і точніше.

Ви можете перевірити це за допомогою stress:

stress -c 1 -q &

І робити

killall stress

після.


Приємно. І якщо ваша команда розміщена у файлі під назвою 'cpu', то watchна ній можна запустити:watch -n1 "bash ./cpu"
Brent Faust,

Ваш сценарій awk для розбору /proc/statдосить класний, але, схоже, має той самий недолік, що і перша ітерація верху: Він виводить середнє завантаження процесора з моменту останнього завантаження, а не поточне.
п'єрокси

5

Просто для розширення відповіді @ Руслана, topрозбиває використання процесора між користувачем, системними процесами та niceпроцесами, ми хочемо суму трьох. Отже, ми можемо працювати topв bрежимі атчаса, що дозволяє нам проаналізувати його вихід. Однак, як пояснено тут , 1-а ітерація top -bповертає відсотки після завантаження, тому нам потрібно принаймні дві ітерації ( -n 2), щоб отримати поточний відсоток. Щоб прискорити роботу, ви можете встановити dпроміжок між ітераціями на 0.01:

top -bn 2 -d 0.01 | grep '^%Cpu' | tail -n 1 | gawk '{print $2+$4+$6}'

4

Можливо, використовувати цей на основі psрезультатів:

ps aux  | awk 'BEGIN { sum = 0 }  { sum += $3 }; END { print sum }

0

Використовуйте команду watch або для циклу в оболонці,

тобто watch -n1 "top -b -n1 | grep 'Cpu(s)' | awk '{print \$2 + \$4}'"


Те саме відбувається з годинником
Ketan Patel

0

Чому ви дбаєте про використання процесора? Середнє навантаження є набагато кращим показником:

cat /proc/loadavg

Якщо вам справді потрібне використання процесора, аналіз /proc/stat, ймовірно, є шляхом.


1
Середня завантаженість - це інтеграл часу використання процесора (поділений на час). Чому б ви сказали, що інтегральна характеристика набагато кращий показник [усього], ніж диференціальна, коли вони мають зовсім інші випадки використання? Крім того, /proc/statне дає використання процесора таким, яким він є, доводиться його читати двічі з деяким часом між читаннями та робити деякі розрахунки, щоб отримати використання процесора. Це тільки те, що topробить.
Руслан

Я не можу мати математику, тому мушу визнати, що я не дуже розумію різницю між інтегралом та диференціалом: / "Середнє навантаження - це в основному інтеграл часу використання процесора" - це справді? AFAIK процес, який зависає в стані D, викликає збільшення навантаження, але не використовує процесор. "Чому б ви сказали ..." - ОП не говорить того, що він насправді хоче досягти, тому, чесно кажучи, я просто припускаю, що він хоче виміряти завантаження системи і вважав, що використання ЦП буде найкращим показником для цього , тому я скеровував його для завантаження середнього.
Мартін фон Віттіч

За вашим посиланням: "Системи обчислюють середнє навантаження як експоненціально затухаючу / зважену ковзну середню кількість навантаження". і "навантаження системи - це міра обсягу обчислювальної роботи". D-стан не проводить жодної обчислювальної роботи. Для цього потрібні процеси, які використовують час процесора. Отже, середнє навантаження - це в основному відсоток часу, який процесор не працював протягом певного періоду часу (скажімо, хвилин до десятків хвилин). І використання процесора - це відсоток часу, коли процесор не працює в масштабі часу мілісекунд - тобто оновлюється щоразу, коли ви його читаєте та відображаючи поточний стан.
Руслан

-2

Використання sarкоманди

sar 1 10

Це означає: отримуйте 10-кратний результат за кожну секунду

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