วิธีรับการใช้งาน CPU โดยรวม (เช่น 57%) บน Linux [ปิด]


197

ฉันสงสัยว่าคุณจะได้รับการใช้งาน CPU ของระบบและแสดงเป็นเปอร์เซ็นต์ด้วยการใช้ bash ได้อย่างไร

ตัวอย่างผลลัพธ์:

57%

ในกรณีที่มีมากกว่าหนึ่งแกนมันจะดีถ้าคำนวณเปอร์เซ็นต์เฉลี่ย


1
@julesanchez ค่าจะต้องมีการ
piped ที่

กำลังทำงานด้านบน> myfile.txt และการใช้ตัวกรองของคุณในการบำบัดหลังการผ่าตัดไม่เป็นไร?
JuSchz

11
คำสั่งที่ไม่ต้องใช้ sysstat:ps -A -o pcpu | tail -n+2 | paste -sd+ | bc
RFon

7
การเปิดอีกครั้งฉันไม่เข้าใจว่าทำไมเรื่องนี้ถึงถูกตัดออกเป็นหัวข้อคนที่ปิดมันได้โปรดอธิบายเพิ่มเติมได้ไหม?
Jonathan H

3
ความเข้าใจของฉัน/proc/statมี จำกัด มาก แต่สิ่งนี้ใช้ได้ดีพอสำหรับฉัน: cat <(grep 'cpu ' /proc/stat) <(sleep 1 && grep 'cpu ' /proc/stat) | awk -v RS="" '{printf "%.2f%\n", ($13-$2+$15-$4)*100/($13-$2+$15-$4+$16-$5)}'. ด้วย% .2f คุณสามารถควบคุมจำนวนทศนิยมที่คุณต้องการออกและด้วยsleep 1คุณสามารถกำหนดเวลาที่คุณต้องการเฉลี่ยมากกว่านั่นคือถ้ามันเป็นสิ่งที่ฉันคิดว่ามันทำ คุณสามารถใส่มันใน bash ในขณะที่วนซ้ำเพื่อทดสอบในเรียลไทม์
Yeti

คำตอบ:


174

ลองดูที่ cat /proc/stat

grep 'cpu ' /proc/stat | awk '{usage=($2+$4)*100/($2+$4+$5)} END {print usage "%"}'

แก้ไขโปรดอ่านความคิดเห็นก่อนที่จะคัดลอกวางหรือใช้สิ่งนี้สำหรับงานที่จริงจัง นี่ไม่ใช่การทดสอบหรือใช้มันเป็นความคิดสำหรับผู้ที่ไม่ต้องการติดตั้งยูทิลิตี้หรือสิ่งที่ใช้ได้กับการแจกจ่ายใด ๆ บางคนคิดว่าคุณสามารถ "apt-get install" อะไรก็ได้

หมายเหตุ:นี่ไม่ใช่การใช้งาน CPU ปัจจุบันแต่เป็นการใช้งาน CPU โดยรวมในทุกคอร์นับตั้งแต่การบูทระบบ สิ่งนี้อาจแตกต่างจากการใช้ CPU ในปัจจุบันมาก เพื่อให้ได้ค่าปัจจุบัน (หรือเครื่องมือที่คล้ายกัน) จะต้องใช้

การใช้งาน CPU ปัจจุบันสามารถคำนวณได้ด้วย:

awk '{u=$2+$4; t=$2+$4+$5; if (NR==1){u1=u; t1=t;} else print ($2+$4-u1) * 100 / (t-t1) "%"; }' \
<(grep 'cpu ' /proc/stat) <(sleep 1;grep 'cpu ' /proc/stat)

12
แต่คุณต้องติดตั้ง mpstat ตามที่คุณแนะนำข้างต้น หลายคนไม่มีความยืดหยุ่นนั้น cat / proc / stat จากนั้นไปป์นั้นง่ายกว่า mpstat ที่คุณแนะนำ
vimdude

12
+1 ไม่เข้าใจว่าทำไมการแยกวิเคราะห์ยูทิลิตี้อื่นดีกว่าการแยกวิเคราะห์/proc/stat
Reinstate Monica กรุณา

9
ระบบ + ผู้ใช้ + ไม่ได้ใช้งาน = 100% ดังนั้นบางทีสิ่งที่ชอบ: grep 'cpu' / proc / stat | awk '{cpu_usage = ($ 2 + $ 4) * 100 / ($ 2 + $ 4 + $ 5)} END {พิมพ์ cpu_usage "%"}'
vimdude

106
ฉันคิดว่าวิธีนี้จะไม่แสดงโหลด CPU ปัจจุบัน แต่โหลด cpu เฉลี่ยตั้งแต่ CPU เริ่มต้น
เอเตียน

11
@jlliagre ใช่ถูกต้อง ในการคำนวณการใช้ cpu ปัจจุบันไม่ใช่ค่าเฉลี่ยคุณจะต้องใช้ค่า $ 1 จากนั้นจึงล่าช้าจากนั้นรับค่า $ 1 และดูความแตกต่าง นั่นคือการใช้งาน cpu ปัจจุบัน
vimdude

102

คุณสามารถลอง:

top -bn1 | grep "Cpu(s)" | \
           sed "s/.*, *\([0-9.]*\)%* id.*/\1/" | \
           awk '{print 100 - $1"%"}'

11
ทุกครั้งที่ฉันรันคำสั่งนี้ฉันจะได้ผลลัพธ์ที่แน่นอน ( 32.7%)
alanaktion

13
ผลลัพธ์ที่แม่นยำยิ่งขึ้นจะได้รับเมื่อฉันใช้top -bn2แต่ใช้เวลานาน จากสิ่งที่ฉันได้อ่านดูเหมือนว่าจะเป็นวิธีเดียวที่จะได้ผลลัพธ์ที่แม่นยำ
alanaktion

7
top -bn1ดูเหมือนว่าผิดพลาดในระบบ FC20 ของฉัน top -bn2ดูเหมือนว่าจะทำงานได้ดี
Martin Tournoij

24
คำสั่งในคำตอบนี้ดูเหมือนจะเขียนสำหรับระบบที่มีการtop -vส่งคืนprocps-ng(เช่น Fedora) นอกจากนี้ยังprocpsพบบนเช่น Ubuntu และ CentOS ที่คำสั่งไม่ทำงาน (บ่งชี้เสมอ 100% เนื่องจากการแยกวิเคราะห์ล้มเหลวเนื่องจากบรรทัดที่มีตัวเลข CPU ถูกจัดรูปแบบแตกต่างกัน) นี่เป็นรุ่นที่ใช้งานได้กับการติดตั้งทั้งสอง:top -b -n2 -p 1 | fgrep "Cpu(s)" | tail -1 | awk -F'id,' -v prefix="$prefix" '{ split($1, vs, ","); v=vs[length(vs)]; sub("%", "", v); printf "%s%.1f%%\n", prefix, 100 - v }'
mklement0

2
หมายเหตุด้านข้าง: ใน OSX ให้ใช้สิ่งต่อไปนี้: top -l 2 -n 0 -F | egrep -o ' \d*\.\d+% idle' | tail -1 | awk -F% -v prefix="$prefix" '{ printf "%s%.1f%%\n", prefix, 100 - $1 }'.
mklement0

38

ลองmpstatจากsysstatแพ็คเกจ

> sudo apt-get install sysstat
Linux 3.0.0-13-generic (ws025)  02/10/2012  _x86_64_    (2 CPU)  

03:33:26 PM  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest   %idle
03:33:26 PM  all    2.39    0.04    0.19    0.34    0.00    0.01    0.00    0.00   97.03

จากนั้นบางส่วนcutหรือgrepเพื่อแยกวิเคราะห์ข้อมูลที่คุณต้องการ:

mpstat | grep -A 5 "%idle" | tail -n 1 | awk -F " " '{print 100 -  $ 12}'a

1
ฉันไม่เชื่อว่านี่แสดง CPU ทั้งหมด
user1199739

ฉันจะบอกว่าไม่ได้ใช้งาน 100-% นั่นคือการใช้งาน CPU ทั้งหมด (เป็น%)
Peter Svensson

นั่นคือเปอร์เซ็นต์ที่ "ไม่ได้ใช้" คำตอบนี้ดีมากจนถึง grep | หาง | ส่วน awk ...
jordanm

ฉันจะเปลี่ยนawkส่วนเป็น: awk -F " " '{print (100 - $12)"%"}'ซึ่งให้การจัดรูปแบบผลลัพธ์ตามที่เขาต้องการ แต่ไม่เช่นนั้นมันก็ดูดีสำหรับฉัน
Dan Fego

1
@jordanm ความจริงทั้งหมด; ฉันโหวตมากกว่านี้เพราะมันใช้งานได้ ฉันจะทำสิ่งนี้เป็นการส่วนตัว:mpstat | awk '$12 ~ /[0-9.]+/ { print 100 - $12 }'
Dan Fego

22

อาจรวมถึงการตอบสนองที่แท้จริงกับโซลูชันของฉันซึ่งได้รับแรงบันดาลใจจากของ Peter Liljenberg:

$ mpstat | awk '$12 ~ /[0-9.]+/ { print 100 - $12"%" }'
0.75%

สิ่งนี้จะใช้awkในการพิมพ์ 100 ลบฟิลด์ที่ 12 (ไม่ได้ใช้งาน) โดยมีเครื่องหมายเปอร์เซ็นต์หลังจากนั้น awkจะทำเช่นนี้สำหรับบรรทัดที่เขตข้อมูลที่ 12 มีตัวเลขและจุดเท่านั้น ( $12 ~ /[0-9]+/)

คุณยังสามารถหาค่าเฉลี่ยตัวอย่างได้ห้าตัวอย่างแยกกันหนึ่งวินาที:

$ mpstat 1 5 | awk 'END{print 100-$NF"%"}'

ทดสอบแบบนี้:

$ mpstat 1 5 | tee /dev/tty | awk 'END{print 100-$NF"%"}'

14
ควรรัน "mpstat 2 1 | ... " เพื่อให้มันแสดงสถิติในช่วง 1 วินาทีที่ผ่านมา มิฉะนั้นโดยค่าเริ่มต้น mpstat จะแสดงสถิติตั้งแต่เริ่มต้นและไม่เปลี่ยนแปลงมากนักเมื่อเวลาผ่านไป
ซารัง

1
"mpstat | awk '$ 12 ~ / พี่น้อง 0-9. เหมือนกัน +/ {พิมพ์ 100 - $ 11"% "}'" สิ่งนี้ใช้ได้สำหรับฉัน
AloneInTheDark

@ Sarang ขอบคุณมาก !! ในที่สุดฉันก็สามารถได้ผลลัพธ์ที่conkyแสดงเช่นกัน น่าเสียดายที่บรรทัดนี้ช้ามากเกือบจะใช้เวลาถึงหนึ่งวินาทีในการดำเนินการทั้งหมด
ไวยากรณ์

6
@syntaxerror ใช้เวลา 2 วินาทีเพราะถ้าคุณดูคำสั่งจะช่วยให้คุณเห็นว่าอาร์กิวเมนต์แรกคือว่ามันเป็นช่วงเวลา แต่จะดำเนินการเพียงครั้งเดียวเพราะอาร์กิวเมนต์ที่สองดังนั้นมันจะรอ 2 วินาทีเต็มจนกว่ามันจะส่งกลับผล
Johan Bjäreholt

คำถามถูกปิดดังนั้นเพิ่มคำตอบ (คล้าย) ของฉันให้กับคุณ :-) หวังว่าคุณจะไม่รังเกียจ เช่นเดียวกับคุณฉันได้แรงบันดาลใจจากคำตอบของ Peter Liljenberg
PJ Brunet

16

แก้ไข: ฉันสังเกตเห็นว่าในการตอบกลับของผู้ใช้% idle คือฟิลด์ 12 แทนที่จะเป็นฟิลด์ 11 awk ได้รับการอัปเดตเป็นบัญชีสำหรับฟิลด์% idle ซึ่งเป็นตัวแปร

สิ่งนี้จะให้ผลลัพธ์ที่คุณต้องการ:

mpstat | awk '$3 ~ /CPU/ { for(i=1;i<=NF;i++) { if ($i ~ /%idle/) field=i } } $3 ~ /all/ { print 100 - $field }'

หากคุณต้องการการปัดเศษจำนวนเต็มอย่างง่ายคุณสามารถใช้ printf:

mpstat | awk '$3 ~ /CPU/ { for(i=1;i<=NF;i++) { if ($i ~ /%idle/) field=i } } $3 ~ /all/ { printf("%d%%",100 - $field) }'

2
mpstat 1 1 | awk '$3 ~ /CPU/ { for(i=1;i<=NF;i++) { if ($i ~ /%idle/) field=i } } $3 ~ /all/ { printf("%d",100 - $field) }'ใช้งานได้ดีสำหรับฉันขอบคุณ สังเกต mpstat 1 1 เพื่อให้แน่ใจว่าการใช้ซีพียูถูกสุ่มตัวอย่างในช่วงเวลาที่สอง
chrishiestand

1
หากคุณมีmpstat -o JSON -u 1 1 | jq '.sysstat.hosts[0].statistics[0]["cpu-load"][0].idle'
jq
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.