Lab 04 · Performance

One new hardlink per file, every night: why backup storage saturates

Date: Oct 14, 2026Server: none: mechanism explained, with an estimateReading time: 2 minTopic: Performance
The question

The incremental backup is running before dawn and the storage can’t keep up: every server’s backup runs late, and so does any restore someone needs right then. Why does a storage server with spinning disks in parity RAID struggle during the window of an incremental backup made with rsync and hardlinks?

Result
1new hardlink for every unchanged file, every night
~150–225random writes per second for a 6-disk array (estimate)

Why it matters to whoever runs the server

  • The storage works even when nothing changed: with rsync and hardlinks, every unchanged file gets a new hardlink every night. On a server with hundreds of thousands of files, that’s hundreds of thousands of random writes, exactly what parity RAID does badly.
  • By the estimate, a 6-disk array handles about 150 to 225 of those writes per second. When the storage saturates, the backup window of every server writing to it pays for it, and so does any restore at the same time.
Random operations per second on a 6-disk spinning arrayEstimate, not a measurement · higher is better
Reads
~900
Writes, RAID 50
~225
Writes, RAID 60
~150
Salvo Lab estimate · Oct 14, 2026
See the data as a table
OperationPer secondMath
One spinning disk~150reference
Reads, 6 disks~9006 × 150
Small writes, RAID 50~225900 ÷ 4
Small writes, RAID 60~150900 ÷ 6

Method

The comparison happens on the storage: for every file of every account, rsync checks size and date against the previous snapshot. Millions of lookups scattered across the disks, every night.

Unchanged files also cause writes: with --link-dest, every unchanged file gets a new hardlink in the day’s snapshot, and its link count is updated.

Retention repeats the cost: deleting the oldest snapshot removes millions of hardlinks.

Reindexing walks the whole snapshot tree: the same storm of random reads.

What we decided

In Salvo, the “changed or not” decision is made on the source server itself, using an index cached locally; the storage is not queried file by file. It receives a few large files written sequentially, which is the kind of write parity RAID handles well. And there is no reindexing: the index is part of the repository.

?
What we don’t know yetThis explains the mechanism. The gain on our storage has not been measured side by side yet; when it is, we will publish it here.
Want to see Salvo on your server?Join the beta waitlist. We’ll let you know when there’s a spot.

How it connects to the other labs

salvo. Backup for hosting servers. A GK2 product.
Product
Lab
Salvo
Language
© 2026 GK2We use analytics cookies (Google Analytics).salvobackup.com/lab/one-hardlink-per-file-every-night/