Grafana 12 Causes 100% CPU on Raspberry Pi – How to Fix It
If you are running Grafana on a Raspberry Pi with the latest Docker tag and notice extreme CPU usage, sluggish dashboards, or Cloudflare returning a 524 timeout – this post is for you.
What Happened
After running Grafana on my RPi 4 for several weeks, I updated my containers and pulled the latest Grafana image. Within minutes, the system load went from ~1.0 to 7.0+. Grafana requests were taking 5–8 minutes instead of milliseconds. The Cloudflare Tunnel to Grafana started returning 524 timeout errors.
The logs were full of:
dashboard-service: No last resource version found, starting from scratch
cleaning up inactive secure values: context deadline exceeded
grafana-apiserver: Timeout or abort while handling
And worst of all – block I/O was at 6+ TB read over 7 weeks, meaning Grafana was hammering the disk constantly.
The Cause
Grafana 12 introduced a new internal Kubernetes-like API server (the “unified storage” system). On ARM hardware like the Raspberry Pi, this new system causes severe performance issues. The API server creates constant background processes that the RPi simply cannot handle with many containers running.
This is a known issue affecting ARM/RPi users running Grafana 12.x.
The Fix
Pin your Grafana Docker image to version 10.4.3, which is an LTS release without these ARM issues:
# docker-compose.yml
grafana:
image: grafana/grafana:10.4.3 # not latest
Then recreate the container:
docker stop grafana && docker rm grafana
docker compose up -d grafana
After pinning to 10.4.3:
- Load average dropped back to ~1.0
- Grafana response time: under 1 second
- No more disk hammering
Important Note About Dashboards
If you downgrade from Grafana 12 to 10.4.3, your dashboards stored in the Grafana database will be lost (the storage format changed). You will need to re-import them by ID:
| Dashboard | ID |
|---|---|
| Node Exporter Full | 1860 |
| Docker Monitoring | 11074 |
| Speedtest Exporter | 13665 |
Your Prometheus data (the actual metrics) is stored separately and will not be affected.
Takeaway
Always pin your Docker image versions in production. The latest tag is convenient but can pull breaking changes. For ARM/RPi setups in particular, stick to tested LTS versions.
# Good practice
image: grafana/grafana:10.4.3
# Avoid in production
image: grafana/grafana:latest