Penggunaan atau pemanfaatan prosesor adalah pengukuran dari waktu ke waktu. Salah satu cara untuk mengukur penggunaan di %
adalah dengan perhitungan selama dua pembacaan berturut-turut dari /proc/stat
. Skrip bash umum sederhana untuk menghitung persentase adalah:
#!/bin/bash
# Read /proc/stat file (for first datapoint)
read cpu user nice system idle iowait irq softirq steal guest< /proc/stat
# compute active and total utilizations
cpu_active_prev=$((user+system+nice+softirq+steal))
cpu_total_prev=$((user+system+nice+softirq+steal+idle+iowait))
usleep 50000
# Read /proc/stat file (for second datapoint)
read cpu user nice system idle iowait irq softirq steal guest< /proc/stat
# compute active and total utilizations
cpu_active_cur=$((user+system+nice+softirq+steal))
cpu_total_cur=$((user+system+nice+softirq+steal+idle+iowait))
# compute CPU utilization (%)
cpu_util=$((100*( cpu_active_cur-cpu_active_prev ) / (cpu_total_cur-cpu_total_prev) ))
printf " Current CPU Utilization : %s\n" "$cpu_util"
exit 0
gunakan/keluaran:
$ bash procstat-cpu.sh
Current CPU Utilization : 10
menghasilkan lebih dari 5 iterasi:
$ ( declare -i cnt=0; while [ "$cnt" -lt 5 ]; do bash procstat-cpu.sh; ((cnt++)); done )
Current CPU Utilization : 20
Current CPU Utilization : 18
Current CPU Utilization : 18
Current CPU Utilization : 18
Current CPU Utilization : 18
top -bn1 | sed -n '/Cpu/p'
berikan baris berikut
Cpu(s): 15.4%us, 5.3%sy, 0.0%ni, 78.6%id, 0.5%wa, 0.0%hi, 0.1%si, 0.0%st
Anda dapat menarik bidang CPU apa pun dengan yang berikut akan mengambil pengguna CPU (AS)
top -bn1 | sed -n '/Cpu/p' | awk '{print $2}' | sed 's/..,//'
Keluaran:
15.4%
Jika Anda menginginkan bidang lain seperti sistem CPU (sy) Anda dapat mengubah bidang awk dari $2,
top -bn1 | sed -n '/Cpu/p' | awk '{print $3}' | sed 's/..,//'
Keluaran:
5.3%
Jika Anda menginginkan CPU lain:
us: user CPU used by user processes
sy: system CPU used by system/kernel processes
ni: nice CPU used by processes that were reniced
id: idle CPU not used
wa: io wait Essentially idle CPU waiting on IO devices
hi: hardware irq CPU used to service hardware IRQs
si: software irq CPU used to service soft IRQs
st: steal time CPU time which the hypervisor dedicated (or ‘stole’) for other guests in the system.
Untuk mendapatkan total persentase penggunaan sejak mengaktifkan sistem:
awk '/cpu /{print 100*($2+$4)/($2+$4+$5)}' /proc/stat
Untuk mendapatkan persentase penggunaan selama detik terakhir:
awk -v a="$(awk '/cpu /{print $2+$4,$2+$4+$5}' /proc/stat; sleep 1)" '/cpu /{split(a,b," "); print 100*($2+$4-b[1])/($2+$4+$5-b[2])}' /proc/stat
Penjelasan
Dari man 5 proc
, arti dari empat angka pertama pada baris cpu di /proc/stat
diberikan oleh:
cpu 3357 0 4313 1362393
Jumlah waktu, diukur dalam satuan USER_HZ (1/100 per detik pada sebagian besar arsitektur, gunakan sysconf(_SC_CLK_TCK) untuk mendapatkan nilai yang tepat), yang dihabiskan sistem dalam mode pengguna, mode pengguna dengan prioritas rendah (bagus), sistem mode, dan tugas menganggur, masing-masing. Nilai terakhir harus USER_HZ kali entri kedua dalam file uptimepseudo.
Untuk mendapatkan penggunaan CPU, kami menambahkan waktu pengguna dan sistem dan membaginya dengan total waktu pengguna, sistem, dan waktu diam.
Mari kita lihat kembali perhitungan total penggunaan CPU sejak sistem aktif:
awk '/cpu /{print 100*($2+$4)/($2+$4+$5)}' /proc/stat
Dengan mengharuskan baris cocok dengan cpu
, kami mendapatkan total sistem. Kolom kedua adalah waktu pengguna, kolom keempat adalah waktu sistem, dan kolom kelima adalah waktu idle. Rasio dikalikan dengan 100 untuk mendapatkan persentase.
Sekarang, mari pertimbangkan penggunaan CPU baru-baru ini:
awk -v a="$(awk '/cpu /{print $2+$4,$2+$4+$5}' /proc/stat; sleep 1)" '/cpu /{split(a,b," "); print 100*($2+$4-b[1])/($2+$4+$5-b[2])}' /proc/stat
Ini membaca /proc/cpu
dua kali, terpisah satu detik. Pertama kali, pengguna CPU + sistem, dan pengguna + sistem + waktu idle disimpan dalam variabel a
. sleep
dipanggil untuk menunda sebentar. Lalu, /proc/cpu
dibaca untuk kedua kalinya. Total pengguna + sistem lama dikurangi dari total baru dan dibagi dengan perubahan total sepanjang waktu. Hasilnya dikalikan 100 untuk mengubahnya menjadi persen dan dicetak.