This is total overkill. But it’s fun and makes the Pi 4 quite zippy! Here’s a description of my setup on one of the Raspberry Pi 4’s around here.
I’m using the following parts in addition to a Pi 4:
- 52Pi Ice Tower heatsink
- Noctua NF-A4x10 5V, 3-pin (40x10mm, Brown)
- Superglue to attach the Noctua to the back of the 52Pi heatsink since I’m not too fond of the noisy LED fan that comes with it.
- Anker PowerExpand M.2 enclosure with USB 3.0
- Samsung 970 EVO Plus 250GB M.2 NVMe
- Canakit 3.5A Raspberry Pi 4 Power Supply with USB-C PiSwitch
Boot off M.2 NVMe SSD
Even a class 10 microSD card is slow. It’s like sucking an elephant through a straw, and you can see how often the machine is IO-bound without trying. And the little stops and starts of a UI can be quite annoying. So, let’s fix this.
Many companies make M.2 USB 3.0 kits. Still, I liked Anker the best as I’ve had great experiences with anything I’ve ever bought from them as well as the properties of this particular part: It’s a metal enclosure and completely self-contained (rather than an M.2 board flopping around — this lives on my desk and probably wouldn’t survive long otherwise).
Install the NVMe SSD (yes, I know, overkill, but I’m future-proofing here) inside the case, plug it into the Pi 4’s blue USB 3.0 port. If you sudo tail /var/log/syslog, you should see messages about the SSD coming up as /dev/sda.
You can dd the current SD card image or burn an OS image you choose to the SSD. On the same machine, it’s simple enough with dd bs=4M if=image_name.img of=/dev/sda.
Now run sudo raspi-config and change the boot order to USB when SD is missing. Run halt -p now and stop the machine. Unplug the power, remove the SD card, and plug the power back in.
Overclock the BCM2711 SoC
You’ll need a good heatsink and power supply to do this. Don’t bother without. The above setup works if you’re going to void your warranty. Let’s get the OS ready first.
sudo apt update && sudo apt upgrade && rpi-update reboot
I added the following to /boot/config.txt in the [pi4] section:
force_turbo=1 over_voltage=7 arm_freq=2147 gpu_freq=750
This sets the ARM cores to 2.147GHz, which is the maximum allowed by the current firmware. Most guides recommend over_voltage=6, which crashed my Pi 4 a few seconds after the login: prompt shows up with 100% repro. On the other hand, over_voltage=7 has been rock solid. Supposedly the gpu_freq setting changes the clock for the GPU core, but I am not sure it actually does that as vcgencmd measure_clock core always returns 500MHz.
Either way, that’s it. reboot, and you should be able to see the CPU cruising along with 2.147GHz when you run vcgencmd measure_clock arm.
Note: this only works on the current Raspberry Pi OS 32-bit. Ubuntu and the 64-bit Raspberry Pi OS image won’t take these settings.
Done! You’re now running as fast as possible, and it makes a huge difference in usability and fun. A Pi 4 with this setup is perfectly silent when the fan is on the 3.3V rail — although 5V is still very tolerable — and keeps the CPU <50°C at all times in whatever torture test I threw at it.
PS: If you ratched the clock back to 2GHz, you can reduce the fan to 3.3V, and have a near completely silent machine that runs no hotter than 50C in 21C ambient all day long. Don’t forget to dial back GPU clock and voltage to 6.
YMMV. Use at your own risk. Don’t do stupid sh*t. Do epic sh*t. — Yada yada yada.