Cool Runnings: Pi 5 NVMe Upgrade Results
The Setup
I run a Raspberry Pi 5 as a development machine - code editing, running dev servers, syncing files across a three-node mesh. It works fine on an SD card, but “fine” gets old when you’re waiting on I/O.
The Pi 5 has a PCIe connector. NVMe drives are cheap. Time to see what the numbers actually look like.
The Hardware
| Component | Model | Cost |
|---|---|---|
| NVMe Drive | Samsung 990 Pro 1TB | ~$100 |
| HAT | 52Pi P33 (EP-0241) | ~$25 |
| Cooler | Raspberry Pi Active Cooler | ~$5 |
The 52Pi P33 is a PCIe HAT that holds an M.2 NVMe drive and stacks on top of the Pi. It connects via an FPC ribbon cable to the Pi’s PCIe port.
One thing I missed initially: the HAT needs all three connections - the FPC ribbon for PCIe data, the GPIO header for mounting, AND the 4-pin power cable. I skipped the power cable thinking it was optional and spent 20 minutes wondering why the drive wasn’t detected. RTFM.
The Config
Pi 5 needs a couple lines in /boot/firmware/config.txt to enable external PCIe:
dtparam=pciex1
dtparam=pciex1_gen=3
The second line enables Gen 3 speeds (8 GT/s) instead of the default Gen 2 (5 GT/s). The Samsung 990 Pro can do Gen 4, but the Pi 5’s PCIe is x1 Gen 3 max.
After enabling PCIe, I cloned the SD card to the NVMe using rsync (rpi-clone has a bug with NVMe partition naming), updated the EEPROM boot order to prioritize NVMe, and rebooted.
The Numbers
I ran PiBenchmarks three times on each storage configuration:
| Metric | SD Card | NVMe | Improvement |
|---|---|---|---|
| PiBenchmarks Score | 1,740 | 49,904 | 28.7x |
| Sequential Read | 43 MB/s | 836 MB/s | 19x |
| Sequential Write | 35 MB/s | 575 MB/s | 16x |
| 4K Random Read | 3,255 IOPS | 167,868 IOPS | 52x |
| 4K Random Write | 827 IOPS | 62,060 IOPS | 75x |
The random I/O improvement is the real story. That’s what matters for development work - package installs, git operations, file syncing, running test suites.
Thermals
I added the Active Cooler at the same time as the NVMe. Here’s what that did:
| Condition | Before (SD, no cooler) | After (NVMe + cooler) |
|---|---|---|
| Idle | 76.3°C | 40.6°C |
| Load | Throttled at 73°C | 50.5°C |
| NVMe Temp | N/A | 30-36°C |
The bare Pi 5 SoC was hitting thermal throttling under sustained load (drops from 2.4 GHz to 2.1 GHz). With the Active Cooler, it stays well under throttle threshold even during stress tests.
The NVMe itself runs cool - 30-36°C depending on activity. The 990 Pro is rated for 82°C, so there’s plenty of headroom.
Boot Configuration
To boot from NVMe reliably, I updated the Pi 5 EEPROM:
sudo rpi-eeprom-config --edit
Key settings:
BOOT_ORDER=0xf416
PCIE_PROBE=1
PSU_MAX_CURRENT=5000
BOOT_ORDER=0xf416 means: try NVMe first, then SD card, then USB, then restart. The SD card stays in as a fallback - if the NVMe ever fails, I can boot from SD and fix things.
Was It Worth It?
For a development machine, yes. The random I/O improvement (50-75x) makes everything feel snappier:
bun installanduv synccomplete noticeably faster- Git operations on large repos are instant
- File sync (Syncthing) handles bursts better
- Dev server restarts are quicker
For a server that mostly does network I/O (like my Infrastructure Pi running Pi-hole), probably not worth it. SD card is fine when you’re not constantly thrashing storage.
Total cost was around $130 for a 28x storage improvement and a 35°C temperature drop. For a machine I use daily for development, that’s an easy yes.
Upgrade performed January 2026 on a Raspberry Pi 5 8GB running DietPi.
Written with Claude.