NAS
Photo of author

Unraid ZFS Hybrid Pools & NVMe Cache Setup Guide

Unraid ZFS Hybrid Pools & NVMe Cache Setup Guide: A plain-language breakdown of how ZFS pools, cache pools, ARC, and L2ARC work together in Unraid so you can build a storage layout that actually fits your data and your hardware.

Unraid gives you more storage flexibility than almost any other home server OS, but that flexibility comes with a vocabulary problem. Words like “cache,” “pool,” and “ARC” mean different things depending on whether you are reading Unraid documentation or a ZFS reference. That overlap trips up a lot of builders early on.

New to NAS hardware in general? Our guide to what a NAS actually is covers the basics of enclosures, RAID, and drive bays before you dive into pool layouts.

The core concept you need before anything else: in Unraid, a “cache pool” is a fast SSD tier that buffers writes before they move to the main array, while in ZFS, “cache” refers to L2ARC, a read-acceleration layer backed by a dedicated device. These two things can coexist, but they are not the same thing, and treating them as interchangeable leads to misconfigured pools and wasted NVMe capacity.

This guide walks through both systems clearly. We cover what each caching layer actually does, which workloads benefit from each approach, how to pick a vdev layout, and how to keep your data protected through snapshots and replication. Whether you are running Docker containers, archival datasets, or a full home lab with VMs, the goal is a storage stack you understand well enough to maintain and expand with confidence.

What “Cache” Means in Unraid and ZFS

The terminology gap between Unraid’s cache system and ZFS’s internal caching layers is the single biggest source of confusion for new builders. Unraid uses “cache pool” to describe a write-staging tier, while ZFS uses “cache” to mean an L2ARC read device sitting outside the pool’s primary vdevs.

Unraid Cache Pool vs ZFS Read Cache

An Unraid cache pool is a separate pool of fast drives (typically NVMe or SATA SSDs) that Unraid’s Mover process uses to absorb writes before flushing them to the slower main array overnight. It is a filesystem-level feature managed by Unraid’s share system, not a ZFS construct.

A ZFS read cache (L2ARC) is a device added to an existing ZFS pool to extend the pool’s in-memory ARC into a faster-than-disk tier. It accelerates reads for data that has been evicted from RAM but is still accessed frequently.

These two concepts operate at completely different layers. You can have an Unraid cache pool formatted as ZFS, and that pool can also have its own L2ARC device. They stack, but they serve different purposes.

Where ARC and L2ARC Fit In

ZFS’s primary read cache is the ARC (Adaptive Replacement Cache), which lives entirely in system RAM. It is automatic and requires no configuration. On a system with 32 GB of RAM, ZFS will use a large portion of that for ARC by default, which is intentional and beneficial.

L2ARC is the second-level read cache, stored on a fast SSD or NVMe device assigned to the pool. It extends ARC capacity beyond what RAM alone can provide. L2ARC is only worth adding when your working dataset is significantly larger than your available RAM.

Why the Terminology Causes Confusion

Unraid’s WebGUI labels its fast-tier storage pools as “cache pools,” and many users format those pools with ZFS. This creates a situation where your “ZFS cache pool” has its own internal ARC, and could optionally have an L2ARC device, while also functioning as an Unraid-level write buffer. Three different caching concepts, one physical device.

Keeping these layers mentally separate makes every other configuration decision easier.

When Unraid ZFS Cache Helps and When It Does Not

ZFS on a cache pool adds data integrity, snapshot capability, and compression, but it does not automatically make every workload faster. The right question is whether your specific data patterns benefit from what ZFS actually provides at that tier.

Workloads That Benefit From Faster Pool Storage

Docker containers and their appdata directories are the clearest win. Applications like Grafana write frequently to small files, and keeping appdata on a ZFS NVMe pool means those reads and writes happen at full SSD speed with checksumming in the background.

VM disk images also benefit significantly. A mirror ZFS pool on two NVMe drives gives VMs both speed and redundancy without involving the slower main array at all.

Anything requiring fast random I/O, including databases, container logs, and download staging, benefits from a dedicated ZFS pool rather than sitting on the parity-protected array.

Cases Where L2ARC Is More Relevant Than a Cache Pool

L2ARC becomes relevant when you have a large ZFS pool on spinning drives and a working dataset that overflows RAM. If your archival data pool holds several terabytes of frequently read files and your server has limited RAM, an NVMe L2ARC device can reduce disk seeks measurably.

L2ARC is not relevant for small pools or for workloads dominated by writes rather than reads. Adding an L2ARC device to a small pool with plenty of RAM just wastes the NVMe.

Scenarios Where the Main Array Is Still the Better Fit

Large archival data, infrequently accessed Linux distributions, public domain archives, and cold backup sets belong on the main parity array. The array’s capacity per dollar is far better than any SSD pool, and sequential read performance on spinning drives is acceptable for media playback and archival access.

Space efficiency matters here. Forcing large datasets onto a ZFS SSD pool for the sake of ZFS features usually costs more in drives than it gains in practical performance.

Choosing the Right Layout for Your Drives

Your vdev layout determines fault tolerance, expansion options, and write performance in ways that are difficult to change after the fact. Getting this decision right before formatting saves significant pain later.

Single-Disk Pool, Mirror, and RAIDZ Tradeoffs

A single-disk ZFS pool has no redundancy. It is appropriate for a disposable download staging area or a backup target that you plan to replicate from another pool, not as your only copy of important data.

A mirror (two or more drives) gives the best random read performance and the simplest expansion path: add another mirror pair and the pool grows. Space efficiency is 50%, which is the tradeoff.

RAIDZ1 and RAIDZ2 maximize usable capacity but perform worse on small random writes. RAIDZ2 (two parity disks per vdev) is the right starting point for most 6-to-12 drive pools where the data matters. For a cache pool with two to four NVMe drives, a mirror almost always outperforms RAIDZ.

How Vdev Design Affects Pool Reliability

Redundancy in ZFS is per vdev, not per pool. If you build a pool from two RAIDZ1 vdevs and one vdev loses two drives simultaneously, the entire pool fails even though the other vdev is healthy.

For NVMe cache pools, a two-drive mirror in a single vdev is the most common and reliable layout. For larger spinning-disk data pools, splitting into multiple RAIDZ2 vdevs gives both parallelism and two-disk fault tolerance within each vdev.

Drive counts that leave a power-of-two number of data disks (after subtracting parity disks) improve stripe alignment and reduce write amplification.

Hybrid ZFS in the Unraid Array vs Dedicated Pools

Unraid supports adding a single ZFS-formatted disk directly to the parity array. This gives you ZFS checksumming and snapshots on that disk while keeping it protected by Unraid’s parity. It is useful for backup targets and replication destinations.

This is not the same as a dedicated ZFS pool. A ZFS disk in the array cannot self-heal, cannot stripe across multiple disks, and does not benefit from combined pool performance. Use hybrid placement for specific replication scenarios, and use a dedicated zpool for anything requiring full ZFS functionality.

Building a Practical Pool Strategy in the WebGUI

Unraid’s WebGUI makes creating and assigning ZFS pools straightforward, though a few configuration choices at setup time have lasting consequences. Getting the pool roles and filesystem options right from the start avoids reformatting later.

Creating a ZFS Pool in Unraid

Stop the array before making any pool changes. Click Add Pool, name it something descriptive (like appdata or fast), and set the slot count to match your intended number of data vdev disks. Assign your NVMe or SSD drives to the pool, then open the pool configuration screen.

Set the filesystem to zfs or zfs-encrypted for LUKS encryption. Choose your allocation profile based on your drive count: mirror for two to four drives, RAIDZ2 for larger groups. Enable compression at this stage; LZ4 compression is the default and adds no meaningful CPU load on modern hardware while reducing write amplification.

Start the array to format and activate the pool.

Assigning Docker, appdata, and VM Storage

In Unraid’s Docker settings, change the Docker data directory to a path on your ZFS pool. A common layout is /mnt/fast/appdata for container persistent storage and /mnt/fast/domains for VM disk images.

Individual shares can also be assigned to use the ZFS pool as their cache tier. Set the share’s Use Cache Pool option to the name of your ZFS pool. Mover will then stage new writes there before flushing to the array on schedule.

For Docker and VMs specifically, many builders set the share to Only (never move to array) so that appdata stays permanently on fast storage.

Compression, Encryption, and Pool Roles

LZ4 compression is worth enabling on every ZFS pool in Unraid. It improves both read and write speeds in practice because the CPU cost of compression is lower than the I/O savings it provides on modern hardware.

Encryption via zfs-encrypted protects data at rest but requires the encryption key at boot. Plan for this in your startup scripts if the server reboots unattended.

Assigning clear roles to pools, one for appdata and VMs, one for downloads, one for long-term archival, makes maintenance and expansion decisions much simpler over time.

Performance Tuning Beyond the Basics

After your pools are running, a few tuning decisions can meaningfully affect how well the system handles specific workloads. Most defaults in Unraid’s ZFS implementation are reasonable, but some situations call for deliberate adjustments.

Using L2ARC Carefully

L2ARC only helps when the ARC (RAM cache) is too small to hold your working dataset. On a system with 32 GB or more of RAM and a pool holding mostly archival data, L2ARC provides little benefit and consumes NVMe write endurance populating itself.

If your pool is large and actively read (a dense dataset of lossless media or large public domain archives), an L2ARC NVMe can reduce seek latency noticeably. Add it through the pool’s sub-pool device options in the WebGUI under the cache slot type.

Avoid adding L2ARC to mirror pools used purely for Docker and appdata. The ARC will handle those workloads entirely from RAM under normal conditions.

Managing Cache Behavior for Containers and Databases

Containers like Grafana write to small database files constantly. Keeping these on a ZFS NVMe pool means writes land in ARC first, then flush to the SSD, which is fast and safe.

For containers running SQLite or PostgreSQL, placing the data directory on a ZFS dataset with recordsize tuned to 16K improves random I/O performance. The default 128K recordsize is optimized for large sequential transfers, not small database records.

ZFS’s ARC does not behave as a traditional write-back cache. Writes are committed to disk before being acknowledged, which protects data integrity at the cost of some write throughput.

Planning Around Expansion Limits and Unraid 7.2

Expanding a ZFS pool means adding a complete new vdev of the same layout. You cannot add a single disk to an existing vdev through the WebGUI. Plan your initial drive count to leave room for a matching vdev later.

RAIDZ expansion (adding a disk to an existing RAIDZ vdev) is a newer ZFS feature that Unraid 7.2 is beginning to expose in the interface. It is available but still warrants careful planning and testing before use on production data.

Mirror pools expand most easily: add a new mirror vdev and the pool immediately gains capacity. For NVMe cache pools, this is the most practical growth path.

Monitoring, Replication, and Backup Safety

A ZFS pool that is not monitored and replicated is just a faster way to lose data. Unraid’s ZFS integration gives you the tools to catch problems early and keep a verified copy somewhere outside your primary pool.

Checking Pool Health and Error States

Run zpool status from the Unraid terminal to see the health of every pool, the error counts on each vdev, and any scrub results. A healthy pool shows ONLINE for each disk and zero read, write, and checksum errors.

Schedule regular scrubs through Unraid’s scheduler or a User Script. Monthly scrubs on NVMe pools and quarterly scrubs on spinning-disk pools are reasonable starting points. ZFS will automatically self-heal any correctable errors it finds during a scrub, provided the redundancy level allows it.

Grafana dashboards connected to a Prometheus Node Exporter can surface ZFS pool metrics visually, which is worth setting up if you prefer monitoring over terminal commands.

Using Snapshots and Syncoid for Replication

ZFS snapshots are instant, space-efficient point-in-time copies of a dataset. Creating a snapshot does not duplicate data; it only records what changes from that moment forward. Run snapshots on a schedule through User Scripts or a dedicated snapshot tool.

Syncoid (part of the Sanoid toolkit) automates ZFS send/receive replication between datasets and pools. A common pattern is replicating a ZFS NVMe cache pool to a ZFS-formatted disk inside the Unraid array, giving you a parity-protected backup of the fast pool with minimal scripting.

For remote replication, Syncoid supports SSH-based transfers, which lets you send snapshots off-site to another Unraid server or a remote ZFS host.

Designing a Backup Target That Is Not Your Primary Pool

Your backup target should be structurally separate from your primary pool. A ZFS-formatted array disk receiving replicated snapshots from your NVMe pool is protected by Unraid’s parity and holds historical snapshots going back as far as your retention policy allows.

Do not treat a second disk in the same mirror pool as a backup. A mirror protects against a single disk failure; it does not protect against accidental deletion, ransomware, or filesystem corruption, because all mirrors reflect changes instantly.

Pair your Unraid ZFS setup with a premium Usenet provider for fast, private archival downloads. Get Newshosting or Get Easynews both offer SSL-encrypted access and strong retention that complement this kind of archival build.

For truly important data, follow a 3-2-1 strategy: three copies, two different storage types, one off-site. ZFS replication makes the off-site copy far easier to automate than rsync-based approaches.

Frequently Asked Questions

How do I set up a ZFS cache pool in Unraid with SSDs?

Stop the array, click Add Pool in the WebGUI, assign your SSDs, open the pool configuration, set the filesystem to zfs, choose a mirror or RAIDZ profile depending on drive count, enable LZ4 compression, and start the array to format. Then point Docker appdata and VM storage at the new pool’s mount path under /mnt/poolname.

What are the pros and cons of using ZFS instead of BTRFS for a cache pool in Unraid?

ZFS gives you stronger checksumming, more mature snapshot tooling, and easier replication via ZFS send/receive to a backup target. BTRFS is Unraid’s older default for cache pools and has simpler built-in RAID1 support but less robust snapshot and replication workflows. For setups that require nightly replication to a backup disk, ZFS is the more capable choice.

Why is my ZFS cache pool using so much RAM, and how can I reduce memory usage?

ZFS’s ARC automatically fills available RAM to cache frequently accessed data, which is by design and improves performance. It is not a memory leak; the OS will reclaim ARC memory when other applications need it. If you need to cap ARC size, set options zfs zfs_arc_max=<bytes> in a modprobe configuration file, but on most home lab systems the default behavior is preferable.

How do snapshots work on a ZFS cache pool in Unraid, and how do I manage them?

A snapshot captures the state of a ZFS dataset at a specific moment using copy-on-write metadata, consuming minimal space until data in the original dataset changes. You can create, list, and delete snapshots via the terminal with zfs snapshot, zfs list -t snapshot, and zfs destroy. For automated retention schedules, the Sanoid tool or Unraid User Scripts running zfs snapshot on a cron schedule are the most common approaches.

What is the difference between a ZFS pool and the Unraid array, and when should each be used?

The Unraid array is a parity-protected collection of individual disks managed by Unraid’s software, where each disk operates independently and can be different sizes. A ZFS pool is a unified storage volume where data and redundancy are managed by ZFS across all member disks simultaneously, requiring matching vdev layouts but offering stronger integrity guarantees, compression, and snapshots natively. Use the Unraid array for large cold storage and archival data; use a ZFS pool for active workloads like Docker, VMs, and anything requiring fast random I/O.

How can I optimize downloads and appdata performance when using a cache pool in Unraid?

Place your download staging directory and appdata folder on a ZFS NVMe pool set to Only (never move to array) so data stays permanently on fast storage. Enable LZ4 compression on the pool to reduce write amplification during heavy download periods. For database-heavy containers, create a dedicated ZFS dataset with recordsize=16K to improve small-file random I/O rather than relying on the pool-wide default of 128K.

About the Author

Don is a tech enthusiast with a passion for datahoarding, privacy, and security. He has been involved in technology for over a decade, working in various roles such as a desktop support engineer, network administrator, and IT consultant. Don's extensive experience in the tech industry has given him a deep understanding of how technology works and how to use it to its fullest potential.

Don is particularly interested in topics such as VPNs, privacy and IRC, which are all related to data privacy and security. He believes that protecting our digital privacy is essential, especially in today's world where data breaches and cyber attacks are becoming more common. Don has dedicated himself to educating himself and others on how to protect their digital privacy and stay safe online.

In addition to his tech expertise, Don is also an avid gamer. He enjoys playing video games in his free time, and is also a family man who enjoys spending time with his wife and children. He believes that technology should enhance our lives and bring us closer together, and he strives to promote this message through his work.