> For the complete documentation index, see [llms.txt](https://handbook.bsdcn.org/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://handbook.bsdcn.org/di-22-zhang-z-wen-jian-xi-tong-zfs/22.6.-gao-ji-zhu-ti.md).

# 22.6.高级主题

## 22.6.1. 调整

调整可调参数，使 ZFS 在不同的工作负载下表现最佳。

* `vfs.zfs.arc.max` 从 13.x 开始（12.x 使用 `vfs.zfs.arc_max`） - [ARC](/di-22-zhang-z-wen-jian-xi-tong-zfs/22.8.-zfs-te-xing-he-shu-yu.md) 的最大大小。默认值是除去 1 GB 后的所有 RAM，或者是所有 RAM 的 5/8，以较大的值为准。如果系统运行其他守护进程或进程可能需要内存，可以使用较小的值。可以在运行时通过 [sysctl(8)](https://man.freebsd.org/cgi/man.cgi?query=sysctl\&sektion=8\&format=html) 调整此值，并在 **/boot/loader.conf** 或 **/etc/sysctl.conf** 中设置。
* `vfs.zfs.arc.meta_limit` 从 13.x 开始（12.x 使用 `vfs.zfs.arc_meta_limit`） - 限制用于存储元数据的 [ARC](/di-22-zhang-z-wen-jian-xi-tong-zfs/22.8.-zfs-te-xing-he-shu-yu.md) 的大小。默认值是 `vfs.zfs.arc.max` 的四分之一。如果工作负载涉及对大量文件和目录进行操作，或频繁进行元数据操作，则增加此值可以提高性能，但代价是较少的文件数据能适应 [ARC](/di-22-zhang-z-wen-jian-xi-tong-zfs/22.8.-zfs-te-xing-he-shu-yu.md)。可以在运行时通过 [sysctl(8)](https://man.freebsd.org/cgi/man.cgi?query=sysctl\&sektion=8\&format=html) 调整此值，并在 **/boot/loader.conf** 或 **/etc/sysctl.conf** 中设置。
* `vfs.zfs.arc.min` 从 13.x 开始（12.x 使用 `vfs.zfs.arc_min`） - [ARC](/di-22-zhang-z-wen-jian-xi-tong-zfs/22.8.-zfs-te-xing-he-shu-yu.md) 的最小大小。默认值是 `vfs.zfs.arc.meta_limit` 的一半。可以调整此值，以防止其他应用程序挤出整个 [ARC](/di-22-zhang-z-wen-jian-xi-tong-zfs/22.8.-zfs-te-xing-he-shu-yu.md)。可以在运行时通过 [sysctl(8)](https://man.freebsd.org/cgi/man.cgi?query=sysctl\&sektion=8\&format=html) 调整此值，并在 **/boot/loader.conf** 或 **/etc/sysctl.conf** 中设置。
* `vfs.zfs.vdev.cache.size` - 为池中每个设备预分配的缓存内存大小。总内存使用量是此值乘以设备数量。此值应在引导时设置，并在 **/boot/loader.conf** 中设置。
* `vfs.zfs.min_auto_ashift` - 池创建时自动使用的最低 `ashift`（扇区大小）。该值是 2 的幂。默认值为 `9`，表示 `2^9 = 512`，即 512 字节的扇区大小。为了避免 *写放大* 并获得最佳性能，应将此值设置为池中设备使用的最大扇区大小。 常见的驱动器有 4 KB 扇区。使用默认的 `ashift` 值 `9` 与这些驱动器会导致写放大。在这些设备中，单个 4 KB 写入的数据将以八次 512 字节写入的方式写入。ZFS 尝试在创建池时从所有设备读取原生扇区大小，但具有 4 KB 扇区的驱动器为兼容性考虑报告其扇区为 512 字节。通过在创建池之前将 `vfs.zfs.min_auto_ashift` 设置为 `12`（`2^12 = 4096`），可以强制 ZFS 使用 4 KB 块，从而获得最佳性能。

  强制使用 4 KB 块在计划进行磁盘升级的池中也非常有用。未来的磁盘将使用 4 KB 扇区，而 `ashift` 值在创建池后无法更改。

  在某些特定情况下，较小的 512 字节块大小可能更为合适。例如，在使用 512 字节磁盘用于数据库或虚拟机存储时，较小的块在进行小随机读取时会传输更少的数据。这可以在使用较小的 ZFS 记录大小时提供更好的性能。
* `vfs.zfs.prefetch.disable` - 禁用预取。值为 `0` 时启用，值为 `1` 时禁用。默认值为 `0`，除非系统内存小于 4 GB。预取通过将比请求的块大得多的数据块读取到 [ARC](/di-22-zhang-z-wen-jian-xi-tong-zfs/22.8.-zfs-te-xing-he-shu-yu.md) 中，来期望稍后会需要这些数据。如果工作负载有大量随机读取，禁用预取可能会通过减少不必要的读取来提高性能。可以随时通过 [sysctl(8)](https://man.freebsd.org/cgi/man.cgi?query=sysctl\&sektion=8\&format=html) 调整此值。
* `vfs.zfs.vdev.trim_on_init` - 控制是否对添加到池中的新设备执行 `TRIM` 命令。这可以确保 SSD 的最佳性能和寿命，但会额外耗时。如果设备已经进行了安全擦除，禁用此设置将加快新设备的添加过程。可以随时通过 [sysctl(8)](https://man.freebsd.org/cgi/man.cgi?query=sysctl\&sektion=8\&format=html) 调整此值。
* `vfs.zfs.vdev.max_pending` - 限制每个设备的待处理 I/O 请求数。较高的值会保持设备命令队列满，从而可能提高吞吐量。较低的值则会减少延迟。可以随时通过 [sysctl(8)](https://man.freebsd.org/cgi/man.cgi?query=sysctl\&sektion=8\&format=html) 调整此值。
* `vfs.zfs.top_maxinflight` - 每个顶级 [vdev](/di-22-zhang-z-wen-jian-xi-tong-zfs/22.8.-zfs-te-xing-he-shu-yu.md) 的最大未决 I/O 数。限制命令队列的深度，以防止高延迟。该限制适用于每个顶级 vdev，即该限制对每个 [镜像](/di-22-zhang-z-wen-jian-xi-tong-zfs/22.8.-zfs-te-xing-he-shu-yu.md)、[RAID-Z](/di-22-zhang-z-wen-jian-xi-tong-zfs/22.8.-zfs-te-xing-he-shu-yu.md) 或其他 vdev 独立适用。可以随时通过 [sysctl(8)](https://man.freebsd.org/cgi/man.cgi?query=sysctl\&sektion=8\&format=html) 调整此值。
* `vfs.zfs.l2arc_write_max` - 限制每秒写入 [L2ARC](/di-22-zhang-z-wen-jian-xi-tong-zfs/22.8.-zfs-te-xing-he-shu-yu.md) 的数据量。此可调参数通过限制写入设备的数据量，延长 SSD 的使用寿命。可以随时通过 [sysctl(8)](https://man.freebsd.org/cgi/man.cgi?query=sysctl\&sektion=8\&format=html) 调整此值。
* `vfs.zfs.l2arc_write_boost` - 将此可调参数的值添加到 `vfs.zfs.l2arc_write_max` 中，并在从 [L2ARC](/di-22-zhang-z-wen-jian-xi-tong-zfs/22.8.-zfs-te-xing-he-shu-yu.md) 驱逐第一个块之前，提升 SSD 的写入速度。这个“Turbo Warmup Phase”减少了重启后空 [L2ARC](/di-22-zhang-z-wen-jian-xi-tong-zfs/22.8.-zfs-te-xing-he-shu-yu.md) 带来的性能损失。可以随时通过 [sysctl(8)](https://man.freebsd.org/cgi/man.cgi?query=sysctl\&sektion=8\&format=html) 调整此值。
* `vfs.zfs.scrub_delay` - 每次 I/O 操作之间的延迟时间（以 tick 为单位）在执行 [scrub](/di-22-zhang-z-wen-jian-xi-tong-zfs/22.8.-zfs-te-xing-he-shu-yu.md) 时。如果池有其他 I/O 操作，`scrub` 将在每个命令之间延迟。这项设置控制 `scrub` 产生的 IOPS（每秒 I/O 操作数）的上限。设置的粒度由 `kern.hz` 决定，默认是每秒 1000 个 tick。更改此设置会导致不同的有效 IOPS 限制。默认值为 `4`，因此 IOPS 限制为：1000 ticks/sec / 4 = 250 IOPS。使用 *20* 的值将使 IOPS 限制为：1000 ticks/sec / 20 = 50 IOPS。池上最近的活动限制了 `scrub` 的速度，具体限制由 `vfs.zfs.scan_idle` 决定。可以随时通过 [sysctl(8)](https://man.freebsd.org/cgi/man.cgi?query=sysctl\&sektion=8\&format=html) 调整此值。
* `vfs.zfs.resilver_delay` — 在重新同步过程中，每次 I/O 操作之间的延迟时间（以 tick 为单位）。为确保重新同步不会干扰池的正常操作，如果池有其他 I/O 操作，重新同步将在每个命令之间延迟。此设置控制重新同步产生的 IOPS（每秒 I/O 操作数）上限。设置的粒度由 `kern.hz` 决定，默认是每秒 1000 个 tick。默认值为 `2`，因此 IOPS 限制为：1000 ticks/sec / 2 = 500 IOPS。如果另一块设备故障可能导致池故障并造成数据丢失，则将池恢复为[在线](/di-22-zhang-z-wen-jian-xi-tong-zfs/22.8.-zfs-te-xing-he-shu-yu.md)状态可能更为重要。值为 `0` 将使重新同步操作与其他操作具有相同的优先级，从而加快修复过程。池上最近的活动限制了重新同步的速度，具体限制由 `vfs.zfs.scan_idle` 决定。可以随时通过 [sysctl(8)](https://man.freebsd.org/cgi/man.cgi?query=sysctl\&sektion=8\&format=html) 调整此值。
* `vfs.zfs.scan_idle` — 在扫描（scrub 或 resilver）过程中，判定池是否空闲的 tick 数。如果池在指定时间内空闲，扫描操作将会加速。可以随时通过 [sysctl(8)](https://man.freebsd.org/cgi/man.cgi?query=sysctl\&sektion=8\&format=html) 调整此值。
* `vfs.zfs.txg.timeout` — 事务组（transaction group）之间的最大秒数。当前事务组写入池中，如果自上一个事务组以来经过了此时间，则启动新的事务组。如果写入了足够的数据，事务组可能会提前触发。默认值为 `5` 秒。较大的值可能会通过延迟异步写入来提高读取性能，但这可能导致写入事务组时性能不均匀。可以随时通过 [sysctl(8)](https://man.freebsd.org/cgi/man.cgi?query=sysctl\&sektion=8\&format=html) 调整此值。

## 22.6.2.在 i386 上的 ZFS

ZFS 提供的一些特性对内存要求较高，因此在内存受限的系统上可能需要进行调整以提高效率。

### 22.6.2.1. 内存

作为最低要求，系统总内存应至少为 1 GB。推荐的内存量取决于池的大小以及使用的 ZFS 功能。一般经验法则是每 1 TB 存储需要 1 GB 内存。如果使用去重功能，则推荐的内存量为每 TB 存储 5 GB。虽然一些用户使用较少的内存来运行 ZFS，但在重负载下，系统可能会因内存耗尽而发生 panic。对于内存不足的系统，ZFS 可能需要进一步的调整。

### 22.6.2.2. 内核配置

由于 i386™ 平台的地址空间限制，i386™ 架构上的 ZFS 用户必须将此选项添加到定制内核配置文件中，重新编译内核并重启：

```sh
options        KVA_PAGES=512
```

此选项扩展了内核地址空间，允许 `vm.kvm_size` 调整值突破 1 GB 的限制，或突破 PAE 的 2 GB 限制。为了找到最合适的值，可以将所需的地址空间（以 MB 为单位）除以 4。在这个例子中，`512` 代表 2 GB。

### 22.6.2.3. 引导加载器调整

在所有 FreeBSD 架构上增加 **kmem** 地址空间。一台具有 1 GB 物理内存的测试系统通过将以下选项添加到 **/boot/loader.conf** 并重新启动，从中受益：

```sh
vm.kmem_size="330M"
vm.kmem_size_max="330M"
vfs.zfs.arc.max="40M"
vfs.zfs.vdev.cache.size="5M"
```

有关 ZFS 调整的更详细建议，请参见 <https://wiki.freebsd.org/ZFSTuningGuide>。


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://handbook.bsdcn.org/di-22-zhang-z-wen-jian-xi-tong-zfs/22.6.-gao-ji-zhu-ti.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
