我复制了一个红迪网帖子这问了我的问题但尚未得到答复:
过去几周我一直在修改一个工具来监控 ZFS 使用情况和统计数据。当我弄清楚它告诉我什么时,它鼓励我更多地了解 ZFS。我完成了几乎所有这些工作后,只有在了解了我所做的事情和原因之后才进行调整。
一件事让我难住了,警告说 dnode_size 不应大于 arc_dnode_limit*0.9
$ grep dnode /proc/spl/kstat/zfs/arcstats
dnode_size 4 334416720
arc_dnode_limit 4 307463731
那么334416720! > 276717357.9 ....呃..哎呀!我远远高于这个建议......
我发现了很多关于 dnode 的好信息,特别是打开 ZFS 文档内容丰富。但我还没有找到任何关于我的 dnode_size 比 arc_dnode_limit 高得多意味着什么的好信息,更不用说我应该对此做什么了。
有人可以解释一下这个警报想告诉我什么吗?这实际上是一个问题还是这只是那些“好的建议”之一?
答案1
TL,DR:所以设置一个更高的限制。
我无法回答你的问题是否真的是一个问题,但如果你担心你的使用量超出了限制,你可能会考虑你的限制是否被人为地降低,而你的用例只是需要更高的限制。
这是在 FreeBSD 上进行的,因此您需要仔细阅读字里行间和 YMMV,但在我的具有 16GB RAM 和单设备非冗余 VDEV 460GB 的 FreeBSD 14 笔记本电脑上没有覆盖,FreeBSD 默认限制为 1,594,027,212我当前的“大小/限制”比率是 0.0008:
(No dnode setting overrides in /etc/sysctl.conf:)
$ grep dnode /etc/sysctl.conf
$ sysctl -a | egrep 'dnode_(size|limit)'
vfs.zfs.arc.dnode_limit_percent: 10
vfs.zfs.arc.dnode_limit: 0
kstat.zfs.misc.arcstats.arc_dnode_limit: 1594027212
kstat.zfs.misc.arcstats.dnode_size: 1362288
$ bc <<< "scale=4; $(sysctl -n kstat.zfs.misc.arcstats.dnode_size) / $(sysctl -n kstat.zfs.misc.arcstats.arc_dnode_limit)"
.0008
如果我人为地设置一个下限(例如 2^20)并重新启动,那么是的,我的比率高于“建议”:
$ grep dnode /etc/sysctl.conf
vfs.zfs.arc.dnode_limit=1048576
$ sysctl -a | egrep 'dnode_(size|limit)'
vfs.zfs.arc.dnode_limit_percent: 10
vfs.zfs.arc.dnode_limit: 1048576
kstat.zfs.misc.arcstats.arc_dnode_limit: 1048576
kstat.zfs.misc.arcstats.dnode_size: 1358248
$ bc <<< "scale=4; $(sysctl -n kstat.zfs.misc.arcstats.dnode_size) / $(sysctl -n kstat.zfs.misc.arcstats.arc_dnode_limit)"
1.2960
同样,如果我觉得操作系统选择的默认限制太低,我可以设置更大的限制,以实现更低的比率 0.0006:
$ grep dnode /etc/sysctl.conf
vfs.zfs.arc.dnode_limit=2147483648
$ sysctl -a | egrep 'dnode_(size|limit)'
vfs.zfs.arc.dnode_limit_percent: 10
vfs.zfs.arc.dnode_limit: 2147483648
kstat.zfs.misc.arcstats.arc_dnode_limit: 2147483648
kstat.zfs.misc.arcstats.dnode_size: 1376024
$ bc <<< "scale=4; $(sysctl -n kstat.zfs.misc.arcstats.dnode_size) / $(sysctl -n kstat.zfs.misc.arcstats.arc_dnode_limit)"
.0006
我的绝大多数 ZFS 用例都在 FreeBSD 上,但 OpenZFS 文档建议:
在某些情况下,必须在加载内核模块之前设置参数,或者希望在引导时自动设置参数。对于许多发行版,这可以通过创建一个名为 /etc/modprobe.d/zfs.conf 的文件来完成,该文件包含每个模块参数的文本行,使用以下格式:
# change PARAMETER for workload XZY to solve problem PROBLEM_DESCRIPTION
# changed by YOUR_NAME on DATE
options zfs PARAMETER=VALUE
尝试提高 dnode 限制,然后重新启动,看看您的已用/限制比率是否有所改善。