62
62
为了确保最佳的性能,`ashift` 参数应当与硬盘的真实扇区大小相匹配,既不宜过大也不宜过小。
63
63
默认情况下,在创建 zpool 的时候,ZFS 会自动检测硬盘的扇区大小(`ioctl(BLKPBSZGET)`)并设置合适的 `ashift` 参数。
64
64
对于固态硬盘,建议查阅硬盘的规格,然后手动指定 `zpool create -o ashift=...`。
65
+ 如果你不确定硬盘的物理扇区大小(尤其是对于消费级固态硬盘),使用 4K(`ashift=12`)是一个保守但合理的选择。
65
66
66
67
在生产环境中,请**不要**将 ZFS 用于任何虚拟硬盘或软件/硬件 RAID 阵列上。
67
68
只有当 ZFS 直接管理每块硬盘时,才能获得最佳的性能和 ZFS 提供的数据完整性保证。
68
- 如果你的阵列卡不支持直通,可以考虑为每块盘建立一个单盘阵列 。
69
+ 如果你的阵列卡不支持直通,可以考虑为每块盘建立一个单盘阵列以最小化阵列卡的影响 。
69
70
70
71
在实际应用中,如果你使用 ` sda ` 、` nvme0n1 ` 等设备名来创建 pool,ZFS 会自动对其进行分区,然后使用 ` sda1 ` 、` nvme0n1p1 ` 等分区名来创建 pool,并在每个盘的末尾创建一个 8 MB 的分区(` sda9 ` 、` nvme0n1p9 ` )。分区的目的可能出于某些历史原因,目前无从考证,且这个编号为 9 的分区是没有任何用途的。
71
72
@@ -105,12 +106,18 @@ tank 2.81G 112K 2.81G - - 0% 0% 1.00x ONLINE -
105
106
106
107
Zpool 层面的参数可以通过 ` zpool set ` 命令进行调整,以下是一些推荐修改的参数:
107
108
109
+ - ` ashift ` :详见上面的介绍。注意 ` ashift ` 参数在创建 pool 后** 无法更改** ,因此请在创建 pool 时指定。
110
+
108
111
- ` autotrim=on ` :如果你使用硬盘是 SSD,启用此选项后 ZFS 会自动为已删除的数据块向硬盘发送 TRIM 指令。例如:
109
112
110
113
``` shell
111
114
zpool set autotrim=on tank
112
115
```
113
116
117
+ 以下是一些在特定情况下有用的参数:
118
+
119
+ - ` bootfs=pool0/ROOT/debian` :如果你使用 root on ZFS,该参数是常见的 grub 配置及 initramfs 生成脚本所需的参数。
120
+
114
121
# ## ZFS 文件系统 {#tuning-zfs}
115
122
116
123
ZFS(文件系统)层面的参数可以通过 ` zfs set` 命令进行调整,语法与 ` zpool set` 类似。以下是一些推荐修改的参数:
@@ -121,13 +128,19 @@ ZFS(文件系统)层面的参数可以通过 `zfs set` 命令进行调整,
121
128
122
129
该选项的默认值为 ` xattr=on` ,即扩展属性存储在额外的数据块中。这是为了保持与 FreeBSD / Solaris 等系统中的 ZFS 实现的兼容性。除非你预计需要将 ZFS pool 搬到这些系统上使用,否则我们推荐使用 ` xattr=sa` 或 ` xattr=off` 。
123
130
131
+ - ` relatime=on` :启用相对时间戳。默认情况下,Linux 会在** 每次** 访问文件时更新其访问时间戳(atime),对于经常访问但较少修改的文件来说,这会带来额外的磁盘 I/O。启用 ` relatime` 后,Linux 会降低对 atime 的更新频率,从而减少磁盘 I/O。
132
+
133
+ 此 ZFS 参数与 Linux 的挂载选项 ` relatime` 完全相同。
134
+
124
135
- ` compression=on` 或 ` compression=zstd` :启用 ZFS 的透明压缩功能。对于大多数数据,压缩后的数据量会显著减小,从而减少磁盘 I/O。
125
136
126
137
一般建议启用透明压缩功能,除非你的 CPU 性能较差(例如 10 年前的服务器)或者预期的数据量不会因压缩而减小(例如归档存储已经压缩过的数据)。
127
138
128
139
!!! note " 压缩算法"
129
140
130
- 截至 2024 年,ZFS 默认使用 LZ4 算法进行压缩,这是一种速度较快的单线程算法。如果你的 CPU 不是上古级别的,可以考虑使用 Zstd,这是一种更加现代化的压缩算法,支持多线程和更高的压缩比。
141
+ 截至 2024 年,ZFS 的默认(` compression=on` )压缩算法为 LZ4,这是一种速度较快的单线程算法。如果你的 CPU 不是上古级别的,可以考虑使用 Zstd,这是一种更加现代化的压缩算法,支持多线程和更高的压缩比。
142
+
143
+ OpenZFS 在 2.2 版本中为 3 级以上的 Zstd 启用了 early abort(默认等级刚好是 3 级),即 ZFS 会先使用 LZ4 和 Zstd-1 尝试压缩,如果压缩比不理想,则放弃压缩。Early abort 机制可以避免在难以压缩的数据上浪费 CPU,因此一般情况下无需担心压缩会带来性能问题。
131
144
132
145
# ## ZFS 内核模块参数 {#tuning-zfs-ko}
133
146
@@ -155,7 +168,7 @@ echo 4294967296 > /sys/module/zfs/parameters/zfs_arc_max
155
168
在 Linux 下,受限于 kernel 的设计 (1),ARC 占用的内存会在 htop / free 等程序中显示为 used 而不是 cached,但是其行为和 cached 是一致的,即在系统内存压力升高时会自动释放,以供其他程序使用。
156
169
{: .annotate }
157
170
158
- 1. 在 FreeBSD 中,ZFS ARC 占用的内存会正确地显示为 cached。
171
+ 1. 在 FreeBSD 和 htop & ge ; 3.3.0 中,ZFS ARC 占用的内存会正确地显示为 cached。
159
172
160
173
!!! tip " 强制释放 ARC"
161
174
@@ -176,7 +189,7 @@ ZFS 提供了调试工具 `zdb`,可以用于查看 pool 和文件系统的内
176
189
177
190
- ` zdb` 不关心 pool 或者文件系统是否挂载,它都会直接访问块设备。因此在正在使用的 pool 或者文件系统上使用 ` zdb` 可能会得到不一致的结果;
178
191
- ` zdb` 的输出格式没有文档说明,因为其假设使用者了解 ZFS 的内部结构;
179
- - ` zdb` 支持写入内容,但是在不了解 ZFS 内部结构的情况下,建议仅使用 ` zdb` 读取 pool 和文件系统的结构内容 。
192
+ - ` zdb` 支持写入内容,但是在不了解 ZFS 内部结构的情况下,建议以只读方式使用 ` zdb` 。
180
193
181
194
以下提供了一个使用 ` zdb` 调试出生产环境「未解之谜」的例子:
182
195
0 commit comments