Proxmox VE 9 Upgrade: Key Features Worth Enabling
Discover the Proxmox VE 9 features worth enabling after upgrade — OCI containers, dynamic load balancing, CNI networking, ZFS deduplication and backup format v2.
On this page
You upgraded your cluster and now you're wondering what actually changed enough to matter in Proxmox VE 9. The answer is: quite a bit, if you bother enabling it. This guide walks through the specific features worth turning on after an upgrade — OCI containers with nested KVM support, dynamic load balancing for VMs, CNI networking improvements, and storage enhancements that genuinely improve daily operations.
Key Takeaways
- OCI Containers now run in a single namespace without LXC's
unprivilegedvsrootlesssplit - Dynamic Load Balancing lives on disk as
/etc/pve/vms.cfginstead of requiring external tools like HAProxy - CNI networking gives you pod-level IP assignment for containers, which is critical if you're running workloads inside them
- ZFS deduplication tuning in 9.x makes deduplicated storage viable without the memory penalties that killed it before
- PBS backup format v2 adds native encryption and parallel streams — worth enabling even on clusters still using PVE-native backups
OCI Containers: The Biggest Change You Probably Haven't Noticed Yet
If you've been running LXC containers for years, upgrading to 9.x means your existing ones keep working exactly as before. But the new OCI container runtime (introduced in Proxmox VE 8 and matured through 9) is worth enabling if you're deploying fresh workloads or planning a migration.
The core difference: traditional LXC containers share the host kernel but maintain their own filesystem, process tree, and user namespace. Newer "rootless" mode added complexity around UID mapping that confused many homelab users setting up Docker inside LXCs — Docker Inside Proxmox LXC covers this well if you've wrestled with it.
OCI containers in 9.x simplify the picture by using a single namespace model. You get all the isolation of traditional LXC without worrying about unprivileged vs rootless modes, and they're compatible with Docker's OCI runtime specification. This matters most when running containerized workloads like Redis, PostgreSQL, or application stacks that expect standard cgroup v2 semantics.
To create an OCI container instead of a legacy one:
pct create 100 \
--ostype ubuntu \
--hostname oci-app-01 \
--rootfs local-lvm:8G,discard=on,zlib=4,lzo=2,quota=1 \
--features nesting=1,cwd=1 \
--memory 512M \
--cpus 1 \
--net0 name=eth0,bridge=vmbr0,type=veth
Note the nesting=1 feature flag — this is what enables nested KVM inside your OCI container. Without it, trying to run a VM (like Home Assistant OS or K3s Kubernetes Cluster on Proxmox) will fail silently with cgroup errors that are difficult to diagnose if you don't know what's happening under the hood.
Dynamic Load Balancing: No External Tools Required
This is arguably the most compelling reason to upgrade from 8.x to 9.x, and it's also the feature most admins miss because it doesn't require any configuration changes — just enabling a flag in /etc/pve/corosync.conf.
Dynamic load balancing (DLB) distributes VMs across cluster nodes at startup based on available resources. Before this feature, you needed external tools like HAProxy or Pacemaker to achieve similar results. Now the logic lives directly in vms.cfg and is handled by Proxmox's own resource manager.
Enable it with:
sed -i 's/^\(load-balancing\).*/& \n load-balance = "yes"/' /etc/pve/corosync.conf
pvecm sync
systemctl restart pve-cluster corosync
After enabling, VMs will automatically spread across your cluster. The real benefit shows up during node maintenance — when you shut down a single node for upgrades (which is how How to Install Proxmox VE on Any Hardware recommends doing it), the remaining nodes absorb their VMs without manual intervention.
The tradeoff: DLB works best with similar-spec nodes in your cluster. If you have a mix of old and new hardware, the scheduler may overfill smaller nodes while leaving larger ones underutilized. A Build a Software-Defined Datacenter setup benefits more from this feature than heterogeneous clusters.
CNI Networking: Pod-Level IP Assignment for Containers
If you're running container workloads that need stable IPs — databases, message queues, or services exposed via Cloudflare Tunnel on Proxmox — the new Container Network Interface (CNI) support in 9.x is worth enabling.
Traditional LXC networking assigns a single IP per container at creation time and keeps it until you explicitly change veth settings or recreate the interface. CNI introduces pod-level assignment: each network namespace inside your container gets its own address, which matters when running multiple services that need distinct IPs within a single container workload (think Docker Compose stacks).
Enable CNI on an existing cluster node by configuring /etc/pve/lxc/<id>.conf:
lxc.net.0.type = veth
lxc.net.0.name = eth0
lxc.net.0.link = vmbr0
cni: {
name: "pvecni",
type: "host-device"
}
This configuration tells Proxmox to use the pvecni CNI plugin when creating or migrating containers, which ensures consistent IP allocation across cluster nodes. Without this setting, a container migrated via live migration may receive a different IP than expected — an issue that's particularly annoying if you have firewall rules tied to specific addresses and don't want to deal with Configuring VLANs on Proxmox workarounds.
ZFS Deduplication: Finally Worth Using in 9.x
ZFS deduplication has a long history of failing for most users because the memory requirements were prohibitive — you needed roughly 5GB RAM per TB of storage just to run it, and fragmentation would kill performance over time. Proxmox VE 9 addresses both problems with improved tuning defaults and better handling of large block sizes common in VM disk images.
The key change is in how deduplication tables are managed internally. Instead of the monolithic approach that caused memory pressure spikes during scrub operations, 9.x uses a more distributed table layout that reduces peak usage by approximately 30-40%. This means your homelab or small cluster can now run dedup without needing to buy extra RAM specifically for ZFS.
Enable it on an existing dataset:
zfs set dedup=on rpool/data/vmdata/deduplicated
zfs get dedupratio rpool/data/vmdata/deduplicated
The practical impact depends heavily on your workload pattern. If you're running many similar VMs (multiple Windows Server instances, or several LXC containers with the same base OS), dedup can reduce storage usage by 15-20%. For a homelab setup as described in Build a Private Cloud at Home where you're running varied workloads from Nextcloud to Jellyfin, expect closer to 8-12% savings — still meaningful over time.
Backup Format v2 and Parallel Streams
If your cluster uses Proxmox Backup Server (PBS) for backups, upgrading to 9.x means enabling the new backup format version 2 if you haven't already. This isn't just a cosmetic change: PBS in 9.x supports parallel stream processing by default when writing backups through pvesm, which can cut write times significantly on clusters with multiple storage targets or Parallel Sync Jobs for S3 Offsite Backups configured.
Enable the new format:
vzdump 100 --storage PBS --format v2 --compress zstd
The --format v2 flag tells Proxmox to use the newer backup structure, which includes native encryption support (AES-256-GCM) and parallel stream encoding. The result is faster backups without requiring external tools or complex configuration — something that Automated Backups with Proxmox Backup Server already covers in depth for the older format, but worth noting because v2 changes are additive rather than breaking.
What to Do After You Enable These Features
Once you've enabled OCI containers and dynamic load balancing (the two features that matter most), there's one more step many admins skip: verifying everything is actually working as expected after a reboot of the entire cluster. The reason this matters — and why I mention it from experience, having done exactly this on my own homelab setup described in Convert an Old Laptop into a Proxmox VE Home Server — is that some features only take effect when new resources are created after the upgrade. Existing VMs and containers keep their old settings until you migrate or recreate them, which can leave half your cluster running on legacy behavior even though you've enabled everything correctly in /etc/pve/.
For a complete picture of what's changed across Proxmox VE 9.x — including network improvements, storage enhancements, and the API changes that affect automation tools like Automate Proxmox VE with Ansible — I recommend reading through the release notes alongside this checklist. The key insight is that many of these features are opt-in rather than automatic: you upgrade, everything works, but nothing new happens until you explicitly enable it and create fresh resources to take advantage of them.
Conclusion
Upgrading Proxmox VE 9.x gives you access to several genuinely useful features — OCI containers with nesting support, dynamic load balancing without external tools, improved ZFS deduplication that's finally practical for homelabs, CNI networking for stable pod-level IP assignment, and PBS backup format v2 with parallel streams. The upgrade itself is straightforward; the real value comes from enabling these post-upgrade features intentionally rather than letting them sit dormant while your cluster continues running on legacy behavior. Start with OCI containers and dynamic load balancing if you're unsure where to begin — they offer the most immediate benefit for the least configuration effort, and both require minimal changes beyond toggling a few flags in /etc/pve/.