For virtualization architects and homelab sysadmins running Proxmox VE, storage exhaustion has historically been the primary operational ceiling. Taking nightly full backups of dozens of virtual machines running identical Debian or Ubuntu OS templates quickly consumes tens of terabytes of raw storage if redundant data blocks are repeatedly written to disk.
While native ZFS block-level deduplication exists, running it on primary storage pools is notoriously dangerous: an undersized deduplication table (DDT) spills over from ARC RAM to mechanical disks, causing storage pools to completely freeze. Proxmox Backup Server solves this fundamental architectural conundrum by decoupling deduplication from primary storage and executing it at the backup target layer.
The Core Architecture: How PBS Fixed-Size Chunking Works
When a Proxmox VE node executes a backup job to a PBS datastore, the backup client interacts with the QEMU block layer via a dirty-bitmap tracking driver. The process unfolds across four synchronized stages:
| Pipeline Stage | Mechanical Operation | System Resource Load | Deduplication Impact |
|---|---|---|---|
| 1. Stream Chunking | Disk split into 4MB slices (configurable 1-8MB) | PVE Client CPU (Multi-threaded) | Ensures boundary consistency across VMs |
| 2. SHA-256 Hashing | Cryptographic digest calculated per chunk | Hardware SHA acceleration (SSE/AVX) | Hash becomes the unique physical filename |
| 3. Index Query | PVE checks if hash already exists on PBS | Network Roundtrip (<1ms on 10GbE) | Existing chunks are skipped; zero bandwidth |
| 4. Compression & Write | New chunks compressed with ZSTD and stored | PBS Target NVMe/SSD write IOPS | Achieves raw storage reduction of 75-90% |
Because the chunk filename is derived directly from its SHA-256 cryptographic checksum, the filesystem structure on PBS is completely flat and deterministic. A datastore located at `/mnt/datastore/backup` organizes chunks into a two-level hex directory tree:
# PBS On-Disk Chunk Organization
/mnt/datastore/backup/.chunks/
├── 0000/
│ ├── 000018a38c82194b46c68e1a72d385...
│ └── 00003b578c187e14f9d012489e...
├── 0001/
└── ff7a/
└── ff7a49b291c98e218204f0391a...
Instead of saving a massive 100GB `.vma` or `.qcow2` monolith for every single nightly backup run, PBS writes a tiny index file (often less than 5MB) containing an ordered manifest of SHA-256 chunk hashes. If 50 Linux virtual machines share identical Debian package libraries, those chunks are physically written to the storage media exactly once. All 50 backup manifests simply point to the exact same shared chunk files, as explained in our comparative analysis of ZFS block-level deduplication vs. PBS chunking.
Garbage Collection (GC) Architecture: Phase 1 vs. Phase 2
When you delete an old backup snapshot or run a retention prune rule (e.g., `keep-daily 7`, `keep-weekly 4`), PBS does not delete the underlying chunk files immediately. Doing so would risk deleting a chunk that is still actively referenced by another virtual machine’s backup manifest.
Instead, space reclamation is handled by the Garbage Collection (GC) engine, which executes in two distinct phases:
- Phase 1 (Mark): PBS scans every active backup snapshot index across the datastore and updates the access timestamp (`atime`) of every referenced chunk file in `.chunks/`.
- Phase 2 (Sweep): PBS iterates through the entire `.chunks/` directory. Any chunk file whose `atime` is older than the cutoff threshold (typically 24 hours plus a safety margin) is confirmed orphaned and safely deleted from disk.
RAM & Storage Media Sizing Guidelines for 2026
The single most common mistake in home labs and enterprise deployments is creating a PBS datastore on a pool composed exclusively of mechanical hard drives (HDDs). While sequential reads and writes are fast on HDDs, the Garbage Collection process requires millions of random metadata access operations across the `.chunks/` directory tree.
Running GC on a 20TB datastore stored on spinning rust can take 48 to 72 hours, during which storage IOPS are completely saturated, causing active backup jobs to timeout.
# Production PBS Hardware Formula (2026):
# 1. RAM Rule: Provision 1GB of system RAM per 1TB of datastore capacity (Min: 16GB).
# 2. OS & Metadata: Run PBS OS on dedicated enterprise NVMe SSDs in ZFS Mirror.
# 3. Hybrid Storage Pools: If using HDDs for bulk chunk data, install a high-end
# NVMe Special vdev for metadata to accelerate chunk atime lookups by 50x:
zpool add pbs-pool special mirror /dev/nvme0n1 /dev/nvme1n1
Where to Expand Your Stack Next
Harden your disaster recovery strategy and cluster infrastructure with these foundational guides:
- Proxmox Backup Server (PBS): Deduplicated, Encrypted Off-Site Backups
- Proxmox Deduplication: ZFS Block Dedup vs. PBS Chunking Architecture
- Automating Proxmox VE with Ansible: Playbooks & Cloud-Init Templates
People Also Ask
How much RAM does Proxmox Backup Server require?
PBS requires approximately 1GB of system RAM for every 1TB of unique datastore capacity, with an absolute minimum baseline of 8GB to 16GB for production reliability. This RAM is utilized to maintain fast in-memory chunk index maps and ensure seamless performance during Garbage Collection runs.
Can Proxmox Backup Server run on mechanical hard drives?
While technically supported, running PBS datastores on purely mechanical HDDs is strongly discouraged due to catastrophic IOPS degradation during Garbage Collection (GC) sweeps. If HDDs are used, pairing them with an SSD-based ZFS metadata special vdev is essential.
What is the typical deduplication ratio on PBS?
In environments running multiple virtual machines with similar operating systems (such as multiple Linux or Windows VM instances), Proxmox Backup Server typically achieves deduplication ratios between 10:1 and 25:1, drastically reducing raw disk requirements.

