我有一台 Ubuntu 22.04 Linux 机器,它运行一些服务并大量使用 ZFS 文件系统。在使用各种系统工具时,我观察到内存报告存在一些严重的差异。
例如,该free
命令显示以下数据:
# free -gh
total used free shared buff/cache available
Mem: 125G 119Gi 5.2Gi 1.0M 315Mi 4.5Gi
Swap: 11Gi 0.0Ki 11Gi
该top
命令显示一些类似的数据:
MiB Mem: 128492.1 total, 5506.6 free, 122668.6 used, 316.9 buff/cache
Prometheus 节点导出器还报告 96% 的内存已被占用,并以红色显示。
然而,htop
节目:
Mem: 125G used: 60.4G buffers: 8.27M cache: 59.8G
我知道缓冲区/缓存和其他内容,但正如您所见,该free
实用程序没有报告大缓冲区。我的理解是 ZFS 保留内存来缓冲/缓存一些数据,但系统实用程序没有报告这一点,此外htop
。
因此,我的问题是:
看起来
htop
内存报告比所有其他实用程序都更准确,为什么?如何查看 ZFS 实际保留了多少内存?
是否可以调整 Prometheus 节点导出器以更准确地报告它(就像
htop
这样)?ZFS 保留的内存是否可以供其他进程认领?
我如何知道我的机器何时需要更多 RAM?我的意思是在它开始使用 SWAP 空间之前。
答案1
可能是 ZFS ARC。它与 Linux 页面缓存非常相似,只不过它是独立的东西,有自己的内核内存分配,与“缓冲区/缓存”分开,这是有原因的。
看起来 htop 内存报告比所有其他实用程序都更准确,为什么?
Htop 并不回避添加特定于平台的测量,在这种情况下,它有专门获取 ZFS 统计数据的代码。您甚至可以将其作为单独的项目添加到标题中。
(但是,另一方面,procps-ng 已经可以在 中报告 systemd 甚至 Docker 元数据ps
,因此对于他们来说,将 ZFS ARC 统计数据添加到 中并不是什么难事free
,但到目前为止他们还没有这样做。)
如何查看 ZFS 实际保留了多少内存?
阅读/proc/spl/kstat/zfs/arcstats
。(我记得它还有一个供人类使用的 CLI 工具,但不记得是什么工具;但是,htop 和其他自动报告工具应该直接从 /proc 获取数字。)
ZFS 保留的内存是否可以供其他进程认领?
理论上是的;我听说 ARC 具有自动收缩功能,就像页面缓存一样。由于我最近没有使用过 ZFS,所以我会让其他人来补充该功能在实践中是否有效。
答案2
如果有人感兴趣计算在htop
:
if (lhost->zfs.enabled != 0 && !Running_containerized) {
// ZFS does not shrink below the value of zfs_arc_min.
unsigned long long int shrinkableSize = 0;
if (lhost->zfs.size > lhost->zfs.min)
shrinkableSize = lhost->zfs.size - lhost->zfs.min;
this->values[MEMORY_METER_USED] -= shrinkableSize;
this->values[MEMORY_METER_CACHE] += shrinkableSize;
this->values[MEMORY_METER_AVAILABLE] += shrinkableSize;
}