Borg vs Restic vs Kopia: a real benchmark on a 200 GB nightly backup over a 100 Mbps uplink

Every “best backup tool” comparison on the internet eventually devolves into a feature-matrix between Borg, Restic, and Kopia, and concludes with “they’re all good, pick one.” That’s true, technically, but it doesn’t help when you’re staring at a 200 GB dataset and a 100 Mbps uplink and you need to know which one will actually finish the nightly run before sunrise.

So I ran the benchmark. Three months on a NAS at home, the same dataset, the same destination (Backblaze B2), the same retention policy. Here’s what shook out.

The setup

  • Source: 200 GB dataset on a Synology NAS — mostly photos, code repos, document archives. ~5% changes nightly.
  • Destination: Backblaze B2, US-West region, ~80 ms RTT.
  • Uplink: 100 Mbps symmetric residential fibre.
  • Retention: 30 daily, 8 weekly, 6 monthly snapshots.
  • What I measured: initial-backup duration, nightly incremental duration, B2 storage cost per month, restore duration for a single 1 GB file.

Initial backup (200 GB cold)

  • Borg: ~5h 20m. Single-threaded compression and upload. Saturated ~85 Mbps of the 100 Mbps uplink, capped by zstd-3 throughput on the NAS’s modest CPU. Over SFTP-style transport (Borg doesn’t have native B2; ran via rclone serve).
  • Restic: ~4h 10m. Native B2 backend. Multi-threaded; saturated 100 Mbps consistently. Compression is on by default (compression=auto) using zstd, and Restic does the compression in parallel with the upload.
  • Kopia: ~3h 45m. Native B2 backend, parallel uploads, parallel compression. Slightly faster than Restic on this dataset because Kopia’s chunker is more aggressive about deduplicating across files at the block level.

Kopia wins the cold start, but the gap between Restic and Kopia is small and Borg’s penalty is mostly because of the rclone hop — if you have a Borg-native destination (a server you control), the gap closes.

Nightly incremental (5% changes, 10 GB delta)

  • Borg: 24-32 minutes. Largely steady-state. The variance is from how much of the changed data is genuinely new vs. just touched.
  • Restic: 18-25 minutes. Slightly faster because of parallel chunk uploading.
  • Kopia: 14-20 minutes. Best — its chunker found ~1.5 GB more deduplication than Restic on average, and the parallel upload pipeline kept the link saturated.

None of these are bad; the spread is 10-15 minutes per night. But over a year, Kopia ran ~50 hours less than Borg. Worth knowing if your backup window is tight.

Storage on B2

  • Borg: 215 GB at month 1, 248 GB at month 3 (steady state with 50 active snapshots).
  • Restic: 220 GB at month 1, 252 GB at month 3.
  • Kopia: 210 GB at month 1, 240 GB at month 3.

The differences are small (~3% spread). All three are doing chunk-level dedup with similar effectiveness. At B2’s $6/TB/month price tier, the difference is roughly 7 cents/month — not a deciding factor.

Single-file restore (1 GB photo archive)

  • Borg: 4m 12s. Required mounting the repo (borg mount) and copying the file out, plus the index download upfront.
  • Restic: 3m 28s. Direct file extraction by path; downloads only the chunks needed for that file.
  • Kopia: 2m 50s. Same direct-extraction model as Restic, but Kopia’s parallel download pulls chunks in parallel.

Restore performance is where Borg’s single-threaded transport hurts most. For “I deleted a directory yesterday, can I get it back” workflows, Kopia or Restic feels noticeably snappier.

What the benchmark doesn’t capture

  • Maintenance overhead. Borg needs borg compact periodically; Restic needs restic prune; Kopia handles compaction automatically. Borg is the most ops-heavy.
  • Append-only mode. Borg has had this for years (defends against ransomware-from-source). Restic gained it in 0.18; Kopia treats it as a server-side feature with its repository server, not a flag.
  • Restic’s REST server. If you self-host the destination (instead of B2), Restic’s REST server is much simpler than running a Borg server with restricted SSH or a Kopia repository server. Worth weighing.
  • UI. Kopia is the only one with a real desktop GUI. Borg and Restic are CLI-only (with third-party wrappers). For non-technical users running their own backups, Kopia wins by a mile.

What I actually run

Restic. Not because it benchmarked best (it didn’t, slightly), but because:

  • Native cloud backends (B2, S3, R2, Azure, GCS) without an rclone hop. Less surface area to debug.
  • Healthchecks.io and other heartbeat services have well-documented Restic integrations.
  • The restic mount ad-hoc inspection workflow fits my brain. Kopia’s UI is nicer; Restic’s mount is more flexible.
  • Wide adoption means more StackOverflow answers and battle-tested edge cases.

If I were starting fresh today and didn’t have CLI muscle memory, I’d probably go Kopia. The benchmark wins are real, the GUI is genuinely good, and the auto-compaction removes a maintenance task.

Borg is the option for “I run my own destination over SSH and want the most mature tool.” If your backup target is a NAS in your closet rather than a cloud bucket, Borg’s still excellent — and the speed penalty I measured doesn’t apply.

The “they’re all good, pick one” conclusion isn’t wrong. The 5-15% performance difference between them is real but rarely decisive. The deciding factor is usually which destination you have and which workflow your future-self will actually maintain.

Cover photo: Alphaen on Pexels.

Leave a Comment

This site uses Akismet to reduce spam. Learn how your comment data is processed.