Bagaimana saya bisa menerima statistik CPU paling disukai dari shell?

12

Saya mencoba mendapatkan pembacaan akurat dari CPU bekas saya (dalam persen) dari top. Ini adalah perintah yang saya jalankan untuk pengujian:

top -n1 | awk '/Cpu\(s\):/ {print $2}'

Ini mengembalikan:

10.7%us,

Yang merupakan bagian data yang tepat yang saya inginkan. Namun, setiap kali saya menjalankan perintah saya mendapatkan output yang sama, meskipun saya menerapkan beban yang berbeda pada sistem saya (dan belum lagi htopmemberitahu saya bahwa penggunaan saya berbeda). Tampaknya setiap kali saya memulai top, penggunaan CPU saya sama. Hanya setelah beberapa bingkai yang memberi saya nilai yang tepat.

Sepertinya saya tidak dapat mengurai output top dengan cara ini, jadi saya mencari aplikasi andal lainnya yang akan memberi saya pembacaan yang akurat dari shell. Saya sangat suka bagaimana htopbisa memberi saya bacaan inti.

Saya sudah mencoba iostatdan mpstattetapi mereka tampaknya memberikan nilai-nilai yang tidak akurat dan "lambat untuk berubah".

n0pe
sumber
2
Jangan. Pertanyaan yang tepat untuk ditanyakan adalah: Bagaimana cara mendapatkan statistik penggunaan CPU seperti-top dari shell?
Stéphane Gimenez
@ StéphaneGimenez terima kasih saya mengubah pertanyaan saya
n0pe

Jawaban:

12

Saya menggunakan skrip ini (dari utas ini di papan Lengkungan ):

#!/bin/bash
read cpu a b c previdle rest < /proc/stat
prevtotal=$((a+b+c+previdle))
sleep 0.5
read cpu a b c idle rest < /proc/stat
total=$((a+b+c+idle))
CPU=$((100*( (total-prevtotal) - (idle-previdle) ) / (total-prevtotal) ))
jasonwryan
sumber
Linux memiliki beberapa info hebat di / proc / - lihat linux.die.net/man/5/proc untuk semua barangnya . Berhati-hatilah karena ini hanya Linux. Sebenarnya tidak ada cara lintas platform untuk mendapatkan informasi itu kecuali Anda menggunakan perpustakaan seperti Sigar .
Pat Notz
Idenya bagus, tetapi beberapa detailnya tidak benar. Nilai idle adalah kolom ke-5, dan Anda juga harus menambahkan kolom iowait (kolom ke-6) untuk mendapatkan persentase yang masuk akal. Agar sepenuhnya benar, Anda harus menambahkan semua nilai "sisanya" juga, tetapi seringkali sangat kecil.
Peter Eisentraut
Nilai diam adalah kolom kelima, jika Anda menghitung kolom "cpu". Kalau tidak, ini yang keempat.
SunSparc
6

Lihat sar , juga. Implementasi dapat sangat bervariasi dari nix ke nix, tetapi harus memberi Anda statistik sistem dasar, pada snapshot yang diberikan. Saya tidak yakin seberapa akurat nilai-nilai berada di titik di mana perintah pertama diinisialisasi, tetapi Anda mungkin bermain-main untuk melihat bagaimana membandingkan top, iostat, dll

Outputnya berbasis kolom, seperti top, jadi Anda harus bisa menyalurkan output ke awkatau cutmemanipulasi hasilnya.

tcdyl
sumber
Saya sudah mencoba sarsebelumnya dengan hasil yang beragam. Aku akan pergi dengan jawaban @ jasonwryan di sini karena saya dapat dengan mudah memodifikasinya untuk mewakili penggunaan dengan kedua core CPU saya.
n0pe
0

Apa yang saya temukan mirip dengan orang yang mengajukan pertanyaan di atas, setidaknya pada CentOS 6. Jika saya menjalankan teratas dalam mode batch untuk hanya satu iterasi, tampaknya mengumpulkan angka yang sama, hampir seolah-olah kecenderungannya adalah memulai dengan apa itu terakhir ingat menampilkan. Top tampaknya perlu mengakumulasikan setidaknya beberapa angka untuk mendapatkan delta yang memberi Anda persentase yang benar. Setelah menguji lebih dari 10 iterasi, saya menemukan bahwa angka kedua yang muncul menunjukkan diferensiasi yang cukup pada setiap proses. Jadi, cukup mudah untuk mendapatkan jalur ini melalui

top -b -n 2 | grep Cpu | tail -1

Saya suka menggabungkan ini dengan uptime untuk memuat dan filter grep dari proses pilih dari ps, seperti pertanyaan postgres. Monitor yang sangat sederhana dapat diekspresikan dengan alias:

alias postgresmon="watch -d 'uptime;top -b -n 2 | grep Cpu | tail -1;ps -ef | grep postgres\: | grep -v idle'"
Robert Casey
sumber