Comment on page
22.6.高级主题
调整可优化的因素,可使 ZFS 在不同的工作负荷下都呈现最佳表现。
- vfs.zfs.vdev.cache.size——预先分配的内存量,作为池中每个设备的缓存。使用的总内存量将是这个值乘以设备的数量。在启动时或 /boot/loader.conf 中设置此值。
- vfs.zfs.min_auto_ashift——在创建池时自动使用的较低
ashift
(扇区大小)。该值是二的幂值。默认值9
代表2^9=512
,即扇区大小为 512 字节。为了避免写入放大并获得最佳性能,将此值设置为池中设备使用的最大扇区大小。普通磁盘的扇区是 4KB。在这些磁盘上使用默认的9
作为ashift
会导致这些设备的写入放大。单个 4KB 的写入所包含的数据被写成 8 个 512 字节的写入。在创建池时,ZFS 试图从所有设备中读取本地扇区大小,但具有 4 KB 扇区的驱动器报告说它们的扇区是 512 字节,以实现兼容。在创建池之前,将vfs.zfs.min_auto_ashift
设置为12
(2^12=4096
),迫使 ZFS 在这些磁盘上使用 4KB 块以获得最佳性能。强制 4KB 区块对于有计划的磁盘升级的池也很有用。未来的磁盘使用 4KB 扇区,而且在创建池后,ashift
值不能改变。在一些特定的情况下,较小的 512 字节的块大小可能是更好的。当使用 512 字节的磁盘用于数据库或作为虚拟机的存储时,在小的随机读取过程中传输的数据较少。这可以在使用较小的 ZFS 记录大小时提供更好的性能。 - vfs.zfs.vdev.trim_on_init——控制添加到池中的新设备是否对其运行
TRIM
命令。这可以确保 SSD 的最佳性能和寿命,但需要消耗额外的时间。如果设备已经被安全擦除,禁用此设置将使新设备的添加更快。在任何时候都可用 sysctl(8) 调整此值。 - vfs.zfs.vdev.max_pending——限制每个设备的挂起 I/O 请求的数量。一个较高的值会使设备的命令队列保持满员,并可能带来更高的吞吐量。一个较低的值将减少延迟。在任何时候都可以用 sysctl(8) 调整此值。
- vfs.zfs.l2arc_write_boost——在
vfs.zfs.l2arc_write_max
的基础上增加这个可调控的值,并增加对 SSD 的写入速度,直到驱逐 L2ARC 的第一个块。这个“涡轮增压热身阶段”可以减少重启后空的 L2ARC 带来的性能损失。在任何时候都可以用 sysctl(8) 调整此值。 - vfs.zfs.scrub_delay——在
scrub
过程中,每个 I/O 之间延迟的刻度数。为了确保scrub
不干扰池的正常运行,如果有任何其他 I/O 正在发生,scrub
将在每个命令之间延迟。这个值控制scrub
所产生的总 IOPS(每秒 I/O 数)的限制。设置的颗粒度由kern.hz
的值决定,默认为每秒 1000 次。改变这个设置会导致不同的有效 IOPS 限制。默认值是 4,导致的限制是: 1000 ticks/sec / 4 = 250 IOPS。使用一个 20 的值会得到一个限制: 1000 ticks/sec / 20 = 50 IOPS。池子上的最近活动限制scrub
的速度,这由vfs.zfs.scan_idle
决定。在任何时候都可以用 sysctl(8) 调整此值。 - vfs.zfs.resilver_delay——在 resilver 过程中每次 I/O 之间插入延迟的毫秒数量。为了确保 resilver 不会干扰池的正常运行,如果有任何其他 I/O 正在发生,resilver 将在每个命令之间延迟。这个值控制 resilver 产生的总 IOPS(每秒 I/O 数)的限制。ZFS 通过
kern.hz
的值来决定设置的粒度,其默认值为每秒 1000 次。改变这个设置会导致不同的有效 IOPS 限制。默认值是 2,导致的限制是: 1000 ticks/sec / 2 = 500 IOPS。如果另一个设备失败可能导致池 Fault,导致数据丢失,那么将池返回到 Online 状态可能更为重要。一个 0 值将给予 resilver 操作与其他操作相同的优先级,加速 resilver 过程。池上的其他最近活动限制 resilver 的速度,由vfs.zfs.scan_idle
决定。在任何时候都可以用 sysctl(8) 调整此值。
ZFS 提供的一些功能是内存密集型的,可能需要在内存有限的系统上进行优化以提高效率。
作为一个较低的值,总的系统内存应该至少是 1GB。推荐的内存数量取决于池的大小和 ZFS 使用的功能。一般的经验法则是每 1TB 的存储量需要使用 1GB 的内存。如果使用重复数据删除功能,一般的经验法则是每 TB 存储使用 5 GB 内存进行重复数据删除。虽然有些用户使用的 ZFS 内存更少,但负载过重的系统可能会因为内存耗尽而 panic。ZFS 可能需要对低于推荐内存要求的系统进行进一步的优化。
由于 i386™ 平台的地址空间限制,i386™ 架构上的 ZFS 用户必须在定制内核配置文件中加入这个选项,重新编译内核,然后重新启动:
options KVA_PAGES=512
这就扩展了内核地址空间,允许
vm.kvm_size
可调值超过 1GB 的强制限制,或者 PAE 的 2GB 限制。为了找到这个选项的最合适的值,将所需的地址空间(以 MB 为单位)除以 4。在这个例子中,512
代表 2GB。在所有的 FreeBSD 架构上增加 kmem 地址空间。在 /boot/loader.conf 中加入以下选项,然后重新启动,一个拥有 1GB 物理内存的测试系统就会从中受益:
vm.kmem_size="330M"
vm.kmem_size_max="330M"
vfs.zfs.arc.max="40M"
vfs.zfs.vdev.cache.size="5M"