使用Grafana Dashboard ID395展示节点内存异常问题排查
问题背景
使用Grafana仪表盘(ID 395)展示Docker容器及主机参数时,节点内存显示异常,当前查询语句:
- H:
node_memory_MemTotal_bytes(标注为"Available Memory",已隐藏) - G:
node_memory_MemTotal_bytes - node_memory_MemAvailable_bytes(标注为"Unavailable Memory")
存在以下疑问:
- 为何查询G(不可用内存)未显示折线图?
- 为何Y轴最大内存显示为3.73 GiB,而非实际的15.2 GiB?
- 隐藏查询H后,查询G的图表显示为总内存,问题出在哪里?
问题分析与修复
Q2:Y轴最大值异常
从提供的面板JSON中可以看到,Y轴被手动设置了固定最大值4200000000(约3.9 GiB),这就是显示最大值与实际15.2 GiB不符的原因。
修复步骤:
编辑面板的Y轴设置,将max字段清空,让Grafana自动根据数据计算Y轴最大值。
Q1:查询G未显示折线图 & 隐藏H后G显示总内存
这两个问题的根源是以下几点:
指标名称不匹配
JSON中其他内存指标(如node_memory_MemFree、node_memory_Active)均不带_bytes后缀,但你的查询使用了node_memory_MemTotal_bytes和node_memory_MemAvailable_bytes。如果Prometheus中不存在node_memory_MemAvailable_bytes指标,那么查询G会退化为node_memory_MemTotal_bytes(减去不存在的指标会被忽略),这就解释了隐藏H后G显示总内存的现象。验证方法:在Prometheus的查询界面直接执行
node_memory_MemAvailable_bytes,确认是否有返回数据。如果没有,改用不带_bytes的node_memory_MemAvailable。堆叠设置错误
面板开启了stack: true(堆叠显示),但你的两个查询是总内存与已用内存的关系,堆叠会导致数值叠加,而非正常的对比显示。同时,H被隐藏但仍参与堆叠,导致G的数值超出Y轴固定最大值,被截断无法显示。修复步骤:关闭面板的堆叠设置(将
stack改为false)。图例标注错误
查询H的语句是总内存node_memory_MemTotal_bytes,但图例标注为"Available Memory",这会导致逻辑混淆。应将H的legendFormat改为"Total Memory",如果需要显示可用内存,应单独查询node_memory_MemAvailable_bytes(或对应不带_bytes的指标)并标注为"Available Memory"。
优化后的查询建议
如果要正确显示总内存、已用内存、可用内存,建议使用以下查询:
- 总内存:
node_memory_MemTotal_bytes(或node_memory_MemTotal,根据实际指标调整),图例"Total Memory" - 已用内存:
node_memory_MemTotal_bytes - node_memory_MemAvailable_bytes(或对应不带_bytes的版本),图例"Used Memory" - 可用内存:
node_memory_MemAvailable_bytes(或对应不带_bytes的版本),图例"Available Memory"
同时确保关闭面板的堆叠设置,Y轴设置为自动计算最大值。
内容的提问来源于stack exchange,提问作者MsA

