假设我有一些经常访问的数据和一些不经常访问的数据。我知道 ARC 最终会学会停止驱逐经常访问的数据,以便为其他数据腾出空间,因为其他数据最近被访问过。假设我已经运行 ZFS 系统很长一段时间了,它已经掌握了这种访问模式。
如果我重新启动我的机器,并且经常访问的数据只是被读取,因此在 ARC 中,那么对其他数据的新读取是否会导致其被驱逐?或者 ZFS 会记得这些数据是经常使用的吗?
如果它依赖于实现,那么这个问题特别与 Solaris 有关。
答案1
ARC 没有任何持久计数器,因此它必须再次查看您的访问模式,以确定某些东西是否经常使用。但是,它不会驱逐任何东西,直到它已满/系统上存在其他东西的内存压力,因此在首次启动时一切读取或写入的数据最终都会进入缓存。只要您经常访问的数据在此之前被读取两次,它就应该进入“MFU”列表。
您可以阅读有关 ARC 算法的更多信息这里简而言之,它实际上由两个 LRU 列表组成,一个用于访问过一次的内容(“MRU 列表”),另一个用于访问过两次或两次以上的内容(“MFU 列表”——是的,这个名字不正确,它实际上使用 LRU 来驱逐,因为 LRU 比 MFU 更快、更易于实现)。还有“幽灵列表”,用于跟踪每个列表中最近被驱逐的键(但不是数据),这有助于它确定两个缓存相对于彼此的大小。
L2ARC 是持久性的(通常存储在 SSD 上),但不使用 ARC 算法(又一个不太理想的名称)。我相信它只是在缓存中循环数据。此外,我相信除非您使用 Nexenta 的 OpenZFS 分支(我认为他们还没有将其发布到上游),否则重启后您无法重新使用它。
除了 Nexenta 的“持久 L2ARC”功能外,这个答案中没有任何内容是特定于平台的。