รับ cpu เรียลไทม์


11

เมื่อฉันรันคำสั่งต่อไปนี้เพื่อรับการใช้ cpu ฉันได้รับการใช้งาน cpu ดี + ผู้ใช้

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

เอาท์พุท:

14.5

ที่นี่ฉันได้รับปัญหาคือผลลัพธ์ขึ้นอยู่กับคำสั่งด้านบนจึงไม่เปลี่ยนทันทีเป็นคำสั่งด้านบน ดังนั้นฉันจึงไม่ได้รับซีพียูที่ถูกต้องทันที มันให้ผลลัพธ์เดียวกันและไม่เปลี่ยนแปลง

ฉันต้องการรับการใช้งาน CPU แบบเรียลไทม์ในเอาต์พุต โปรดช่วยฉันปรับปรุงคำสั่งของฉัน


ตรวจสอบเวลาจริงaskubuntu.com/questions/293426/…
Qasim

สคริปต์ทุบตีง่าย ๆ นี้ทำแค่นั้น: askubuntu.com/a/450136/243213
Craig van Tonder

คำตอบ:


20

หากคุณสามารถจ่ายได้ล่าช้าหนึ่งวินาทีสิ่งนี้จะพิมพ์การใช้งาน CPU เป็นเปอร์เซ็นต์อย่างง่าย:

echo $[100-$(vmstat 1 2|tail -1|awk '{print $15}')]

(โดยไม่มีการหน่วงเวลาหนึ่งวินาทีvmstatสามารถพิมพ์ค่าเฉลี่ยตั้งแต่การบู๊ตเท่านั้น)


ไม่ให้% ที่แม่นยำกับฉัน (เทียบกับ
ฮ็อป

1
คุณต้องใช้vmstat 1 2สิ่งนี้: echo $[100-$(vmstat 1 2|tail -1|awk '{print $15}')] มิฉะนั้นคุณvmstatจะให้ค่าตั้งแต่การบูทซึ่งไม่น่าเป็นไป
Joe

โจขอบคุณมันได้ผล โปรด Paul แก้ไขคำตอบเพื่อให้ทุกคนที่สามารถดูบรรทัดคำสั่งที่ถูกต้อง
Pavlos Theodorou

ขอบคุณสำหรับการจับที่โจและ Pavlos! ฉันไม่ได้สังเกตว่าเป็นส่วนหนึ่งของหน้าคน
พอล

9

topนี่เป็นปัญหาที่ทราบเกี่ยวกับ ตามที่อธิบายไว้ที่นี่การทำซ้ำครั้งที่ 1 ของtop -bผลตอบแทนร้อยละตั้งแต่บูตเราจึงต้องอย่างน้อยสองซ้ำ ( -n 2) เพื่อให้ได้เปอร์เซ็นต์ปัจจุบัน สิ่งที่ความเร็วขึ้นคุณสามารถตั้งค่าdELAY 0.01ระหว่างซ้ำไป topแยกการใช้ CPU ระหว่างผู้ใช้กระบวนการของระบบและniceกระบวนการเราต้องการผลรวมของทั้งสาม ในที่สุดคุณgrepบรรทัดที่มีเปอร์เซ็นต์ CPU และจากนั้นใช้gawkเพื่อรวมผู้ใช้ระบบและกระบวนการที่ดี:

    top -bn 2 -d 0.01 | grep '^%Cpu' | tail -n 1 | gawk '{print $2+$4+$6}'
        -----  ------   -----------    ---------   ----------------------
          |      |           |             |             |------> add the values
          |      |           |             |--> keep only the 2nd iteration
          |      |           |----------------> keep only the CPU use lines
          |      |----------------------------> set the delay between runs
          |-----------------------------------> run twice in batch mode

ทุกวิธีอื่นรวมถึง sar, mpstat ... ฯลฯ จะแสดง 2/3% ในขณะที่คำสั่งนี้จะแสดง 50%
CMCDragonkai

@CMCDragonkai ตัวเลขควรเปลี่ยน (ฉันเพิ่งตรวจสอบ) คุณแน่ใจหรือว่าคุณคัดลอก / วางอย่างถูกต้อง? นอกจากนี้โปรดทราบว่าในระบบที่มี CPU หลายตัวtopจะรายงานการใช้% เป็นเปอร์เซ็นต์ของCPU ตัวเดียว ซึ่งหมายความว่าคุณมักจะได้รับเปอร์เซ็นต์ที่สูงกว่ามาก ดูจุดที่ 9 ที่นี่
terdon

ฉันคิดว่าคำสั่งนี้อาจเข้ากันไม่ได้กับระบบของฉัน แต่เห็นได้ชัดว่าวิธีอื่น ๆ ทั้งหมดที่ฉันพยายามทำให้ฉันได้รับเป็นร้อยละ 1/2/3% ซึ่งเป็นสิ่งที่ฉันเห็นถ้าฉันเรียกใช้ htop ในขณะที่คำสั่งนี้ให้ฉันผิดปกติ
CMCDragonkai

@CMCDragonkai นั่นเป็นเพราะ CPU หลายตัว คุณสามารถรับจำนวนที่ส่งคืนโดยสิ่งนี้และหารด้วยจำนวนแกนประมวลผลหรือคุณสามารถใช้topในโหมดการโต้ตอบ (เพิ่งรันtop) และเมื่อนั้นกดI(Shift + i) เพื่อดูรายละเอียดตามแกน
terdon

ฉันมี CPU เพียง 1 ตัว
CMCDragonkai

7

ฉันได้ลองหลายวิธีแล้ว แต่สิ่งนี้ดูเหมือนถูกต้องที่สุดสำหรับฉัน:

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)}'

รับได้จากที่นี่


linux ของฉัน (Linux machine_name 4.4.0-127-generic # 153-Ubuntu SMP วันที่ 19 พฤษภาคม 10:58:46 UTC 2018 x86_64 x86_64 x86_64 x86_64 GNU / Linux) ไม่มีคอลัมน์ $ 15 (บรรทัด cpu ของไฟล์ / proc / stat) : cpu 17411187 27478 594887 646652526 585551 0 31838 0 0 0
Kemin Zhou

1
คำตอบที่ดีที่สุด! ขอบคุณ! รูปแบบของฉัน: cat <(grep 'cpu' / proc / stat) <(sleep 0.1 && grep 'cpu' / proc / stat) | awk -v RS = "" '{printf "% .1f", ($ 13- $ 2 + $ 15- $ 4) * 100 / ($ 13- $ 2 + $ 15- $ 4 + $ 16- $ 5)}'
maXp

ความแตกต่างของ maXp ก็คือมันถูกพิมพ์ออกมาเป็นทศนิยมเดียว: %.1fซึ่งในความคิดของฉันนั้นอ่านง่ายและมีประโยชน์มากกว่าถ้าคุณใช้เอาต์พุตนั้นในสคริปต์อื่น ๆ
lepe

0

-n2ใช้ สิ่งนี้จะเอาท์พุทสองบรรทัด ครั้งแรกที่topพิมพ์บรรทัดนั้นจะไม่เข้าเกณฑ์สำหรับสถานะ ณ เวลานั้น จากนั้นปรับสคริปต์ของคุณให้ละเว้นบรรทัดแรก

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.