Pertanyaan Membaca penggunaan CPU


Saya sedang membangun monitor sumber daya berbasis web Linux.

Untuk saat ini saya berharap untuk menggunakan:

  • df untuk membaca status penggunaan HDD
  • /proc/meminfo (melalui kucing) untuk membaca status RAM
  • mpstat (dari paket sysstat) untuk membaca penggunaan CPU

Selagi df dan /proc/meminfo mengembalikan data hampir seketika, mpstat penundaan untuk interval yang saya tentukan - dengan nilai minimum yang diterima adalah 1 (dalam detik).

Apakah ada pembaca penggunaan CPU waktu nyata, atau apakah ada cara untuk membuatnya mpstat kembali "langsung"?

output mpstat:

[psycketom@stone ~]# mpstat -P ALL 1 1
Linux 3.5.4-1-ARCH (stone)      03/05/2013      _x86_64_        (1 CPU)

11:33:15 AM  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest  %gnice   %idle
11:33:16 AM  all    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00
11:33:16 AM    0    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00

Average:     CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest  %gnice   %idle
Average:     all    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00
Average:       0    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00

2
2018-03-05 07:33


asal


Saya tidak tahu mpstat. Bisakah Anda memberikan contoh hasil, silakan? - mpy
@mpy, Q diperbarui dengan contoh. - joltmode
Aku s top tidak sesuai dengan tujuan Anda karena alasan tertentu? - Joseph R.
Saya mencari output langsung ke STDOUT, yang saya bisa grep. top jajak pendapat terus menerus. - joltmode


Jawaban:


Kamu dapat memakai top dalam mode batch dan satu iterasi:

top -bn 1

Saya juga akan menggunakan free bukannya parsing meminfo.

Cara lain adalah menggunakan ps, tambahkan% CPU dari setiap proses dan bagi dengan jumlah core yang dimiliki mesin Anda:

ps axo pcpu | 
 gawk -v cores=`grep -m 1 cores /proc/cpuinfo | cut -d ' ' -f 3` \
      -v cpus=`grep -c processor /proc/cpuinfo` \
         '{k+=$1}END{print k/(cores * cpus);}'

Jika sistem Anda hanya memiliki satu inti, skrip di atas akan gagal, menghasilkan:

gawk: cmd. line:1: (FILENAME=- FNR=83) fatal: division by zero attempted

Untuk membuatnya berjalan, ubah k/(cores * cpus) untuk k/(cores==""?1:cores * cpus). Ini akan memeriksa apakah cores variabel tidak kosong, jika ya, 1 akan digunakan sebagai gantinya.


4
2018-03-05 11:03



Terima kasih untuk free tip, dan sepertinya saya akan tetap dengan top kemudian. Diterima! - joltmode
Hmm, menurut saya, itu top tidak mencerminkan penggunaan sebenarnya. Saya membuat sekitar 60 permintaan web ke server, dan semuanya tetap pada 97,7% kosong, meskipun tabel menunjukkan penggunaan sebesar 5,8% untuk top. Maksud saya, itu menunjukkan 97,7% di header %Cpu(s): 1.5 us, 0.6 sy, 0.1 ni, 97.7 id, 0.1 wa, 0.0 hi, 0.0 si, 0.0 st. Apakah saya harus membaca total penggunaan dari tempat lain atau harus saya hitung di bagian saya? - joltmode
@psycketom Tabel tersebut menunjukkan 5.8% penggunaan a tunggal inti untuk top. Persentase untuk setiap inti individu. Jadi jika foo mengambil 40% dari inti tunggal mesin 2-inti, top akan muncul 40% untuk footidak 20% seperti yang Anda harapkan. Lihat juga jawaban saya yang diperbarui untuk cara lain untuk mendapatkan penggunaan yang sebenarnya. - terdon
Karena sistem saya hanya memiliki satu inti, ini berakhir dengan kesalahan. Berubah menjadi k/(cores==""?1:cores * cpus) memperbaiki masalah. - joltmode