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 指标抓取