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

tm1*_*701 6 docker-swarm prometheus prometheus-node-exporter

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

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

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

(1-(node_memory_MemAvailable_bytes/node_memory_MemTotal_bytes))*100
Run Code Online (Sandbox Code Playgroud)

方法 2:给出大约 80%

(1-((node_memory_MemFree_bytes+node_memory_Buffers_bytes+node_memory_Cached_bytes)/node_memory_MemTotal_bytes))*100
Run Code Online (Sandbox Code Playgroud)

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

因此,我对确定的各个指标进行了更深入的研究:

  1. 可用内存:在我们的实验中约为 5%

    (node_memory_MemFree_bytes/node_memory_MemTotal_bytes)*100

  2. 缓冲内存:约 0.002%

    (node_memory_Buffers_bytes/node_memory_MemTotal_bytes)*100

  3. 缓存内存:约 15%

    (node_memory_Cached_bytes/node_memory_MemTotal_bytes)*100

  4. 可用内存:58%

    (node_memory_MemAvailable_bytes/node_memory_MemTotal_bytes)*100

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

Q3:为什么这不是真的?

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

小智 9

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

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

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

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

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