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:
Daniel Eklöf 2020-11-15 12:15:16 +01:00
parent 4a9f550069
commit 9718c6f31e
No known key found for this signature in database
GPG key ID: 5BBD4992C116573F

View file

@ -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))