ZFS是否该启用ZIL和L2ARC

最近准备对家里的存储设备做一次升级,考虑到黑群晖社区日益没落,我也打算投入到白群的阵营,多出来的Gen8打算装上Freenas来纯粹作为一个后端存储挂载给群晖使用。在前期调研Freenas和ZFS文件系统的时候,由于Gen8里面有一块256G的SSD,关于ZIL和L2ARC这两个ZFS至关重要的读写缓存是否应该启用遇到了很大的纠结,因此做了一些研究,把过程和结论写出来分享给各位。

既然说到ZIL和L2ARC是否该启用,首先需要先普及下这两个缓存在ZFS文件系统中到底起到什么作用:

ZIL

首先看下官方文档中对于ZIL缓存的解释:

ZFS provides a write cache in RAM as well as a ZFS Intent Log (ZIL). The ZIL is a storage area that temporarily holds synchronous writes until they are written to the ZFS pool

不难看出,ZIL是针对同步写入的场景,把同步写入转换为异步写入,使得系统不必卡住等待写入完成,而从而提升系统整体的写入性能。因此只有当你的存储存在大量同步写入的场景时,通过低延迟的SSD等设备来缓存写入场景才能让ZIL明显的提升性能,官方建议在NFS over ESXi以及数据库应用等这类高同步写入场景中来使用ZIL,而且由于ZIL设备一旦出现问题会导致数据丢失,因此建议先针对SSD等设备做双盘镜像后再用于ZIL。
重点来了,在SMB、AFP和iSCSI这类我们常用的家庭NAS共享协议场景下,同步写入的场景是非常非常少的,因此使用ZIL并不能明显提升性能,因此,在家用场景下,官方并不建议我们使用专门的设备来启用ZIL。

L2ARC

既然写入缓存无用,那L2ARC这类读取缓存是否有必要呢?同样的我们先了解下什么是L2ARC

ZFS provides a read cache in RAM, known as the ARC, which reduces read latency. If an SSD is dedicated as a cache device, it is known as an L2ARC. Additional read data is cached here, which can increase random read performance.

ZFS默认使用内存来作为读取缓存,但是也可以把SSD作为二级缓存来进行使用,逻辑上来讲自然是设置二级缓存是好的,但是官方文档中,还存在如下一段描述:

L2ARC does not reduce the need for sufficient RAM. In fact, L2ARC needs RAM to function. If there is not enough RAM for a adequately-sized ARC, adding an L2ARC will not increase performance. Performance actually decreases in most cases, potentially causing system instability. RAM is always faster than disks, so always add as much RAM as possible before considering whether the system can benefit from an L2ARC device.

事实上,二级缓存需要依赖更大的内存来发挥作用,根据官方建议,针对小于32G的内存场景下,不推荐开启L2ARC缓存,并且L2ARC的缓存大小一般不能超过内存的10倍。

综上所述,针对家庭应用场景(比如想我这种用一台Gen8提供NAS服务的),一般来讲由于使用场景偏文件共享,系统内存一般也都不会超过32G,完全没有必要使用单独的SSD来启用ZIL和L2ARC,至于我这块SSD如何继续发光发热,我再想想办法吧~