我正在尝试了解 ZFS ARC 的内部工作原理。但是,我对几件事感到困惑:
实际大小 (
zfs:0:arcstats:size
) vs 目标大小 (zfs:0:arcstats:c
)。我理解实际大小是分配的,用于存储缓存内容。但是,目标大小是多少呢?这两者之间有什么区别?mru_size (
zfs:0:arcstats:p
) + mfu_size (zfs:0:arcstats:c
-zfs:0:arcstats:p
) vs data_size (zfs:0:arcstats:data_size
)。data_size 不应该是 mru_size 和 mfu_size 的总和吗?正确的 ARC 大小细分是什么?根据http://lists.freebsd.org/pipermail/freebsd-fs/2012-June/014643.html,应该是hdr_size + data_size (mru_size + mfu_size + anon_size) + other_size + l2_hdr_size
,但是这没有任何意义,因为mru_size
通常大于data_size
。arc 内存节流阀有什么用处?
谢谢您的任何回答/指点。
答案1
好吧,我晚了几年,但我希望这可以帮助别人。
c
是目标 ARC 大小。默认情况下,它是总 RAM 的 50%,但如果系统内存不足,它可以根据需要缩小size
是当前的 ARC 大小。如果有足够的时间,它将趋向于c
data_size
是缓存的用户数据的大小。它确实不是包括元数据(这就是为什么在面对元数据繁重的工作负载时它可以比 MRU 和/或 MFU 小得多的原因)metadata_size
缓存元数据的大小hdr_size
主 ARC 中存储的 L2ARC 标头的大小是多少overhead_size
是解压 dentry 时分配的各种缓冲区的大小
答案2
我认为 ARC 的目标大小是它可以增长到多大,而实际大小是它当前使用的大小。我在我的服务器上看到了这一点,我给它 12 GB,但除非我达到这个大小,否则它实际上不会停留在 12 GB。它通常喜欢停留在 10-11 GB。
这里有一个解释内存限制的链接。看起来 ZFS 最初并没有被设计成消耗掉所有内存,这很可能就是它存在的原因。(http://www.zfsbuild.com/2012/04/18/let-zfs-use-all-of-your-ram/)
关于 #2,我不太确定。抱歉。
希望这有帮助!