SystemMemoryExceedsReservation告警规则含义及异常触发问题咨询
SystemMemoryExceedsReservation告警规则说明与异常原因分析
规则判定逻辑
你给出的是Prometheus告警规则,核心判定逻辑可以拆成三部分:
expr: | sum by (node) (container_memory_rss{id="/system.slice"}) > ((sum by (node) (kube_node_status_capacity{resource="memory"} - kube_node_status_allocatable{resource="memory"})) * 0.95) for: 15m labels: severity: warning
- 左侧计算项:按节点维度聚合
/system.slicecgroup下所有进程的RSS常驻内存总和,统计的是节点上由systemd直接管理的系统级服务(比如sshd、systemd-journald、节点级监控代理、K8s静态组件等非Pod管辖进程)占用的物理内存,完全不包含业务Pod的内存占用 - 右侧阈值项:先按节点维度计算节点总内存容量(
kube_node_status_capacity)和K8s可调度给Pod的内存量(kube_node_status_allocatable)的差值,这个差值就是节点给非Pod进程预留的总内存额度,再取这个额度的95%作为告警触发线 - 触发要求:上述左侧值连续15分钟高于右侧阈值,就触发warning级别的告警
异常触发原因
你提到的两个现象不冲突,核心是统计口径和指标采集的问题:
- 你查到的「节点内存限制使用率超过131%」和这个告警的统计范围完全不一致:这个使用率一般是节点总内存维度、包含所有Pod进程的占用统计,而告警只看system.slice下的系统服务内存,所以你查不到系统服务侧的内存突增是正常情况,业务Pod的内存涨跌本来就不会被这个规则统计
- 告警内容里节点位置为空(提示
System memory usage of 1.161G on exceeds,on后面没有节点名),是典型的指标标签不匹配问题:- 计算阈值用到的
kube_node_status_capacity、kube_node_status_allocatable指标(来自kube-state-metrics)的node标签值,和container_memory_rss指标(来自cadvisor)的node标签值不一致,比如一边是纯节点名node-01,一边带域名后缀node-01.cluster.local,会导致按node聚合做差的时候,算出来的预留内存值异常偏小。比如实际预留是2G,标签错配后算出来只有1.2G,那1.161G的系统服务占用自然会触发阈值 - 也有可能是指标采集断流、重启导致某段时间上报的allocatable内存值异常偏高,让「总容量-可调度量」的预留值计算结果偏小,误触发告警
- 计算阈值用到的
- 如果排除标签问题,还有一种常见情况:节点启动时配置的
system-reserved系统预留内存参数设的过小,比如32G内存的节点只给系统服务留了1.2G额度,那系统服务日常稳态运行的内存占用就会摸到95%的阈值,不需要内存突增也会持续触发告警
内容的提问来源于stack exchange,提问作者Himanshu Gude
相关产品推荐
相关产品推荐

