มีวิธีใดบ้างในการรับการใช้งาน CPU ในบรรทัดคำสั่ง Linux [ปิด]


12

เรารู้ว่า top เป็นคำสั่งเพื่อรับการใช้งาน CPU ใน Linux และวิธีอื่น ๆ ได้แก่ cat /proc/stat ซึ่งถูกใช้โดยด้านบน

มีวิธีอื่นใดบ้างในการรับการใช้งาน CPU ในบรรทัดคำสั่ง Linux

ใช้สถานการณ์กรณี: สคริปต์จะใช้เอาต์พุตของคำสั่งนี้เพื่อบันทึกการใช้งาน CPU อย่างต่อเนื่อง top และ /proc/stat ให้รายละเอียดการใช้งานซึ่งยากที่จะเข้าสู่ระบบ มีวิธีที่ง่ายกว่าในการรับข้อมูล CPU หรือไม่


3
มีอะไรผิดปกติกับสิ่งที่คุณพูด?
pataluc

@ papuc มันให้ข้อมูลรายละเอียดเพิ่มเติม ฉันต้องการการใช้งาน CPU โดยรวมว่าใช้ CPU: 91% Mem ใช้แล้ว: 78% Mem ฟรี: 22% อย่างนี้ ..
fasil

เห็นคำตอบของนาธาน ... คุณทำได้ sed ผลลัพธ์ถ้าคุณต้องการค่า
pataluc

การลงคะแนนให้ปิดเป็น "ไม่สร้างสรรค์" จาก superuser.com/help/dont-ask : " เพื่อป้องกันคำถามของคุณไม่ให้ถูกตั้งค่าสถานะและอาจถูกนำออกไปให้หลีกเลี่ยงการถามคำถามแบบอัตนัยที่ ... คำตอบของคุณถูกจัดเตรียมไว้พร้อมกับคำถามและคุณคาดหวังคำตอบเพิ่มเติม: 'ฉันใช้ ______ สำหรับ ______ "
bwDraco

3
@DragonLord จริง ๆ แล้วมีวิธีการที่ จำกัด ในการทำเช่นนี้และคำตอบสองข้อที่นี่มีประโยชน์จริง ๆ Mine ชี้ให้เห็นถึงความเข้าใจผิดที่พบบ่อยมากเกี่ยวกับ top และอีกคำสั่งหนึ่งมีประโยชน์มาก มันไม่ได้เป็น ฉันใช้ X คุณเป็นยังไงบ้าง คำถาม แต่ก ฉันจะทำ X อย่างไร คำถาม. การลงคะแนนเพื่อเปิดใหม่
terdon

คำตอบ:


14

อย่างที่คนอื่นพูดกันอาจเป็นวิธีที่ดีที่สุด top. ต้องการการปรับแต่งเล็กน้อยและการแยกวิเคราะห์เล็กน้อย แต่คุณสามารถรับเพื่อให้การใช้งาน CPU ปัจจุบันเป็นเปอร์เซ็นต์

top แยกการใช้ CPU ระหว่างผู้ใช้กระบวนการของระบบและ nice กระบวนการเราต้องการผลรวมของทั้งสาม ดังนั้นเราสามารถวิ่งได้ top ใน b โหมด atch ซึ่งช่วยให้เราสามารถแยกเอาท์พุทของมัน อย่างไรก็ตามตามที่อธิบายไว้ ที่นี่ การทำซ้ำครั้งที่ 1 ของ top -b ส่งกลับค่าเปอร์เซ็นต์ตั้งแต่บูตเราจึงต้องมีการวนซ้ำอย่างน้อยสองครั้ง ( -n 2 ) เพื่อรับเปอร์เซ็นต์ปัจจุบัน เพื่อให้เร็วขึ้นคุณสามารถตั้งค่า d หน่วงเวลาระหว่างการทำซ้ำถึง 0.01. ในที่สุดคุณ 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

ฉันคิดว่าคุณสามารถรับข้อมูลนี้ได้ด้วย ps -o pcpu ax โดยการเพิ่มการใช้% ของแต่ละกระบวนการที่กำลังทำงานอยู่ น่าเสียดายที่อธิบายไว้ ที่นี่ , ps "ส่งคืนเปอร์เซ็นต์ของเวลาที่ใช้ในการทำงานตลอดอายุการใช้งานของกระบวนการ" ซึ่งไม่ใช่สิ่งที่คุณต้องการ


แก้ไข

ตามความคิดเห็นของคุณเวอร์ชันของคุณ top แตกต่างจากของฉันและคุณควรใช้สิ่งนี้แทน:

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

และเพื่อหลีกเลี่ยงปัญหาเกี่ยวกับการแปลให้ตั้งโลแคลเป็น C:

LC_ALL=C top -bn 2 -d 0.01 | grep '^Cpu.s.' | tail -n 1 | gawk '{print $2+$4+$6}'

ฉันลบคำตอบของฉันเพราะสิ่งที่คุณพูดถูกต้อง อันนี้ดูเหมือนจะเป็นวิธีที่ถูกต้อง
Nathan C

@NathanC ฉันคิดว่าคำตอบของคุณถูกต้องเช่นกันมันเป็นสิ่งที่ฉันจะตอบ จากนั้นฉันทดสอบและรู้สึกประหลาดใจ :)
terdon

@terdon ขอบคุณสำหรับคำตอบโดยละเอียดของคุณ ... ฉันไม่สามารถรับเอาต์พุตสำหรับคำสั่งด้านบนได้ จำเป็นต้องมีการดัดแปลงแก้ไขประโยคใด ๆ หรือไม่ ..
fasil

@fasil ไม่ควรทำงานได้ อะไรคือปัญหา? ข้อความแสดงข้อผิดพลาดใด ๆ
terdon

@terdon ฉันไม่ได้รับเอาต์พุตใด ๆ สำหรับคำสั่งทั้งหมด .. ด้วย #top -bn 2 -d 0.01 ฉันได้รับผลลัพธ์เต็ม แต่เมื่อเพิ่ม grep '^% Cpu' ฉันไม่เห็นผลลัพธ์ใด ๆ เลยเพียงแค่แจ้งให้ส่งคืนไม่มี ข้อผิดพลาด ...
fasil

9

sar เป็นวิธีที่ชัดเจนในการทำ ตัวอย่างเช่น sar -u จะเอาท์พุทแบบนี้:

08:30:01 AM       CPU     %user     %nice   %system   %iowait     %idle
08:40:01 AM       all      6.94      0.00      1.77      4.92     86.36
08:50:01 AM       all      5.73      0.00      2.31     12.72     79.24
09:00:01 AM       all      5.95      0.00      2.58     18.36     73.11
09:10:01 AM       all      6.88      0.00      2.22     17.44     73.45
09:20:01 AM       all      8.61      0.00      2.68     27.93     60.78

คุณไม่ได้บอกว่าคุณใช้ Linux ตัวไหน แต่สำหรับ CentOS / RedHat คุณต้องติดตั้ง sysstat แพ็คเกจและฉันคิดว่ามันเหมือนกันบน Debian / Ubuntu

คุณยังสามารถใช้ sar เพื่อรวบรวมสถิติ สำหรับสิ่งนี้สิ่งนั้นโดยเฉพาะ :

sar -o /tmp/sar.out 60 600

จะรวบรวมสถิติทุก ๆ 60 วินาที 600 ครั้งดังนั้น 600 นาที


1
คุณควรจะพูดให้แตกต่างกัน บรรทัดที่คุณโพสต์จะวัดทุก 60 วินาที 600 ครั้ง วิธีที่ฉันอ่านโพสต์ของคุณคือ 600 คือระยะเวลาดังนั้นถ้าฉันวาง 30 600 มันจะใช้เวลาทุก ๆ 30 วินาทีเป็นเวลา 600 นาทีอย่างไรก็ตามจริง ๆ แล้วมันจะใช้เวลาหนึ่งทุก ๆ 30 วินาที 600 ครั้ง
James McDonnell

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