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

ComponentModelCost
NVMe DriveSamsung 990 Pro 1TB~$100
HAT52Pi P33 (EP-0241)~$25
CoolerRaspberry 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:

MetricSD CardNVMeImprovement
PiBenchmarks Score1,74049,90428.7x
Sequential Read43 MB/s836 MB/s19x
Sequential Write35 MB/s575 MB/s16x
4K Random Read3,255 IOPS167,868 IOPS52x
4K Random Write827 IOPS62,060 IOPS75x

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:

ConditionBefore (SD, no cooler)After (NVMe + cooler)
Idle76.3°C40.6°C
LoadThrottled at 73°C50.5°C
NVMe TempN/A30-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 install and uv sync complete 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.