首先这是第一次折腾ZFS这种原本来自于大型机的文件系统。有很多理解还不到位的地方,参考了很多文档,并且做了一定实验后,我得出了以下的一些看法。
FreeNAS作为一个使用OpenZFS的NAS系统,可以使用很多ZFS的特性,其中很重要的就是读写缓存机制。
ZFS的写缓存叫做ZIL (ZFS intent log),而读缓存叫做L2ARC。
ZIL设备实际上是同步写入写缓存,根据不同的操作,有的操作需要用专门的ZIL设备,而有一些则并不需要。最开始ZIL一定是在内存中的,当设定了一个专用ZIL设备时,那么这部分数据会首先同步写入到专用设备中,否则会写入存储池。
注:此图为没有专用ZIL设备时的同步写入方式
注:此图为使用专用ZIL设备(SLOG)时的同步写入方式
那么由此可见在没有专用SLOG的时候,同步写入过程完全依赖于存储池硬盘的速度。而对于有SLOG的情况下,SLOG中的ZIL是同步写入,而对于存储池中磁盘来说就是异步写入了。ZIL中的数据只有在被读取后才会被删除。ZIL会通过RAM刷新存储池的数据,这里操作被称为Transaction Group Commit。
因此这里设备的选择就显而易见了,一般来说最佳选择是带有电池的NVRAM,其次是SSD,再次是万转硬盘,成本也是递减。
前一阵化身卡巴垃圾佬,在ebay上淘了一块硬盘,我用这块硬盘做ZIL/L2ARC测试。
再提一下L2ARC,类似于二级缓存,在内存不足,内存中ARC填满的情况下L2ARC可以充当二级缓存,加快文件访问。
针对是否启用缓存的情况,我做了一下对比测试。首先添加ZIL
进入命令行,可以查看ZIL状态
尝试拷贝数据时,也可以查看到ZIL有数据在读写,说明已经工作正常。
接下去就是测试了,测试采用了iometer 4K 随机写入,持续3200秒,最后对比没有做ZIL之前的数据,得到了以下散点图:
可以明显看出来,增加了ZIL之后对小文件的IO有明显改善。ps.至于这些参数的微调优化,我并没有研究,完全使用默认参数,关闭客户机的磁盘缓存后测试得到,因此,ZIL的作用可能还会有更大的提升空间。
接下来对于L2ARC,我也进行了类似的测试。
由于我启用了16GB内存,总的来说这里的ARC比较充裕,同时根据文档说明,不是所有的操作都会受益于L2ARC,于是得出的散点图中,是否启用L2ARC并没有什么性能差别。
总结这次的测试可以发现,ZFS文件系统以及FreeNAS还有很多很多可以发掘的潜力,但是受限于目前的知识储备以及硬件差别,我还没有办法发挥它最大的能力。FreeNAS对于一些玩家和SOHO用途来说可能是一个非常节约成本而且性能强大的解决方案,但是对于家庭来说,配置还是略显复杂。