如果你想新建一个ZFS池,这里有快速参考。这里有你要考虑的所有设置,以及我认为可能要使用的值。

通常,除非必须,否则我一般不喜欢进行参数调整。但不幸的是,许多ZFS默认值并不是大多数工作负载的最佳选择。

SLOG和L2ARC是特殊的设备,而不是参数……但是无论如何,我还是将它们包括在内。

参数 最优值 说明
ashift 12 Ashift告诉ZFS你的磁盘使用的基础物理块大小是多少。它以比特为单位,所以ashift = 9表示512B扇区(供所有旧驱动器使用),ashift = 12表示4K扇区(供大多数现代硬盘使用),ashift = 13表示8K扇区(某些现代SSD使用)。

如果你不清楚要设置多少,就把值往大了调,因为值过低会影响性能,而值过高对正常工作并没有太多影响。

Ashift是针对每个vdev的,并且一旦设置即不可变。这意味着你应该在创建池时手动设置它,而且每次将vdev添加到现有池时都应该正确设置它,千万不能搞错,如果设置错了,会破坏整个池,并且无法修复。

xattr sa 直接在inode上设置Linux扩展属性,而不是在特殊的隐藏文件夹中的小文件。这可能会对其中包含大量文件的数据集产生重大的性能影响,尤其是在使用SELinux的情况下。对于包含很少、却很大的文件(例如VM映像)的数据集,可能不会产生任何影响。
compression(压缩) lz4 压缩默认为关闭,这是一个丢失的默认值。即使你的数据是不可压缩的,你的松弛空间也是(高度)可压缩的。

LZ4压缩比存储更快。是真的,即使你有超快的cpu和SSD。我已经测试过了。

你可以考虑对具有高度可压缩文件的数据集进行gzip压缩。它将具有更好的压缩率,但吞吐量可能会降低。

 atime off 如果atime处于打开状态(默认情况下为打开),则每次查看文件时,系统都必须更新每个文件的“已访问”属性。它很容易使系统上的IOPS负载增加一倍。

你是否关心上一次是什么时间有人打开文件,或者什么时间访问目录? 如果不是,请关掉它。

recordsize(记录大小) 16K 如果你经常读写随机文件,则要将记录大小与文件大小相匹配。

对于大多数数据库二进制文件或VM映像,精确匹配16K至少比默认记录大小128K更好。

这可以将用于数据库二进制文件或VM映像的阵列的IOPS能力提高四倍或更多。

recordsize(记录大小) 1M 不同的工作负载需要不同的recordsize设置。

如果你仅读写相当大的块(例如,来自相机的5-8MB JPEG图像集合或100GB的电影文件的集合,而且都不会被随机读取或写入),你需要设置recordsize = 1M,以减少相同大小数据的记录数,从而减少系统上的IOPS负载。对于可压缩数据,这还可以提高压缩率,因为每个记录使用其自己的单独压缩字典。

如果你使用的是Bittorrent,则recordize = 16K可能会带来更高的写入性能。不过,recordize = 1M会降低整体碎片率,并且在以后读取由torrent获取的文件时,性能会更好。

SLOG maybe(可能需要) SLOG不是设置,它是一种特殊的vdev类型,可充当整个池的写聚合层。它仅影响同步写入,因为异步写入已在RAM的ZIL中聚合。

SLOG不必是大型设备,它只需要累积几秒钟的写入即可。拥有一个SLOG意味着同步写入的性能会相当于异步写入。但它实际上并不会像ZFS新用户所希望的那样是个“写缓存”。

非常适合用于数据库、NFS导出或其他经常调用sync()的事情。对于更随意的工作负载而言,它并不太有用。

L2ARC nope(不要) L2ARC是ARC的一层,位于快速存储而不是RAM中。听起来很棒:超级巨大的超快速读取缓存!

但是,不是真的那样。一方面,L2ARC是短暂的,重新启动后L2ARC中的数据就不复存在。另一方面,索引L2ARC会花费大量的RAM,这意味着由于需要索引L2ARC,ARC会变得更小。

即使是最快的SSD,也比RAM慢几个数量级。 如果本来可以从ARC中获取数据,结果却要去索引L2ARC,那将是一个巨大的损失。

添加L2ARC后,大多数人根本看不出任何真正的区别。添加L2ARC后,很多人会发现性能下降。

本文翻译自https://jrs-s.net/2018/08/17/zfs-tuning-cheat-sheet/。机器翻译为主,如有错误还请评论区指出。