GKE集群内存使用率查询及内存类型疑问(Prometheus+Grafana)
GKE集群内存使用率监控相关疑问
我想要获取GKE集群的内存使用率(百分比)并在Grafana仪表板上展示,编写了如下Prometheus查询:
sum(kubernetes_io:node_memory_used_bytes{cluster_name="my-cluster-name"})/sum(kubernetes_io:node_memory_total_bytes{cluster_name="my-cluster-name"})*100
单独查询kubernetes_io:node_memory_used_bytes{cluster_name="my-cluster-name"}或kubernetes_io:node_memory_total_bytes{cluster_name="my-cluster-name"}会返回每个节点的内存数据,因此我对所有节点的已用内存和总内存分别求和计算。
我的疑问如下:
- 该查询是否合理?还是应该按每个节点计算内存使用率?
- evictable和non-evictable内存类型有什么区别?我查阅了官方文档,但仍未理解其含义。是否仅需计算non-evictable内存的使用率?
官方文档原文:
memory_type: Either
evictableornon-evictable. Evictable memory is memory that can be easily reclaimed by the kernel, while non-evictable memory cannot.
疑问解答
1. 查询合理性分析
你的查询有一定合理性,但取决于监控目标:
- 如果需求是看整个集群层面的整体内存使用率趋势,求和后计算的方式完全可行,能快速掌握集群内存资源的整体消耗情况,适合放在集群概览类的Grafana面板中。
- 但如果需要排查节点级别的资源瓶颈,这种求和方式会掩盖单个节点的异常(比如某节点内存使用率90%,但其他节点使用率极低,求和后整体使用率可能看起来正常)。这种情况下,应该按每个节点计算使用率,对应查询修改为:
这样能看到每个节点的内存使用率,方便定位特定节点的资源问题。(kubernetes_io:node_memory_used_bytes{cluster_name="my-cluster-name"}/kubernetes_io:node_memory_total_bytes{cluster_name="my-cluster-name"})*100
建议在Grafana中同时展示两种视图:一个集群整体使用率面板,再加一个节点级别的使用率列表或热力图,兼顾全局概览和细节排查。
2. Evictable与Non-evictable内存区别
官方文档翻译:
memory_type:分为
evictable(可回收)和non-evictable(不可回收)两类。可回收内存指内核可以轻松回收的内存,而不可回收内存则无法被内核回收。
具体区分:
- Evictable内存:比如页缓存(page cache)、临时进程的内存页等,当系统内存紧张时,内核可以直接释放这部分内存给其他进程使用,不需要终止任何进程。这部分属于“缓冲”性质的消耗,不会直接触发OOM(内存不足)。
- Non-evictable内存:比如正在运行的进程的堆内存、栈内存,内核无法主动回收这部分内存,必须等到进程退出或被OOM Killer杀死才能释放。这部分是真正被进程“占用”的内存,使用率过高会直接引发内存压力,甚至触发节点驱逐Pod的行为。
是否只计算non-evictable内存?
- 若关注节点实际不可回收的内存占用(即真正的内存压力),可以只统计non-evictable的使用率,对应查询需添加
memory_type="non-evictable"标签:sum(kubernetes_io:node_memory_used_bytes{cluster_name="my-cluster-name", memory_type="non-evictable"})/sum(kubernetes_io:node_memory_total_bytes{cluster_name="my-cluster-name"})*100 - 若要反映节点内存的整体消耗情况(包括缓冲类可回收内存),则保留原查询即可,也可以同时展示两种指标,更全面地了解内存状态。
内容的提问来源于stack exchange,提问作者ksy
相关产品推荐
相关产品推荐

