记一次ZFS小文件写入性能测试
年初时候重新开始折腾服务器,确定了用Proxmox做主机,TrueNAS Scale 存Data的方式,构建整个服务器的架构。又因为心水ZFS mirror几乎“免费“的高可用能力,义无反顾的又一次上了ZFS车。但是因为ZFS的写入放大,以及有时表现出来的不稳定的性能,心里总是不踏实。看了众多的资料之后,决定还是趁着refactor的机会,自己做一次测试,看看问题究竟有多夸张。
背景信息 | Context
Proxmox和TrueNAS社区都是非常不建议用消费级的SSD的,而对于HDD,因为ZFS基本上会让硬盘保持一直运行的状态,所以最好也是企业级的硬盘。可以说,即使用Proxmox+TrueNAS的初衷只是一个小作坊级别的Server,但是因为workload的特性跟一个正常Server不会有什么区别,所以总还是上企业级好一些。Proxmox对于消费级SSD的抵制,实际上更甚于TrueNAS对于ECC的抵制。
但是消费级SSD究竟能有多糟糕,对于小作坊的场景真就不能用吗?网上的信息林林总总,总归跟自己的情况不一样,有时也是婆说婆有理公说公有理,很难做出准确的判断。
一个比较确切的测试是来自Proxmox,关于ZFS + NVME性能的一个文档
重要的部分截取如下:
但是这里的测试结果实际上跟ZFS无关。这个FIO command 测试的是直写性能,而且似乎也不是random的,但是确实是sync+4K。所以参考价值还是很高的。可惜的是,这个文档并没有测试Samsung 850这类consumer SSD在ZFS上面的表现。我们穷人还是不知道consumer SSD在ZFS上面,一个合理的performance expectation大体是个什么程度。当然从这个结果我们已经可以看到消费级(Samsung 850)和企业级的巨大差别(Intel DC S3500)了。
测试环境 | Setup
主机系统是Proxmox 7.4,CPU是i5 7600k,RAM:64GB,其中16GB给到了TrueNAS Scale虚拟机。主板是历久弥新的Gigabyte z270p。虽然是旧平台了,但是老平台接口全啊(3个PCIEx16物理插槽,3个PCIEx1物理插槽,可惜只有一个NVME,最大也只有64GB内存)。
zfs version
:
- zfs-2.1.6-pve1
- zfs-kmod-2.1.6-pve1
TrueNAS VM直通了一个SATA expansion card,上面接了一个Seagate EXOS 14TB和一个 WD EDGZ 白标拆机 14TB,两个应该都可以算是企业级HDD,组成ZFS Mirror。TrueNAS VM只给了2个CPU Core。
- Version: TrueNAS-SCALE-22.12.0
- ARC max size: <8GB (by default arc is 50% of the system memory for TrueNAS Scale as it is on Linux)
另外手上可以用来测试的SSD:
- Crucial M500 480GB。一个相当早的SSD了,但是这种早期的SSD是被ZFS认为带有Power Lost Protection (PLP)的(详见这里)。所以给ZFS用还有可能是比现在的SSD更好的选择。
- Crucial MX500 512GB。一个现在被认为在SATA SSD品类里面不会错的选择。作为消费级标杆(i.e. 比上不足比下有余)非常合适。
- ADATA LEGEND 850 2TB PCIE 4.0 NVME。一个PCIE 4.0中速NVME。对于NVME,受限于主板的pcie 3.0 m.2接口,我们这里只做大体上定性的分析,具体说数值很可能不是很有参考性。
这里有几个地方肯定是犯了众怒的,但是有限于条件,只能将就了。
- Memory不是ECC。不过这个应该不影响性能。
- 两个HDD是接在SATA Expansion card上面,而不是正经HBA card。而且SATA expansion card还是接在pcie 3.0 x1的接口上。此处的安排并不推荐。但是个人用下来目前没有什么问题。pcie 3.0 x1的接口速度对于两个HDD来讲还是够的,大体上到4块HDD的时候才有一点点可能出问题。
- TrueNAS是VM。依旧不推荐这个安排,但是对于家用以及小作坊,个人认为也是可以的。只要确保硬盘是通过PCI控制器直通进TrueNAS就行。而且仅限于偏向AIO的架构方案,如果要严肃一点的话,VM和Data还是物理上分离为好,或者彻底做HCI方案亦可。
测试会偏向于4K的测试,因为之前在使用这两个SATA SSD作为VM的storage时,观察到性能非常令人失望,所以才有的这个测试。具体就是要看看小文件写入上面的区别。
测试会采用如下命令
fio --filename=test --sync=1 --rw=randwrite --bs=4k \
--numjobs=1 --iodepth=<qd> --group_reporting \
--name=test --filesize=10G --runtime=<time>
qd
: 1, 16, 32time
: 300 seconds or 60 seconds 主要是300太长了,等不及了。
测试会对比一下,2个HDD组成ZFS mirror的情况,然后看看2个sata SDD组成 ZFS mirror的情况,相比HDD孰优孰劣。之后看看NVME能有多大的提高。因为手上只有一个NVME,主板上也只有一个m.2接口,所以NVME就没有办法mirror了。
NVME的单盘ZFS性能测试和HDD ZFS Mirror是在TrueNAS之下做的。而M500+MX500的 ZFS mirror是在Proxmox下面做的。测试时NVME里面大概有100G的数据,HDD里面有1TB数据,M500/MX500里面有300G数据(这个比例对于480G的总空间来讲算是比较多的了)
而后NVME被从TrueNAS中取出(实际上是NVME的Controller直通被取消),然后在Proxmox上面组LVM Thin,用来支持LXC。之后创建了一个Ubuntu 22.04的LXC,分配592GB的空间,在这个LXC里面运行fio进行写入测试。
测试与结果 | Tests and Results
除非特殊说明,测试都采用 job=1的参数,所以测试结果并不是这个硬盘的最大性能。应该说,目的就不是最大性能,而是看看对于单纯的一个写入磁盘的操作,性能差别能有多大。(而且我总是怀疑这个job和queue depth是不是有重叠。)