Skip to content

Instantly share code, notes, and snippets.

Last active August 16, 2023 12:34
  • Star 44 You must be signed in to star a gist
  • Fork 10 You must be signed in to fork a gist
Star You must be signed in to star a gist
What would you like to do?
Raspberry Pi CPU temperature and throttling test script
# 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 ./
# Variables.
# 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
printf "Logging temperature and throttling data to: $test_results_file\n"
# Start logging temperature data in the background.
while /bin/true; do
# Print the date (e.g. "Wed 13 Nov 18:24:45 GMT 2019") and a tab.
date | tr '\n' '\t' >> $test_results_file;
# Print the temperature (e.g. "39.0") and a tab.
vcgencmd measure_temp | tr -d "temp=" | tr -d "'C" | tr '\n' '\t' >> $test_results_file;
# Print the throttle status (e.g. "0x0") and a tab.
vcgencmd get_throttled | tr -d "throttled=" | tr '\n' '\t' >> $test_results_file;
# Print the current CPU frequency.
vcgencmd measure_clock arm | sed 's/^.*=//' >> $test_results_file;
sleep 5;
done &
# Store the logging pid.
# 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"
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"
Copy link

Question: how did you generated the images from the logging data? Is there any nice script for that?

Copy link

@MestreLion - I think for that I just dumped the CSV into Google Sheets and generated graphs there. Something I'd like to automate more in the future though.

Copy link

@MestreLion - Also, updated the script to use ${HOME} and trap. Thanks for the suggestions!

Copy link

geerlingguy commented Jun 9, 2021

I also wanted to get the current value from the new PoE+ HAT during a run today, so I added the following above the 'throttle status' section:

  # Print the current current (e.g. 536000) and a tab.
  cat /sys/devices/platform/rpi-poe-power-supply@0/power_supply/rpi-poe/current_now | tr '\n' '\t' >> $test_results_file;

This outputs a value in microamps.

Copy link

pyro12 commented Jul 23, 2021

Great little script! I'm trying to figure out why HTML5 streaming is disappointing on my Pi4b and I thought maybe throttling was the issue. I ran this and temps never report above 71 so I think I'm good, but I also found this: and I'm unclear on whether your script is logging CPU or GPU temps.... or if we can expect them to be pretty much the same...

If that link is correct, you're logging GPU temps and to also log CPU temp

echo temp=$((cat /sys/class/thermal/thermal_zone0/temp/1000)).0\'C | tr -d "temp=" | tr -d "'C" | tr '\n' '\t' >> $test_results_file;

needs to be added.

Copy link

@pyro12 - According to the Pi's documentation, measure_temp "Returns the temperature of the SoC as measured by the on-board temperature sensor." — that seems to be the only reading that really matters for throttling (it's the SoC temp). Are you seeing different numbers when checking thermal_zone0?

Copy link

pyro12 commented Jul 31, 2021

@geerlingguy - Nope. I ran

while true 
vcgencmd measure_temp | tr -d "temp=" | tr -d "'C" | tr '\n' '\t'
echo temp=$((`cat /sys/class/thermal/thermal_zone0/temp`/1000)).0\'C
sleep 10

via SSH and tried various uses of stress-ng and glxgears and the biggest difference I saw was 1.4 C. A curiousity, but I don't think relevant...

Thanks for helping me understand!

Copy link

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment