Optimizing VM Disk Performance with Proxmox Local-ZFS
Learn how to implement Local-ZFS in Proxmox VE to balance VM disk performance and data redundancy using ZVOLs, mirroring, and ARC memory tuning.
07 Nov 2025, 01:10 UTC

The Storage Dilemma: Speed vs. Safety
When setting up a Proxmox VE environment, the choice of storage backend often becomes a bottleneck. Using standard directory-based storage on a single disk is risky, while traditional hardware RAID controllers can hide critical disk health data from the operating system. The goal is to achieve high-performance block storage for virtual machines (VMs) without sacrificing the ability to recover from a drive failure.
The most effective solution for standalone nodes is Local-ZFS. By leveraging ZFS (Zettabyte File System), Proxmox can manage disks directly, providing software-defined redundancy and near-instantaneous snapshots through ZVOLs (ZFS Volumes). ZVOLs are block devices carved out of a ZFS pool, allowing the VM to treat the storage as a raw disk rather than a file sitting on a filesystem.
ZFS Pool Architecture for Virtualization
To use Local-ZFS, you first create a ZFS pool (zpool). Unlike traditional partitions, a pool aggregates physical disks into a flexible storage reservoir. For VM workloads, two configurations are most common:
- Mirroring (RAID1): Two or more disks mirrored. This provides the highest IOPS (Input/Output Operations Per Second) and fastest recovery time, making it ideal for database VMs.
- RAIDZ: Similar to RAID 5, this stripes data across multiple disks with parity. It offers more usable capacity than mirroring but suffers from higher write latency.
Proxmox integrates this natively. When you assign a VM disk to a ZFS pool, Proxmox creates a thin-provisioned ZVOL. This means the system only consumes physical space as the VM actually writes data, allowing you to over-provision storage if your actual usage remains low.
Implementation: Creating a Mirrored Pool
To implement a ZFS pool, you must ensure your disks are connected via an HBA (Host Bus Adapter) or a controller in "IT Mode." Hardware RAID controllers that abstract the physical disks will prevent ZFS from managing the drive health and can lead to data corruption.
Steps to configure via Proxmox Shell:
# Identify available disks
lsblk
# Create a mirrored pool named 'vm-storage' using two disks
# Run as root on the Proxmox host
zpool create vm-storage mirror /dev/sdb /dev/sdc
# Verify the pool status
zpool status vm-storage
After creating the pool in the shell, you must add it to the Proxmox GUI: Datacenter > Storage > Add > ZFS. Set the ID to local-zfs and select the vm-storage pool. Ensure "Thin Provision" is checked to optimize space.
The Memory Trade-off: Managing the ARC
ZFS is powerful because of the ARC (Adaptive Replacement Cache), a sophisticated caching mechanism that uses system RAM to speed up read operations. However, by default, ZFS can consume up to 50% of your total system memory. In a virtualization environment, this creates a conflict: the host steals RAM that should be allocated to the VMs.
If you notice your VMs are swapping or the host is running out of memory despite having low VM utilization, you must limit the ARC size. This is done by modifying the ZFS module parameters.
# Example: Limit ARC to 4GB
# Run on Proxmox host as root
echo "options zfs zfs_arc_max=4294967296" > /etc/modprobe.d/zfs.conf
# Update initramfs and reboot to apply
update-initramfs -u
reboot
Limitations and Hardware Risks
While Local-ZFS provides enterprise-grade features, it has specific hardware requirements. Consumer-grade SSDs often lack a "Power Loss Protection" (PLP) capacitor. Because ZFS performs synchronous writes to ensure data integrity, consumer SSDs can experience massive write amplification, significantly shortening the drive's lifespan and causing performance drops during heavy VM disk I/O.
To verify the result of your setup, navigate to Datacenter > [Node Name] > Disks > ZFS. Check that the pool status is ONLINE and that the capacity reflects the thin-provisioned usage rather than the total virtual disk size.
Rollback Procedure
If the ZFS pool configuration is incorrect or causing system instability, you can destroy the pool to return the disks to an uninitialized state:
# Warning: This deletes all data on the pool
zpool destroy vm-storage
0 replies
A thoughtful contribution can make all the difference. Be the first to share one.