Skip to main content

Compression and Bandwidth

Two factors dominate rsync transfer performance: compression (shrinking data before it goes over the wire) and bandwidth control (preventing rsync from saturating your network). Getting these right can mean the difference between a 10-minute backup and a 2-hour one.

Compression (-z)

How It Works

When you enable compression with -z, rsync compresses file data before sending it over the network, then decompresses on the receiving end. This trades CPU time for reduced network traffic.

# With compression (data compressed in transit)
rsync -avz /var/www/html/ user@remote:/backup/www/

# Without compression (raw data sent)
rsync -av /var/www/html/ user@remote:/backup/www/

When to Use Compression

ScenarioUse -z?Why
Remote transfer over internetYesReduces data sent over slow links
Transfer over LAN (1 Gbps+)NoNetwork is faster than compression overhead
Text-heavy files (code, SQL, configs, logs)YesText compresses 5–10x
Already-compressed files (.jpg, .mp4, .gz, .zip)NoCan't compress further; wastes CPU
Mixed content (code + images)MaybeCompression helps some files, not others

Compression Levels

Fine-tune the CPU vs bandwidth trade-off:

# Low compression (fast, less CPU, less effective)
rsync -avz --compress-level=1 /var/www/ user@remote:/backup/

# Default compression (level 6 — good balance)
rsync -avz /var/www/ user@remote:/backup/

# Maximum compression (slow, most CPU, smallest transfer)
rsync -avz --compress-level=9 /var/www/ user@remote:/backup/
LevelCPU UsageCompression RatioBest For
1LowMinimalFast networks where you want slight shrinkage
6 (default)MediumGoodMost remote transfers
9HighMaximumVery slow connections where bandwidth is precious

Skip Compression for Specific File Types

Rsync automatically skips compression for files that are already compressed. You can customize this list:

# Rsync's default skip list includes: gz, zip, jpg, mp4, etc.
# Add custom skip patterns:
rsync -avz --skip-compress=gz/jpg/mp4/png/zip/rar/pdf \
/var/www/ user@remote:/backup/

Bandwidth Limiting (--bwlimit)

Why Limit Bandwidth?

Running rsync at full speed on a production server can:

  • Slow down your website for visitors
  • Saturate shared hosting bandwidth
  • Trigger rate limiting from cloud providers
  • Overwhelm VPS network interfaces

How to Limit

# Limit to 5 MB/s (5000 KB/s)
rsync -avz --bwlimit=5000 /var/www/ user@remote:/backup/

# Limit to 1 MB/s (conservative for production hours)
rsync -avz --bwlimit=1000 /var/www/ user@remote:/backup/

# Limit to 10 MB/s (generous for off-hours)
rsync -avz --bwlimit=10000 /var/www/ user@remote:/backup/

Bandwidth Recommendations

ScenarioRecommended LimitReasoning
Production VPS during business hours1–5 MB/sLeave bandwidth for visitors
Production VPS off-hours10–50 MB/sSite has minimal traffic
Dedicated server20–100 MB/sMore capacity available
LAN transferNo limitNetwork isn't shared
Metered connection1–2 MB/sAvoid overage charges
Scheduling Strategy

Run bandwidth-limited backups during business hours and unlimited backups at night:

# Cron: 2 AM unlimited backup
0 2 * * * rsync -avz /var/www/ backup-server:/backups/www/

# Cron: 2 PM throttled sync for critical changes
0 14 * * * rsync -avz --bwlimit=2000 /var/www/ backup-server:/backups/www/

Delta Transfer vs Whole File

Rsync uses delta transfer by default for remote syncs — sending only the changed parts of files. For local syncs, it uses whole file mode.

ModeHow It WorksBest For
Delta transfer (default for remote)Compares checksums, transfers only changed blocksRemote/WAN transfers
Whole file (--whole-file)Copies full files regardless of changesFast LAN, or when checksum computation is slower than copying
# Force whole-file mode (faster on fast LANs)
rsync -av --whole-file /var/www/ /nas/backup/www/

# Force delta transfer (rare — it's default for remote)
rsync -av --no-whole-file /var/www/ /nas/backup/www/

Monitoring Transfer Performance

Progress Display

# Per-file progress bar
rsync -avzP /var/www/ user@remote:/backup/

# Human-readable file sizes
rsync -avzhP /var/www/ user@remote:/backup/

Post-Transfer Statistics

rsync -avz --stats /var/www/ user@remote:/backup/

Example output:

Number of files: 45,832
Total file size: 12.4 GB
Total transferred file size: 340 MB
Total bytes sent: 285 MB
Transfer speed: 15.2 MB/s
Speedup: 36.47

Key metrics to watch:

  • Speedup — how much data rsync avoided sending (higher = more efficient)
  • Total transferred file size vs Total file size — delta transfer savings

Logging for Automated Jobs

rsync -avz --stats --log-file=/var/log/rsync-backup.log \
/var/www/ user@backup:/backups/www/

Optimizing for Different Network Conditions

Slow Internet (< 10 Mbps)

rsync -avz --compress-level=9 --bwlimit=500 -P \
/var/www/ user@remote:/backup/
  • Maximum compression to minimize data
  • Low bandwidth limit to prevent saturation
  • Progress + resume for large transfers

Fast Internet (100+ Mbps)

rsync -avz --compress-level=1 -P \
/var/www/ user@remote:/backup/
  • Light compression (CPU is the bottleneck, not network)
  • No bandwidth limit needed

Fast LAN (1 Gbps+)

rsync -av --whole-file /var/www/ /nas/backup/
  • No compression (network is faster than CPU)
  • Whole-file mode (reading + writing is faster than checksumming)

Unstable Connection

rsync -avz -P --partial-dir=.rsync-partial --timeout=60 \
/var/www/ user@remote:/backup/
  • -P enables resume
  • --partial-dir stores partial files in a hidden directory
  • --timeout prevents hanging on dropped connections

Common Pitfalls

PitfallImpactPrevention
Using -z on LAN transfersWastes CPU, slows transferSkip compression for fast networks
Using -z on already-compressed filesNo benefit + CPU overheadRsync auto-skips most, but check
No --bwlimit on production serversWebsite slows down during backupAlways limit during business hours
--bwlimit too aggressiveBackup never finishes before next runEnsure backup completes in its window
Not using -P for large transfersCan't resume after interruptionAlways use -P for GB+ transfers
Ignoring --stats outputNo visibility into transfer efficiencyEnable stats for monitoring

Quick Reference

# Standard remote backup (with compression)
rsync -avzP /var/www/ user@remote:/backup/

# Bandwidth-limited production backup
rsync -avz --bwlimit=5000 /var/www/ user@remote:/backup/

# Maximum compression (slow connection)
rsync -avz --compress-level=9 -P /var/www/ user@remote:/backup/

# Fast LAN transfer (no compression)
rsync -av --whole-file /var/www/ /nas/backup/

# View transfer statistics
rsync -avz --stats /var/www/ user@remote:/backup/

# Log to file for automated jobs
rsync -avz --log-file=/var/log/rsync.log /var/www/ remote:/backup/

What's Next