如何用PromQL查询可用内存?不含缓存和缓冲区的查询是否正确?
PromQL查询不含缓存和缓冲区的可用内存问题解答
你的参考查询语句无法正确实现需求
你给出的这条查询:
# Node Exporter : Memory used >= 75% (Without Cache, Buffer) (node_memory_MemTotal_bytes - node_memory_MemFree_bytes)/ node_memory_MemTotal_bytes * 100 <= 25
不能正确查询到不含缓存和缓冲区的可用内存,原因很明确:
node_memory_MemFree_bytes仅代表系统中完全未被使用的内存;- 它没有包含可以被系统回收复用的
node_memory_Buffers_bytes(缓冲区)和node_memory_Cached_bytes(缓存),而这两部分内存属于“可用”范畴,应用需要时会被即时释放。
正确的查询语句
如果要统计不含缓存和缓冲区的可用内存占比≥25%(对应已用内存≤75%),正确的计算逻辑是把可回收的缓存和缓冲区算入可用内存:
(node_memory_MemFree_bytes + node_memory_Buffers_bytes + node_memory_Cached_bytes) / node_memory_MemTotal_bytes * 100 >= 25
如果要直接对应“已用内存≥75%”的告警条件,写法为:
(node_memory_MemTotal_bytes - (node_memory_MemFree_bytes + node_memory_Buffers_bytes + node_memory_Cached_bytes)) / node_memory_MemTotal_bytes * 100 >= 75
关于node_memory_MemAvailable_bytes的说明
你之前使用的node_memory_MemAvailable_bytes是内核直接计算出的、预估可立即分配给应用的内存总量,它已经包含了空闲内存、可回收缓存和缓冲区。如果查询结果不符合预期,大概率是以下情况:
- 你对“可用内存”的定义和内核的计算逻辑存在差异;
- 使用的Node Exporter版本过旧,该指标的计算逻辑不完善或未被支持。
内容的提问来源于stack exchange,提问作者Astrid
相关产品推荐
相关产品推荐

