On 8/23/21 10:25 PM, Emanuel Berg wrote:
David Christensen wrote:
For a CPU with N cores (N=4 for an AMD Ryzen 3 3200G?) and
an otherwise unloaded system, your test procedure should be
something like:
loop over governor choices
set governor
loop 3 times
sleep 60 seconds
print statistics
endloop
loop from 1 to N
start background process
loop 10 times
sleep 6 seconds
print statistics
endloop
endloop
kill all background processes
endloop
"print statistics" should include time, governor setting,
number of background processes running, and CPU temperature.
If would be nice to also include system loading percent, CPU
frequency, and CPU fan speed.
Okay, what about
#! /bin/zsh
#
# this file:
# https://dataswamp.org/~incal/conf/.zsh/cpu
cpu-stats () {
local time=$(date +%s)
local gov=$(cpufreq-info -p | awk '{print $3}')
local back=$(jobs -l | wc -l)
local temp=$(sensors -j | jq -a '.["k10temp-pci-00c3"].Tdie.temp1_input')
local cores=$(getconf _NPROCESSORS_ONLN)
local avg=$(awk '{print $1}' /proc/loadavg)
local load=$(( $avg * 100/$cores ))
local freq=("${(@f)$(awk '/cpu MHz/{print $4}' /proc/cpuinfo)}")
local fan=$(sensors | awk '/cpu_fan/{print $2 " RPM"}')
echo "time ${time}"
echo "governor ${gov}"
echo "background processes ${back}"
echo "CPU temperature ${temp}C"
printf "system load %.1f%%\n" $load
echo "CPU fan speed ${fan}"
echo -n "CPU frequencies "
for f in $freq; do
echo -n "$f "
done
echo "MHz"
}
test-cpu () {
local cores=$(getconf _NPROCESSORS_ONLN)
local pids=()
local g
for g in $(cpufreq-info -g); do
sudo cpufreq-set -g $g
repeat 3 {
sleep 60
cpu-stats
}
repeat $cores {
perl -e '1 while 1' &
pids+=($!)
repeat 10 {
sleep 6
cpu-stats
}
}
done
for p in $pids; do
kill $p
done
}
I would output a header line and then output each set of statistics on a
single line. Fixed-width pretty-printing may involve a lot of
programmer effort, both to generate and to parse later. ASCII comma- or
tab-separated value (CSV/TSV) format is open source, mostly human
readable, easier on the programmer, readily ported between platforms,
and can be fed into other programs (such as LibreOffice Calc, scripts,
databases, etc.).
I would avoid doing any math on the data. Save raw values and deal with
math in post-processing:
local cores=$(getconf _NPROCESSORS_ONLN)
local load=$(( $avg * 100/$cores ))
I would put units into the headers. Save raw values and deal with units
in post processing:
echo "CPU temperature ${temp}C"
David