Hi all,
I'd like a sanity check on a plan before I execute it, and I'm aware it's not the textbook ZFS setup – so I'd appreciate honest opinions on the risk.
Problem:
Garbage collection on my main PBS datastore (storage1) takes ~28–46 hours per run. The datastore holds ~16 million chunks, ~17.5 TiB on-disk, dedup factor ~90. I've already maxed gc-cache-capacity (8388608), and the last GC log shows a 96% chunk-cache hit ratio, so the software side is exhausted. The bottleneck is clearly metadata I/O (atime updates in phase 1, chunk stats in phase 2) on slow spinning disks. GC is a pure metadata workload, so a ZFS special vdev on SSD is the obvious fix.
Hardware:
- Dell PowerEdge, PERC H740P (RAID mode, 8GB cache, BBU status: Ready), firmware 51.16.0-5150
- storage1: 4x HDD in hardware RAID5, presented as a single ~32TB virtual disk, currently XFS
- A second datastore (storage2) on its own separate hardware RAID5 on the same controller – I do NOT want to touch this one
- OS on a separate RAID1 (also on the PERC)
- 2x 240GB SATA SSDs (Micron, enterprise) on a separate Dell BOSS/AHCI controller, currently unused, exposed natively (real SMART/serials)
Why not the clean way (HBA + raidz1):
The H740P only supports non-RAID/pass-through in Enhanced HBA mode, which is a global controller mode change. That would tear down the storage2 RAID5 and the OS RAID1 as well, which I can't do, storage2 is ~38TB and would need to be fully evacuated too, and the OS would need reinstalling. So per-disk pass-through for just the storage1 disks is not possible on this controller.
My proposed plan (storage1 only):
1. Fully sync storage1 to a second PBS (separate hardware) and verify it
2. Keep the PERC in RAID mode. Leave storage2 and OS untouched.
3. Destroy the storage1 XFS, then build a ZFS pool where:
- the existing RAID5 virtual disk is the single data vdev
- the 2 BOSS SSDs are a mirrored special vdev (special mirror, ZFS-managed – not a controller RAID1)
4. Recreate the datastore, restore gc-cache-capacity, sync the data back.
5. Set special_small_blocks later to also pull the small index files onto the SSDs.
What I understand the trade-offs to be:
- No ZFS self-healing on the data side (ZFS sees one "disk"), but it still detects checksum errors, and I rely on hardware RAID5 redundancy + PBS verify
- Write-hole risk is mitigated by the healthy BBU (write-back is safe with a working BBU).
- The special vdev is structurally critical losing it loses the pool, so it's a mirror if one disk fails I can swap very fast that faulty disk to minimize risks
My question:
For a backup datastore, is ZFS on a single hardware RAID5 + mirrored SSD special vdev a reasonable way to get the GC speedup, or are there failure modes I'm underestimating?
Thanks a lot for any input.
I'd like a sanity check on a plan before I execute it, and I'm aware it's not the textbook ZFS setup – so I'd appreciate honest opinions on the risk.
Problem:
Garbage collection on my main PBS datastore (storage1) takes ~28–46 hours per run. The datastore holds ~16 million chunks, ~17.5 TiB on-disk, dedup factor ~90. I've already maxed gc-cache-capacity (8388608), and the last GC log shows a 96% chunk-cache hit ratio, so the software side is exhausted. The bottleneck is clearly metadata I/O (atime updates in phase 1, chunk stats in phase 2) on slow spinning disks. GC is a pure metadata workload, so a ZFS special vdev on SSD is the obvious fix.
Hardware:
- Dell PowerEdge, PERC H740P (RAID mode, 8GB cache, BBU status: Ready), firmware 51.16.0-5150
- storage1: 4x HDD in hardware RAID5, presented as a single ~32TB virtual disk, currently XFS
- A second datastore (storage2) on its own separate hardware RAID5 on the same controller – I do NOT want to touch this one
- OS on a separate RAID1 (also on the PERC)
- 2x 240GB SATA SSDs (Micron, enterprise) on a separate Dell BOSS/AHCI controller, currently unused, exposed natively (real SMART/serials)
Why not the clean way (HBA + raidz1):
The H740P only supports non-RAID/pass-through in Enhanced HBA mode, which is a global controller mode change. That would tear down the storage2 RAID5 and the OS RAID1 as well, which I can't do, storage2 is ~38TB and would need to be fully evacuated too, and the OS would need reinstalling. So per-disk pass-through for just the storage1 disks is not possible on this controller.
My proposed plan (storage1 only):
1. Fully sync storage1 to a second PBS (separate hardware) and verify it
2. Keep the PERC in RAID mode. Leave storage2 and OS untouched.
3. Destroy the storage1 XFS, then build a ZFS pool where:
- the existing RAID5 virtual disk is the single data vdev
- the 2 BOSS SSDs are a mirrored special vdev (special mirror, ZFS-managed – not a controller RAID1)
4. Recreate the datastore, restore gc-cache-capacity, sync the data back.
5. Set special_small_blocks later to also pull the small index files onto the SSDs.
What I understand the trade-offs to be:
- No ZFS self-healing on the data side (ZFS sees one "disk"), but it still detects checksum errors, and I rely on hardware RAID5 redundancy + PBS verify
- Write-hole risk is mitigated by the healthy BBU (write-back is safe with a working BBU).
- The special vdev is structurally critical losing it loses the pool, so it's a mirror if one disk fails I can swap very fast that faulty disk to minimize risks
My question:
For a backup datastore, is ZFS on a single hardware RAID5 + mirrored SSD special vdev a reasonable way to get the GC speedup, or are there failure modes I'm underestimating?
Thanks a lot for any input.