Prometheus (Docker):确定每个节点的可用内存(哪个指标是正确的?)

Posted

技术标签:

【中文标题】Prometheus (Docker):确定每个节点的可用内存(哪个指标是正确的?)【英文标题】:Prometheus (Docker): determine available memory per node (which metric is correct?) 【发布时间】:2020-08-28 06:21:31 【问题描述】:

我们一直在努力为运行 Docker 组件的节点创建良好的内存监控。我们将 Prometheus 与 cadvisor 和 node_exporter 结合使用。

确定每个节点已用内存的最佳方法是什么?

方法 1:在我们的示例中给出大约 42%

(1-(node_memory_MemAvailable_bytes/node_memory_MemTotal_bytes))*100

方法 2:大约 80%

(1-((node_memory_MemFree_bytes+node_memory_Buffers_bytes+node_memory_Cached_bytes)/node_memory_MemTotal_bytes))*100

Q2:为什么会有这种差异?我能从中学到什么?

所以我更深入地确定了各个指标:

    空闲内存:在我们的实验中约为 5%

    (node_memory_MemFree_bytes/node_memory_MemTotal_bytes)*100

    缓冲内存:大约 0.002%

    (node_memory_Buffers_bytes/node_memory_MemTotal_bytes)*100

    缓存内存:大约 15%

    (node_memory_Cached_bytes/node_memory_MemTotal_bytes)*100

    可用内存:58%

    (node_memory_MemAvailable_bytes/node_memory_MemTotal_bytes)*100

我希望 FreeMem + BufferedMem + CachedMem 会在 AvailableMem 周围。但这不是这个简单实验的结果。

Q3:为什么这不是真的?

据说Linux上的空闲内存由free mem + buffered mem + cached mem组成。当内存不足时,可以释放缓存的内存等。

【问题讨论】:

【参考方案1】:

本文档详细说明了这些数字的含义: https://github.com/torvalds/linux/blob/master/Documentation/filesystems/proc.rst#meminfo

内存可用: 估计有多少内存可用于启动新应用程序,无需交换。根据 MemFree、SReclaimable、文件 LRU 列表的大小以及每个区域中的低水位线计算得出。该估计考虑到系统需要一些页面缓存才能正常运行,并且由于项目正在使用,并非所有可回收的slab都是可回收的。这些因素的影响因系统而异。

所以 MemAvailable 是估计在不交换新进程的情况下可以使用多少内存。 FreeMem 只是计算成 MemAvailable 的一部分。 BufferedMem 和 CachedMem 可能会被纳入估计,但这些只是可能被回收的内存的一小部分:

缓冲区: 原始磁盘块的相对临时存储不应变得非常大(20MB 左右)

缓存: 从磁盘读取的文件的内存缓存(页面缓存)。不包括 SwapCached

【讨论】:

以上是关于Prometheus (Docker):确定每个节点的可用内存(哪个指标是正确的?)的主要内容,如果未能解决你的问题,请参考以下文章

Prometheus Operator 架构 - 每天5分钟玩转 Docker 容器技术(178)

Prometheus Operator 架构 - 每天5分钟玩转 Docker 容器技术(178)

使用 Prometheus 如何监控每个实例提供自己的 /metrics 的扩展 Docker 服务?

ECS 中 docker 任务的 Prometheus 指标抓取

Prometheus Operator - 每天5分钟玩转 Docker 容器技术(177)

72-云原生监控-Prometheus实现Docker监控