มีวิธีคำนวณเปอร์เซ็นต์การใช้ CPU โดยการอ่าน / proc / stat พร้อมกันหรือไม่?


12

ฉันเดาคำถามคือฉันสามารถคำนวณเปอร์เซ็นต์การใช้ประโยชน์ CPU ได้โดยการอ่าน / proc / stat หนึ่งครั้งหรือไม่?

# head -1 /proc/stat
cpu  67891300 39035 6949171 2849641614 118251644 365498 2341854 0

ฉันกำลังคิดเกี่ยวกับการสรุปคอลัมน์ยกเว้น IOWait (ฉันกำลังอ่านที่ไหนสักแห่งว่านับเป็นเวลาว่าง) และนั่นจะให้ 100% แก่ฉันและแต่ละคอลัมน์จะกลายเป็นเปอร์เซ็นต์โดย (คอลัมน์ / 100_percent) * 100

  • ผู้ใช้: กระบวนการปกติที่ดำเนินการในโหมดผู้ใช้
  • nice: กระบวนการที่ถูกดำเนินการในโหมดผู้ใช้
  • ระบบ: กระบวนการที่ดำเนินการในโหมดเคอร์เนล
  • ไม่ได้ใช้งาน: นิ้วหัวแม่มือ twiddling
  • iowait: กำลังรอ I / O ให้เสร็จสมบูรณ์
  • irq: การบริการขัดจังหวะ
  • softirq: การบริการ softirqs
  • ขโมย: รอโดยไม่สมัครใจ
  • แขก: ทำงานแขกทั่วไป
  • guest_nice: เรียกใช้แขกผู้เยี่ยมชม

นี่เป็นแนวทางที่ปฏิบัติได้หรือไม่

คำตอบ:


11

คุณอยู่ในเส้นทางที่ถูกต้องtopใช้ไฟล์นี้เพื่อจุดประสงค์นี้ แต่คุณต้องอ่านมากกว่าหนึ่งครั้ง

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

หากคุณต้องการอัตรามากกว่า 5 วินาทีคุณจะอ่านไฟล์หนึ่งครั้งพักเป็นเวลา 5 วินาทีอ่านอีกครั้งรับความแตกต่างของการคำนวณและหารด้วย 5


6

วิธีการของคุณถูกต้อง คุณสามารถใช้ / proc / stat เป็นข้อมูลดิบและฟีดเช่น rrdtool กับมัน ฉันทำอะไรแบบนี้แล้วฉันรู้ว่ามันเป็นไปได้ 100% คุณสามารถทำกราฟโหลดทั้งระบบหรือแต่ละคอร์ได้ทีละอย่าง

นี่คือตัวอย่างการทำงานของฉันเอง: ป้อนคำอธิบายรูปภาพที่นี่

การอ้างใหม่ -> คุณสามารถทำได้ไม่ใช่เรื่องยากเพียงแค่คณิตศาสตร์พื้นฐานและกราฟของฉันเป็นตัวอย่างจริงของสิ่งนั้น สำหรับการรวบรวมข้อมูลฉันทำสแน็ปช็อตของ / proc / stat ไปยังไฟล์ชั่วคราวโลคัลบน ramdisk จากนั้นฉันแยกวิเคราะห์ไฟล์นั้นเพื่อรวบรวมข้อมูลทุก 1 นาที

ฉันจะแยกวิเคราะห์ข้อมูล (ส่วนของสคริปต์ทุบตี):

cat=/bin/cat # others defined the same way
......

$cat /proc/stat > /ramdisk/tmp/stat

ssCpuRawUser=`$cat /ramdisk/tmp/stat|$grep "cpu " | $awk '{print $2}'`
ssCpuRawNice=`$cat /ramdisk/tmp/stat|$grep "cpu " | $awk '{print $3}'`
    #other columns follow ....... 

#the most important there is that it is an incrementing COUNTER.
if [ ! -f ${data_dir}/sys.cpu.rrd ];then
        $rrdtool create ${data_dir}/sys.cpu.rrd -s 60 \
        DS:ssCpuRawUser:COUNTER:300:0:1250000 \
        DS:ssCpuRawNice:COUNTER:300:0:1250000 \
        DS:ssCpuRawSystem:COUNTER:300:0:1250000 \
        DS:ssCpuRawIdle:COUNTER:300:0:1250000 \
        DS:ssCpuRawIOwait:COUNTER:300:0:1250000 \
        DS:ssCpuRawIRQ:COUNTER:300:0:1250000 \
        DS:ssCpuRawSoftIRQ:COUNTER:300:0:1250000 \
            RRA:AVERAGE:0.5:1:532800

fi

$rrdtool update ${data_dir}/sys.cpu.rrd N:$ssCpuRawUser:$ssCpuRawNice:$ssCpuRawSystem:$ssCpuRawIdle:$ssCpuRawIOwait:$ssCpuRawIRQ:$ssCpuRawSoftIRQ

# then in a loop each core the same way until all are parsed.

หลังจากที่คุณได้รับข้อมูลลงในฐานข้อมูล rrd คุณสามารถสร้างกราฟและท้องฟ้าได้อย่างไม่ จำกัด :) http://oss.oetiker.ch/rrdtool/doc/rrdgraph.en.html


คุณแยกวิเคราะห์ข้อมูลอย่างไร
ewwhite

@ewwhite -> ฉันแก้ไขคำตอบเพื่อแสดงวิธีแยกวิเคราะห์ข้อมูล
Bartłomiej Zarzecki

กราฟที่สวยงาม! เกี่ยวกับคำอธิบายประกอบคอลัมน์ของคุณขาดหายไป: askubuntu.com/a/120961/451886 ถ้ามันทำงานใน VM อาจเป็นตัวนับ "ขโมย"
rkagerer

+1 สำหรับ rrdtool และ ramdisk!
Shadi

4

หากคุณต้องการใช้บริการแบบออนไลน์อาจมีลักษณะเช่นนี้:

echo $(echo '100'; echo $(echo '(';head -1 /proc/stat | awk '{print $5}'; sleep 1; echo '-';head -1 /proc/stat |  awk '{print $5}';echo ')/100') | bc -l) | bc -l

ผลลัพธ์: 97.17000000000000000000

มันทำงานอย่างไร:

echo $(echo '(';head -1 /proc/stat | awk '{print $5}'; sleep 1; echo '-';head -1 /proc/stat |  awk '{print $5}';echo ')/100')

ผลิต( 1055057784 - 1055058055 )/100แล้วฟีดบรรทัดนี้เพื่อ bc จะมีสิ่งที่ชอบ-7.84000000000000000000แล้วเพียงห่อมัน100-$(value)และป้อนให้กับ bc อีกครั้ง

ที่นั่น: sleep #- 1 วินาทีล่าช้าหากคุณเปลี่ยนค่านี้ผลลัพธ์กลางจะถูกหารด้วยจำนวนวินาที $5- ฟิลด์ที่ 5 อ้างอิงจากman procและhttp://www.linuxhowtos.org/System/procstat.htm

โปรดแจ้งให้เราทราบหากสิ่งนี้ไม่ได้ผลสำหรับคุณ


0

หรือถ้าคุณมีความสุขกับตัวเลขสองหลักหลังจากจุด awk สามารถทำได้ง่ายขึ้นและอ่านง่ายขึ้น:

 awk -v oldidle=$(awk '/cpu / {print $5}' /proc/stat; sleep 1) '/cpu / {perc=100-($5-oldidle)/100 ; printf "%s", perc}' /proc/stat
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.