使用 ZFS 时 Linux 中的内存报告差异

使用 ZFS 时 Linux 中的内存报告差异

我有一台 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


因此,我的问题是:

  1. 看起来htop内存报告比所有其他实用程序都更准确,为什么?

  2. 如何查看 ZFS 实际保留了多少内存?

  3. 是否可以调整 Prometheus 节点导出器以更准确地报告它(就像htop这样)?

  4. ZFS 保留的内存是否可以供其他进程认领?

  5. 我如何知道我的机器何时需要更多 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;
}

相关内容