Apakah ada cara untuk menghitung persentase pemanfaatan CPU dengan membaca / proc / stat sekaligus?

12

Saya kira pertanyaannya adalah, bisakah saya menghitung persentase utilisasi CPU hanya dengan membaca / proc / stat sekali?

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

Saya berpikir tentang meringkas kolom kecuali IOWait (saya sedang membaca di suatu tempat yang dihitung dalam idle) dan itu akan memberi saya 100% dan setiap kolom individu dapat diubah menjadi persentase dengan (kolom / 100_percent) * 100.

  • pengguna: proses normal yang dijalankan dalam mode pengguna
  • nice: proses es yang dijalankan dalam mode pengguna
  • sistem: proses yang dijalankan dalam mode kernel
  • idle: twiddling thumbs
  • iowait: menunggu I / O selesai
  • irq: servis interupsi
  • softirq: melayani softirqs
  • mencuri: menunggu tanpa disengaja
  • tamu: menjalankan tamu normal
  • guest_nice: menjalankan guest niced

Apakah ini pendekatan yang layak atau saya benar-benar keluar jalur?

Istvan
sumber

Jawaban:

11

Anda berada di jalur yang benar, topmenggunakan file ini untuk tujuan ini. Tetapi Anda perlu membacanya lebih dari sekali.

Pemanfaatan adalah ukuran penggunaan dari waktu ke waktu. Anda dapat membacanya begitu memberikan Anda tahu waktu aktif dalam hitungan detik dari host, kemudian membaginya dengan itu, tetapi itu akan memberi Anda tingkat utilitas host sejak mesin itu di-boot.

Jika Anda menginginkan nilai lebih dari 5 detik, Anda akan membaca file sekali, tidur selama 5 detik, membacanya lagi, mendapatkan perbedaan perhitungan dan membaginya dengan 5.

Matthew Ife
sumber
6

Pendekatan Anda benar. Anda dapat menggunakan / proc / stat sebagai data mentah dan memberi makan misalnya rrdtool dengannya. Saya sudah melakukan sendiri sesuatu seperti ini jadi saya tahu 100% itu mungkin. Anda dapat dengan baik membuat grafik seluruh beban sistem atau setiap inti secara terpisah.

Ini adalah contoh kerja saya sendiri: masukkan deskripsi gambar di sini

Reassuming -> Anda dapat melakukannya, tidak sulit hanya matematika dasar dan grafik saya adalah contoh langsung dari itu. Untuk mengumpulkan data, saya melakukan snapshot / proc / stat ke file temporer yang dilokalkan pada ramdisk dan kemudian saya parsing file itu untuk mengumpulkan data setiap 1 menit.

cara saya mengurai data (fragmen skrip bash):

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.

setelah Anda mendapatkan data ke dalam database rrd Anda dapat membuat grafik dan langit adalah batasnya :) http://oss.oetiker.ch/rrdtool/doc/rrdgraph.en.html

Bartłomiej Zarzecki
sumber
Bagaimana Anda mengurai data?
ewwhite
@ewwhite -> Saya mengedit jawaban saya untuk menunjukkan bagaimana saya mengurai data.
Bartłomiej Zarzecki
Grafik yang indah! Mengenai anotasi kolom Anda yang hilang: askubuntu.com/a/120961/451886 . Jika itu berjalan di VM, mungkin itu counter "mencuri".
rkagerer
+1 untuk rrdtool dan ramdisk!
shadi
4

Jika Anda ingin oneliner, tampilannya mungkin seperti ini:

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

Hasil: 97.17000000000000000000

Bagaimana itu bekerja:

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

menghasilkan ( 1055057784 - 1055058055 )/100kemudian umpan baris ini ke bc. Akan memiliki sesuatu seperti -7.84000000000000000000, kemudian hanya membungkusnya 100-$(value)dan memberi makan ke bc lagi

Ada: sleep #- 1 detik keterlambatan, jika Anda mengubah nilai ini maka hasil antara harus dibagi ke jumlah detik. $5- Bidang ke-5, menurut man procdan http://www.linuxhowtos.org/System/procstat.htm

Tolong beri tahu saya jika ini tidak berhasil untuk Anda.

Putnik
sumber
0

Atau jika Anda senang dengan hanya dua digit setelah titik awk dapat melakukan semuanya lebih sederhana dan lebih mudah dibaca:

 awk -v oldidle=$(awk '/cpu / {print $5}' /proc/stat; sleep 1) '/cpu / {perc=100-($5-oldidle)/100 ; printf "%s", perc}' /proc/stat
Slaxor
sumber