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


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.