Prometheus触发HostOutOfMemory告警推送Slack频道相关问题咨询
HostOutOfMemory告警排查与处理方案
对应告警规则
alert: HostOutOfMemory expr: node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes * 100 < 10 for: 2m labels: severity: critical annotations: summary: Host only has 10% memory left (instance {{ $labels.instance }}). Pod eviction will be triggered.
规则含义:当主机可用内存占总内存的比值低于10%且状态持续2分钟时,将触发严重级别告警,提示对应实例主机仅剩余10%可用内存,即将触发Pod驱逐。
排查步骤
- 登录告警对应的实例节点,执行
free -h、top(运行后按shift+m按内存占用排序)或htop命令,确认节点当前真实内存使用率,排除Prometheus指标采集异常导致的误告警 - 确认内存使用率确实达到告警阈值后,执行
kubectl top node <目标节点名>、kubectl get pods -A --field-selector spec.nodeName=<目标节点名>命令,查看节点上运行的所有Pod内存占用情况,定位内存占用最高的前几个负载 - 检查高内存占用Pod是否存在内存泄漏:执行
kubectl logs <Pod名称> -n <对应命名空间>查看Pod运行日志,同时查看该Pod近7天的内存监控曲线,判断是流量突增导致的合理内存占用,还是程序BUG导致内存持续上涨不释放 - 检查节点是否存在非K8s管理的异常进程占用内存:执行
ps aux --sort=-%mem查看系统全量进程,排查僵尸进程、恶意进程、或运维手动启动未纳入资源管控的程序 - 检查节点OOM日志:执行
dmesg | grep -i oom,确认近期是否已有进程被系统OOM Killer主动杀掉,评估当前业务受影响程度
处理方案
- 误告警场景:检查Prometheus node-exporter组件是否运行正常,修复指标采集异常后手动解除告警即可
- 临时流量突增场景:优先对高内存占用的业务Pod进行水平扩容,将流量分散到多个节点;如果集群资源充足,也可直接对节点进行内存规格垂直扩容
- 程序内存泄漏场景:先对异常Pod执行滚动重启临时缓解内存压力,同步告知业务开发团队定位内存泄漏代码问题,发布修复版本后彻底解决
- 异常进程占用场景:非必要进程直接终止,需要保留的进程要补充资源限制,纳入K8s workload管理避免无限制占用节点资源
- 长期优化:给所有业务Pod配置合理的
resources.limits.memory资源限制,避免单Pod异常占满整个节点内存;调整K8s节点Pod驱逐阈值,优先级较低的Pod优先被驱逐,保障核心业务运行稳定
内容的提问来源于stack exchange,提问作者MANU N
相关产品推荐
相关产品推荐

