提高truenas上zfs性能的几个小tips


前言

使用truenas有好几个月了,对zfs这个文件系统真是颇有好感。不过zfs这玩意真是相当复杂,影响性能的因素是多之又多,新手刚上手的话难免一头雾水。

这里整理几个提高zfs性能,尤其是truenas性能的小tips。

工具篇

工欲善其事必先利其器,这里写几个测试性能的方法。

测试性能

——测试truenas本地性能

# 测试写入,全零
sudo dd if=/dev/zero of=/zpool/testx.img bs=1M count=20480
# 测试写入,随机填充
sudo dd if=/dev/urandom of=/zpool/testx.img bs=1M count=20480
# 测试复制
sudo dd if=testx.img of=/zpool/test2.img bs=1M count=20480
# 测试读取
sudo dd if=/zpool/test2.img of=/dev/null bs=1M count=20480

——测试挂载性能

可以使用CrystalDiskMark,也可以直接复制大文件观察速度。

观测zfs指标

web页面->Reporting

OK,工具介绍完了,下面我们来看下提高性能具体可以做点啥。

硬件篇

1.足够高的配置(尤其是内存)

cpu&内存&硬盘&网卡能整多好整多好——cpu能epyc就不atom,内存槽能插满就不空着,硬盘都换成企业级ssd,网卡都插满100G,23333。

这条乍一看好像是废话,不过确实是最重要的。

zfs是出了名的吃硬件,软raid吃cpu,cache吃内存。

这里的建议是,盘位较多的话,最好使用atom级别以上的cpu,内存能加多大加多大。

至于是否一定需要ecc,网上有争议。调研了一圈,我比较倾向于,zfs不比其他的fs更需要ecc,原因见链接。

2.使用大内存

这里单独又列了一遍,因为内存之于zfs真是太太太太重要了。内存的大小和性能几乎决定了zfs性能的上限。

zfs的内存策略相当激进,默认参数下几乎会把全部内存空间当作读缓存(arc)使用。内存的性能比hdd好多少数量级,这里就不用展开了吧?

如何调节arc(内存缓存)的最大大小?System->Tunables->vfs.zfs.arc_max,单位字节。

3.使用l2arc设备

接上一条,在内存容量不够的情况下,可以考虑加一块ssd,作为二级缓存(l2 arc)。

注意,l2arc需要在内存中建立索引,需要消耗一定的内存空间。

是否需要添加l2arc?可以观察下arc的命中率,如果日常场景下,arc命中率已经相当高(比如90%+),那么我们可以认为arc已经满足需求,不需要添加额外的l2arc了。

l2arc需要添加多大?一般建议不超过内存容量*10。

添加方法。Storage->Pools->Add Vdev->Cache

4.使用slog设备

使用slog设备可以有效提高同步写的速度,原理见下文,效果见评测(链接)。

slog容量不必太大,满足5s的最大写入速度(默认情况下同步写最长5s后会把内存中数据刷回硬盘)即可,家用场景里16g或者32g傲腾足矣。

添加方法:Storage->Pools->Add Vdevs->Log

5.合理规划阵列

不要混用不同大小的硬盘,不要混用hhd和ssd。

在同一个vdev中使用不同大小的硬盘会造成空间的浪费;在一个阵列中使用不同大小的vdev,会造成读写的不均衡(zfs优先写入剩余空间较多的vdev)。

6.预留足够多的剩余空间

剩余空间小于阈值(一般认为是10%)时,zfs会切换写入模式,这时阵列的写入速度会显著降低。

7.合理选择阵列卡/直通卡

sata3.0的带宽是6Gbps,在单块hdd或ssd的情况下,是基本跑不满这个带宽的。

但是考虑到大部分阵列都是插在阵列卡/直通卡上,情况就有了点变化。

阵列卡上的硬盘会共享阵列卡带宽!

以R720经常搭配的h310m为例,这个卡是pcie2.0*8的,理论最大带宽只有4GB/s,阵列里硬盘多了,再加几块ssd,很容易打满带宽。

sas这块我不太了解,就不再展开了。

8.不要和硬raid套娃

在合理配置的情况下,zfs的性能和冗余性已经很不错了。直接把硬盘直通给zfs就好,不要在上层使用硬raid套娃,这样只会带来更多潜在的风险和性能损失。

9.不要使用smr硬盘

这个就不需要多说了吧,玩nas的同学都懂的。

配置篇

1.开启巨型帧

很多人配好万兆nas都会忘记的一个配置。实测万兆网络在默认MTU(1500)的情况下,smb协议最高能跑到300MB左右,开启后可以跑满带宽。

吐槽下,win11修改完MTU经常莫名其妙掉回默认值,当发现网速不正常的时候,请优先检查MTU!

修改方法:

freenas中,Network->Interfaces->Edit->MTU,万兆网建议改成9000.

windows中,控制面板->网络和 Internet->网络连接->右键属性->配置->高级->Jumbo Packet,万兆网建议改成9000。

如何测试是否开启巨型帧?

ping个大package给freenas,有返回值说明开启成功。

ping 192.168.2.162 -l 8962

2.关闭atime

truenas默认会打开atime,即每次访问都会更新文件的atime(访问时间)属性。这个设置会显著拖慢小文件的读性能(把读变成了读+写)。

目测大部分人都没有这个需求(除了要监控是不是有人看过nas上的小电影?)。

关闭方法:Storage->Pools->Edit Options->Enable Atime

3.合理选择去重和压缩

去重

去重相当吃资源。

开启去重后,对每个dataset,会生成一张deduplication table,消耗相当多的内存资源(一般来说每T的数据对应1G的去重表),同时写入时需要做去重处理,也会吃掉可观的cpu。

建议如果没有强需求,最好直接关闭去重。

配置方法:Storage->Pools->Edit Options->ZFS Deduplication

压缩

压缩对性能是把双刃剑。

一方面,开启压缩会消耗大量cpu资源。

另一方面,压缩后数据变小,降低了对硬盘io的需求。

所以,具体是否开启压缩,建议测试后决定。

配置方法:Storage->Pools->Edit Options->Compression Level

4.禁用同步写

啥是同步写,同步写和异步写有啥区别?这里非常不严谨的说明下。

开启同步写,且无slog时,同步写的数据流向

数据->硬盘->返回写入成功

=====================================

开启同步写,且有slog设备的情况下,同步写的数据流向

数据->slog设备->返回写入成功

->内存

—内存中的数据定期刷入硬盘

=====================================

异步写的数据流向

数据->内存->返回写入成功

—内存中的数据定期刷入硬盘

可以看到,在开启同步写后,同步写的写入请求必须等待硬盘写入完成后,才会返回写入成功。

如何判断服务是同步写还是异步写?

smb一般是异步写

nfs可以指定同步写和异步写

如何关闭同步写?Storage->Pools->Edit Options->Sync->Disabled

5.使用Autotune

注意:截至2022.3,只建议在truenas core上使用autotune,按开发人员的说法,truenas scale上面并没有做太多tunable的工作。

Truenas会根据机器配置对zfs参数做一些微调,大部分场景下,开启autotune后zfs性能都能达到当前硬件下不错的效果。

开启方法:System->Advanced->Enable Autotune

一些比较冷门的设置

1.我超有钱,用的是全ssd阵列,是不是不需要内存缓存(arc)了?

理论上可以,linus也是这么玩的,可以指定内存只存储metadata,不作为arc使用。

设置方法:

zfs set primarycache=metadata tank/datab

参考资料



——此处是内容的分割线——

除非注明,否则均为广陌原创文章,转载必须以链接形式标明本文链接

本文链接:https://www.utopiafar.com/2022/03/26/how_to_improve_zfs_performance_on_freenas/

码字不易,如果觉得内容有帮助,欢迎留言or点赞!


《 “提高truenas上zfs性能的几个小tips” 》 有 4 条评论

  1. 异步写入的时候:内存中的数据定期刷入硬盘,这个时长是多久才会刷入硬盘?是否可以设置?

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注