8

我们一直在努力为运行 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:为什么会有这种差异?我能从中学到什么?

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

  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组成。当内存不足时,可以释放缓存的内存等。

4

1 回答 1

5

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

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

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

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

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

于 2021-04-28T14:20:48.550 回答