
On 25 May 2026 I ran a few quick benchmarks on the bare-metal servers I'd just moved an application onto. Sequential disk was 8 to 13 times slower than on the server they were replacing. SHA-256 hashing was about 4 times slower.
App traffic was already on the new hosts. I should have run those checks before moving anything.
The project was moving a small startup's platform from hand-run scripts to Terraform on bare metal. Part of the plan was new servers: a separate box for git and CI, and fresh hosts for the cluster. The new hosts were an older generation, server CPUs with SATA SSDs. The box they were replacing was a newer machine with NVMe storage.
On paper the new hosts were fine. Enough cores, enough RAM, enough disk space. Nothing about the spec sheet said "this will be much slower". And the app ran on them. Pods started, pages loaded, health checks passed.
Benchmarks weren't in the plan before the move. I ran them after, as a sanity check, with the same few commands on old and new.
Nothing fancy. Run these on the old server and the new one, same conditions, and compare.
Sequential write, bypassing the page cache:
dd if=/dev/zero of=/var/tmp/ddtest bs=1M count=2048 oflag=direct status=progress
rm /var/tmp/ddtest
Sequential read of the same kind of file:
dd if=/dev/zero of=/var/tmp/ddtest bs=1M count=2048 oflag=direct
echo 3 | sudo tee /proc/sys/vm/drop_caches
dd if=/var/tmp/ddtest of=/dev/null bs=1M iflag=direct status=progress
rm /var/tmp/ddtest
CPU work that databases, TLS and disk encryption all care about:
openssl speed -evp sha256
openssl speed -evp aes-256-xts
If you have more time, fio with a random read and write mix closer to your database's pattern is better. But even the crude version told me what I needed. The new disks were 8 to 13 times slower on sequential work, and the CPUs about 4 times slower on hashing.
The platform ran Postgres, Vault, object storage and k3s on the same hosts. All of those lean on the disk. On top of that, the plan was to encrypt production data at rest, and disk encryption adds CPU work on every read and write. Slower CPU plus slower disk plus encryption is three costs stacked on the same path.
The app was quiet enough that none of this was failing yet. It would have shown up later, under load, as "the database feels slow sometimes", which is the hardest kind of problem to trace back to a hardware choice made months earlier.
Production went back onto the original NVMe server, this time with full-disk encryption.
Encrypting the fast server meant reformatting it, which is not something I wanted to try for the first time on production. So I rented a throwaway bare-metal box with the same layout and rehearsed it there: RAID1, LUKS2, LVM and XFS for the data volume, with a small SSH server in the initramfs so the disk can be opened remotely at boot. The rehearsal took about 2.5 hours and cost about 0.28 EUR.
It found three things I'd rather learn on a box I was about to delete:
After that, the real cutover onto the encrypted NVMe server was mostly routine.
Benchmark before choosing hardware, not after moving onto it. It's ten minutes. The order should be:
I also wouldn't trust a server's spec sheet for storage. "SSD" covers a huge range. A SATA SSD and an NVMe drive are both SSDs, and the difference I measured was up to 13 times.
Encrypted disks are a choice with a cost. A reboot now needs a person to enter the disk passphrase, and it takes minutes longer than before. For this team, protecting customer data at rest was worth that. I wrote down the reboot steps so it doesn't depend on me remembering them.
Before any hardware move, benchmark old and new with the same commands, and rehearse anything destructive on a box you can throw away. Both are cheap compared with finding out in production.
If you're planning a move between servers or providers and want a second pair of eyes on it, get in touch.
A Sunday control-plane move failed at 14:44 when a script wiped its own snapshot. A rollback step put things back, and the retry finished in about 66 minutes.
About twenty end-of-life VMs, single points of failure and a CDN that cached nothing. What moving AEM onto one AKS cluster took, and what I'd change.
Spot nodes were reclaimed, the on-demand fallback hit its own limit, and production was down for about 25 minutes. Then I moved production off spot.