Last active
September 18, 2024 17:26
-
-
Save geerlingguy/91d4736afe9321cbfc1062165188dda4 to your computer and use it in GitHub Desktop.
Raspberry Pi CPU temperature and throttling test script
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/bin/bash | |
# Raspberry Pi stress CPU temperature measurement script. | |
# | |
# Download this script (e.g. with wget) and give it execute permissions (chmod +x). | |
# Then run it with ./pi-cpu-stress.sh | |
# | |
# NOTE: In recent years, I've switched to using s-tui. See: | |
# https://github.com/amanusk/s-tui?tab=readme-ov-file#options | |
# Variables. | |
test_run=1 | |
test_results_file="${HOME}/cpu_temp_$test_run.log" | |
stress_length="10m" | |
# Verify stress-ng is installed. | |
if ! [ -x "$(command -v stress-ng)" ]; then | |
printf "Error: stress-ng not installed.\n" | |
printf "To install: sudo apt install -y stress-ng\n" >&2 | |
exit 1 | |
fi | |
printf "Logging temperature and throttling data to: $test_results_file\n" | |
# Start logging temperature data in the background. | |
while /bin/true; do | |
line=$(date | tr '\n' '\t') | |
line+=$(vcgencmd measure_temp | tr -d "temp=" | tr -d "'C" | tr '\n' '\t') | |
line+=$(vcgencmd get_throttled | tr -d "throttled=" | tr '\n' '\t') | |
line+=$(vcgencmd measure_clock arm | sed 's/^.*=//') | |
echo $line | |
echo $line >> $test_results_file | |
sleep 5 | |
done & | |
# Store the logging pid. | |
PROC_ID=$! | |
# Stop the logging loop if script is interrupted or when it ends. | |
trap "kill $PROC_ID" EXIT | |
# After 5 minutes, run stress. | |
printf "Waiting 5 minutes for stable idle temperature...\n" | |
printf "Date °C Status CPU Clock\n" | |
sleep 300 | |
printf "Beginning $stress_length stress test...\n" | |
stress-ng -c 4 --timeout $stress_length | |
# Keep logging for 5 more minutes. | |
printf "Waiting 5 minutes to return to idle temperature...\n" | |
sleep 300 | |
printf "Test complete.\n" |
I am using following script to record temperature :
from gpiozero import CPUTemperature
from time import sleep, strftime, time
cpu = CPUTemperature()
count=1200 # 20 minutes
with open("/home/pi/temp_log.csv", "a") as log:
while True:
temp = cpu.temperature
log.write("{0},{1}".format(strftime("%Y-%m-%d %H:%M:%S"), str(temp)))
sleep(1)
count -= 1
if count == 0:
break
and using sysbench in a loop:
#!/bin/bash
while true;
do
sysbench --test=cpu --cpu-max-prime=20000 --threads=4 run
sleep 0.1
done
and it works fine.
Question: how did you generated the images from the logging data? Is there any nice script for that?
maybe it can be plot by using matplotlib library.
For those like me that absolutely are newbies with Linux and Pi, this is the command to download the latest version of this file from the CLI:
curl -L https://gist.github.com/geerlingguy/91d4736afe9321cbfc1062165188dda4/raw/ -o _filename.extension_
I updated the script today to output the lines to screen before they're written to the file (helps to also see if the Pi locked up since it will stop printing data). lmk if you'd like that to be a flag so it can be disabled (like -q
for quiet).
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Weird! I'm surprised there would be that much of a difference. And now I'm wondering if there are multiple temperature sensors in the SoC :)