Skip to content
STORAGE & BACKUP

Borg, Restic, and Kopia: benchmarks on a 500 GB dataset

Four weeks, three backup tools, one dataset. Wall-clock times, dedupe ratios, restore speed, and which one I actually kept running.

published
author
read
3 min (~702 words)
Stack of internal hard disk drives for digital storage on white background.
0%

Every homelab blog writes "here are the three good backup tools" and then links to their docs. Nobody actually tests them on the same data with a stopwatch. So I did.

The dataset: 500 GB, mixed content — photos, documents, a Postgres dump, a Jellyfin config directory, some videos, a Home Assistant snapshot. Representative of what a household homelab actually backs up. The target: a TrueNAS Scale dataset over SMB for the first pass, Backblaze B2 for the second. The rig: as documented here.

The three tools, in one line each

  • Borg — battle-tested, single-host, dedupe via content-defined chunking. Runs over SSH. Ecosystem: Borgmatic for scheduling.
  • Restic — Go-based, multi-repository, natively supports cloud backends (S3, B2, Azure). Go binary, no dependencies.
  • Kopia — Go-based, block-level dedupe, GUI + CLI + server mode. Youngest of the three (2019); most opinionated.

The benchmark

Metric Borg 1.4 Restic 0.18 Kopia 0.20
First backup (500 GB → NAS) 1h 52m 2h 18m 1h 34m
Second backup (2% churn) 4m 22s 6m 12s 3m 48s
Second backup (full re-scan) 22m 10s 18m 40s 14m 05s
Dedupe ratio (after 7 daily backups) 1:3.8 1:3.2 1:4.1
Restore single file (1 MB doc) 4.2s 3.1s 2.4s
Restore full (500 GB) 1h 26m 1h 41m 1h 19m
Encryption AES-CTR AES-CTR + Poly1305 AES-GCM
Repository format stability Excellent Excellent Good (still evolving)
Single-binary? No (Python) Yes Yes
Native B2 support? Via rclone Yes Yes
GUI available? No No (third-party) Yes

What the numbers are telling me

Kopia is fastest. Meaningfully so on full backup, modestly so on incremental. Its block-level dedupe is sharper than Borg's content-defined chunking on mixed data — that 1:4.1 ratio is visible on disk. If raw speed is your priority, this is it.

Restic is most boring. Not fastest, not slowest, never surprises me. The native B2 integration means I don't need an rclone sidecar. The single Go binary is easy to drop on anything. This is what I actually run for my laptop (where "just works" is the feature).

Borg is the repository I trust. I've had a Borg repo on a NAS since 2019 and I've never had a corruption scare. The format has not changed in a breaking way. On the main host with big datasets (photos, videos), this is what I use.

What I actually run, three tools deep

  • Borg + Borgmatic for the NAS-local backup of the Proxmox host's ZFS datasets. Nightly. Retention: 7 daily + 4 weekly + 6 monthly.
  • Restic on my laptop and my partner's laptop, pushing to Backblaze B2 every hour over Tailscale.
  • Kopia for a specific folder of Figma + design files that dedupe extremely well and that I want to restore individual file-versions from. The GUI makes this painless.

Yes, running three is probably overkill. I tried consolidating on one tool for a month and got frustrated each time — the strengths are real, and the costs of running three are tiny (each command takes 30 seconds to type).

The offsite layer: Backblaze B2

All three tools can push to B2. My math: 1 TB of compressed, deduped backup data at B2's $6/TB/month means the full offsite bill is about $6/month. Egress is free up to 3× storage, which for restore-once-a-year math is effectively free. My laptop's Restic repo costs me $1.80/month.

# Restic to B2 in anger
export B2_ACCOUNT_ID="..."
export B2_ACCOUNT_KEY="..."
export RESTIC_PASSWORD_FILE="$HOME/.config/restic/password"
export RESTIC_REPOSITORY="b2:my-bucket:theo-laptop"

restic init
restic backup ~/Documents ~/Desktop ~/Pictures \
  --exclude-caches --exclude='*.iso' --exclude='Library/Caches'
restic forget --keep-daily 7 --keep-weekly 4 --keep-monthly 12 --prune
restic check --read-data-subset=5%

The check command with a random data-subset verifies integrity without re-downloading the full repo. I run it weekly via a systemd timer.

The test I should have done sooner

Before I standardized on this three-tool setup I had a single-tool strategy for five years. The test I should have run then is the same one everyone should run now: a restore drill. Pick a random file from your backup, delete the local copy, restore from the backup, compare checksums. Do it every quarter.

I have done six of these in the last two years. Five succeeded. The one that failed (a Borg archive on a TrueNAS pool that had silently gone into degraded mode) taught me more than any benchmark.

Back up your data. Test the backup. Test it again.

More on the storage layer: the whole stack is catalogued in The self-hosting stack I actually use in 2026.

# issues (0)

$ no issues filed yet. be the first — the form is below.

# add an issue

Comments are moderated. Links are capped. Be kind, be specific.