生产环境禁用单盘裸建zpool,必须配置vdev结构(如mirror/raidz2)并显式指定ashift=12;log与cache设备须物理分离且用途明确;compression=lz4和recordsize需在zfs create时按数据特征设定,atime=off可显著降低小文件随机读延迟。

生产环境不能用 zpool create tank /dev/sdb 这种单盘裸建方式——它既没冗余,也没 WAL 和 L2ARC 分离,ZFS 的数据自愈和性能优势根本发挥不出来。
zpool create 命令必须带 vdev 结构和 ashift=12
ZFS 不是“把磁盘加进去就完事”,vdev 类型直接决定容错能力和 I/O 走向。普通 4K 扇区硬盘(现在基本全是)必须显式指定 ashift=12,否则元数据错位、写放大、性能暴跌。
- 镜像池(高可用小规模):
zpool create -o ashift=12 tank mirror /dev/sdb /dev/sdc - RAID-Z2(4–6 盘均衡场景):
zpool create -o ashift=12 tank raidz2 /dev/sdb /dev/sdc /dev/sdd /dev/sde - 绝对不要混用介质:
zpool create tank raidz2 /dev/sdb /dev/sdc /dev/nvme0n1是反模式——ZFS 无法跨 NVMe/HDD 均衡 I/O,会导致严重抖动和超时
log 和 cache 设备必须独立挂载,且用途不能颠倒
ZIL(WAL)和 L2ARC 是两个完全不同的加速路径,物理设备不能复用,参数也不能乱设。
- WAL(
log)只加速同步写,必须低延迟:用 NVMe 分区,例如/dev/nvme0n1p1;不能用 SATA SSD 或 HDD - L2ARC(
cache)只加速读缓存,对延迟不敏感但需要大容量:可用另一块 NVMe 分区,如/dev/nvme0n1p2;但需注意——L2ARC 不提升写性能,且 ARC 内存不足时会失效 - 正确命令示例:
zpool create -o ashift=12 tank mirror /dev/sdb /dev/sdc log /dev/nvme0n1p1 cache /dev/nvme0n1p2
compression=lz4 和 recordsize 必须在 zfs create 时设定
这些不是全局开关,而是 per-dataset 属性,且只对新写入数据生效。等池建好再改,旧数据不会重压缩,recordsize 更无法在线调整。
- 数据库/VM 镜像建议:
zfs create -o compression=lz4 -o atime=off -o recordsize=1M tank/data - 小文件多的共享目录建议:
zfs create -o compression=lz4 -o atime=off -o recordsize=16K tank/share -
atime=off关键:避免每次读触发元数据更新,小文件随机读延迟能降 30%+ - 别全局开
compression=on:视频、gzip 日志等已压缩数据再压,纯耗 CPU,无空间收益
真正难的不是敲对命令,而是理解 ZFS 没有“卸载再扩容”这种操作——加 vdev、换盘、调 recordsize,全要走 zfs send | zfs receive 迁移,期间校验重算、I/O 阻塞不可避免。设计阶段想清楚 vdev 构成和 dataset 层级,比后期补救重要十倍。











