我有一台运行 FreeBSD 的机器,它承受着各种各样的工作负载,从磁盘密集型到内存密集型。
如果访问大量 ZFS 数据,则有线内存使用量会迅速增长到 95GB(而实际安装的内存仅为 96GB),从而导致进程崩溃和机器无响应。
checksetuid 和 neggrpperp 进程能够自行触发此操作。
作为一种解决方法,将其设置vfs.zfs.arc_max
为系统 RAM 的一半左右可以防止进程崩溃,但是这也可能存在性能问题,有时如果系统可以在其他进程不需要 RAM 时为 arc 分配更多的 RAM,那将是最佳的。
当其他进程需要 RAM 时,有线内存使用量似乎下降得非常慢。
security_status_chksetuid_enable 和 security_status_neggrpperm_enable 也设置为 NO,以免用无用的东西填充弧。
vfs.zfs.arc_max
从根本上来说,除了设置为稍微任意的值之外,有没有更好的方法来处理这个问题?
答案1
在任何使用 ZFS 的系统中,ZFS ARC 都会自动扩展。ARC 限制只是一种解决方法;您遇到的行为对于 11.x 之前的 FreeBSD 来说非常常见(但是,我个人没有看到任何崩溃 - 只有无效的内存使用);在 11.0 版本发布后,这种行为得到了极大缓解(因此,如果您使用的是 10.x 甚至 9.x,请升级)。如果您在最近的 12.x 上仍然看到此问题,请在 freebsd-stable@ ML 中发布消息或提交综合 PR。我认为向 Open-ZFS 错误跟踪器或 ML 提交问题单是不合适的。您还可以使用端口sysutils/zfs-stats
来缩小内存内核部分和 ARC 本身内部发生的情况,在咨询 stable@ ML 时,您可能会被要求附上结果。