[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: smart fans



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


Reply to: