坑边闲话:Allan Jude 是真正的存储专家,他是一位资深的程序员和开源贡献者,而且运营着一家声誉良好的公司。笔者一直 follow 他的动态。本文介绍他的一篇博客。

最近看到 Allan Jude 的一篇关于 ARC 的很有意思的文章

图 1. Allan Jude 文章的部分截图。

ZFS 的 ARC 缓存是一种比较高级的 cache 策略,它不同于常见的 LRU 和 MFU,反而是同时使用多种缓存策略,然后通过 P 值(可以理解为不同策略的分界线)和幽灵引用列表对两种策略的占比进行动态调整,这类似于某种滑动窗口。这一点我在之前的视频里讲过,这里就不再展开了。

Allan 的这篇文章主要介绍了 OpenZFS 2.2.0 带来的 ARC 新特性。我们知道,ARC 里缓存的不仅仅是文件,还有元数据、块引用、间接块等非文件数据(后面统一叫 metadata)。metadata 等数据在 ARC 里的占比在老版本的 ZFS 里一直是固定的 75%,这很不好,因为存储所面对的计算场景可能有自己的特殊要求,如果 75% 不够用,将会产生效能下降。

那么如何优化 ZFS 才能让 metadata 占比更灵活呢? 聪明的地方来了,答案就是再次使用 ARC 算法。我们可以将 metadata 和 file 的缓存设置为两个独立的 ARC 区域,两者的占比通过 ARC 机制进行动态调整,随着开机的时间变长,两者的比值将接近一个完美的数值。

看完真是感觉太妙了!

总结一下:

  • ARC 算法第一次利用:确定 ZFS 读缓存里 MRU 和 MFU 的区块比例。
  • 第二次利用:确定整个缓存里 file 和 metadata 的比例。

题外话·

最后再说句题外话。Mac mini 扩容视频里我提到可以考虑 QLC,只要价格足够便宜。因为大多数人只是预算受限而已,所以没必要太纠结性能。多少年前机械硬盘时代不还是用得好好的?而且文件系统的优化策略会让后端磁盘的很多弊病被遮盖起来,将低端硬件对用户产生的负面影响降低到不可感知的层次,这就是算法的魅力。