mirror of
https://codeberg.org/dnkl/yambar.git
synced 2025-04-19 19:25:41 +02:00
examples: scripts: cpu: fix idle and total calculation
* include iowait in idle * guest/guestnice is accounted in user/nice, so need to subtract them to not count them twice
This commit is contained in:
parent
4a9f550069
commit
9718c6f31e
1 changed files with 24 additions and 17 deletions
|
@ -65,8 +65,6 @@ while true; do
|
||||||
IFS=$'\n' readarray -t all_cpu_stats < <(grep -e "^cpu" /proc/stat)
|
IFS=$'\n' readarray -t all_cpu_stats < <(grep -e "^cpu" /proc/stat)
|
||||||
|
|
||||||
usage=() # CPU usage in percent, 0 <= x <= 100
|
usage=() # CPU usage in percent, 0 <= x <= 100
|
||||||
idle=() # idle time since boot, in jiffies
|
|
||||||
total=() # total time since boot, in jiffies
|
|
||||||
|
|
||||||
average_idle=0 # All CPUs idle time since boot
|
average_idle=0 # All CPUs idle time since boot
|
||||||
average_total=0 # All CPUs total time since boot
|
average_total=0 # All CPUs total time since boot
|
||||||
|
@ -75,28 +73,37 @@ while true; do
|
||||||
# Split this CPUs stats into an array
|
# Split this CPUs stats into an array
|
||||||
stats=($(echo "${all_cpu_stats[$((i + 1))]}"))
|
stats=($(echo "${all_cpu_stats[$((i + 1))]}"))
|
||||||
|
|
||||||
# Clear (zero out) “cpuN”
|
# man procfs(5)
|
||||||
unset "stats[0]"
|
user=${stats[1]}
|
||||||
|
nice=${stats[2]}
|
||||||
|
system=${stats[3]}
|
||||||
|
idle=${stats[4]}
|
||||||
|
iowait=${stats[5]}
|
||||||
|
irq=${stats[6]}
|
||||||
|
softirq=${stats[7]}
|
||||||
|
steal=${stats[8]}
|
||||||
|
guest=${stats[9]}
|
||||||
|
guestnice=${stats[10]}
|
||||||
|
|
||||||
# CPU idle time since boot
|
# Guest time already accounted for in user
|
||||||
idle[i]=${stats[4]}
|
user=$((user - guest))
|
||||||
average_idle=$((average_idle + idle[i]))
|
nice=$((nice - guestnice))
|
||||||
|
|
||||||
# CPU total time since boot
|
idle=$((idle + iowait))
|
||||||
total[i]=0
|
|
||||||
for v in "${stats[@]}"; do
|
total=$((user + nice + system + irq + softirq + idle + steal + guest + guestnice))
|
||||||
total[i]=$((total[i] + v))
|
|
||||||
done
|
average_idle=$((average_idle + idle))
|
||||||
average_total=$((average_total + total[i]))
|
average_total=$((average_total + total))
|
||||||
|
|
||||||
# Diff since last sample
|
# Diff since last sample
|
||||||
diff_idle=$((idle[i] - prev_idle[i]))
|
diff_idle=$((idle - prev_idle[i]))
|
||||||
diff_total=$((total[i] - prev_total[i]))
|
diff_total=$((total - prev_total[i]))
|
||||||
|
|
||||||
usage[i]=$((100 * (diff_total - diff_idle) / diff_total))
|
usage[i]=$((100 * (diff_total - diff_idle) / diff_total))
|
||||||
|
|
||||||
prev_idle[i]=${idle[i]}
|
prev_idle[i]=${idle}
|
||||||
prev_total[i]=${total[i]}
|
prev_total[i]=${total}
|
||||||
done
|
done
|
||||||
|
|
||||||
diff_average_idle=$((average_idle - prev_average_idle))
|
diff_average_idle=$((average_idle - prev_average_idle))
|
||||||
|
|
Loading…
Add table
Reference in a new issue