坑边闲话:感觉这个 SN850X 的 SLC 策略挺有意思的。

前两天研究了一下 ZFS 的 ARC 策略,它大体是这样的。ARC 原本是 IBM 的专利算法,后来被 ZFS 改进升级,能支持不同的 Block Size,而且 Cache 块指针的类型可以在 LRU 和 LFU 之间切换[1]。

西部数据这个挺有意思,感觉创新性很大。尽可能把数据驻留在 SLC 状态的闪存里会提升读取速度,毕竟 SLC 比较简单,译码的时候无须主控调动复杂的纠错码。但是到底要不要采用 ARC 机制就不好说了。ARC 是加速读取,用各种动态适应性算法保证 LFU 和 LRU 都能驻留在 Cache 里,而不是像传统算法那样只能保证其中一种的可用性。

不过话说回来,这个 SLC/TLC 之间的缓存策略挺复杂。ZFS ARC 仅仅是读缓存,ARC 失效不会影响到 data vdev 里的数据。但是固态里的 SLC 和 TLC 一般是没有包含关系的。SN850X 动不动就 850MB/s 的缓外可能就是这个地方没处理好,导致有些数据频繁在 SLC 和 TLC 里挪动,所以也有可能造成写放大。TLC 的直读一般不会很慢,所以我猜测 SLC 的策略可能只是在 evict 时生效,并不会主动将 TLC 里的数据挪到 SLC 里,毕竟这样的代价太大。当一次性写入超过 SLC 容量限制,直接触发缓外 TLC 直写和 SLC evict 两个事件,一平分大概就是 800MB/s 的写速了。或许这里可以再借鉴一下 ZFS ZIL,弄个 SLC to TLC 的 victim area,防止超出 SLC 的部分写两次带来的双倍开销。

  • Aaron Toponce : ZFS Administration, Part IV- The Adjustable Replacement Cache (pthree.org)