文/刘馨蔚,系统运维 SIG Contributor
小 A 准备下班时,突然收到云上专门对接客户前线同事的电话。“小 A,小 A,一个我们游戏的大客户的集群出了问题,影响了业务,需要紧急排查一下”,小 A 也听出了紧急,放下包叹了口气,心想“刚和老婆说回去吃饭呢,看来赶不上咯”。小 A 立马回到办公桌向前线同事了解详细情况,原来这个大客户云上 pod 内业务突然不可用,检查后发现有 OOM Killed 的报警,但是发现 pod 的使用内存并没有到阈值 limit 的 8G,请求排查 OOM 的原因并希望给出相关建议避免同样情况再次发生。
小 A 详细了解情况后,定位到是和 OOM 相关的问题。这时小 A 突然想到了团队内开发了针对 OOM 的诊断分析的功能,再向同事确认客户也安装了 SysOM 后建议客户立马进行 SysOM 中的 OOM 诊断。根据 OOM 诊断后诊断出了如下结果:
图中可以看出发生了两次 OOM,并且怀疑有内存泄漏,内核占用了近 5G 的内存,将这个结果和前线同事对齐后,结合客户的系统日志“TCP out of memory.”等字样,排查出问题的原因是业务接收数据不及时,导致数据驻留在内核中。此时建议客户优化业务程序,及时处理接收队列中的数据报文,并通过重启业务止血。
前线的同事纷纷点赞小 A 的排查速度和 SysOM 中诊断功能的省时省力,还让小 A 赶紧介绍一下 SysOM 的这个 OOM 诊断。小 A 也对这个工具也十分熟悉,就和前线的同事好好介绍了介绍:
OOM(Out of memory) 是日常或生产环境中比较容易碰到的异常,当 OOM 发生时一般伴随着在内核日志中打印相关异常信息和某个进程被 Kill 掉的现象:
test invoked oom-killer: gfp_mask=0x6280ca(GFP_HIGHUSER_MOVABLE|__GFP_ZERO), nodemask=(null), order=0, oom_score_adj=0
OOM 发生在 Linux 在整机或 cgroup 剩余内存低于水线时,如果通过内存回收、规整等方式都无法满足内存分配操作,便会触发 OOM killer 流程来强行释放进程内存,如下图所示:
有一部分小伙伴觉得 OOM 根本不算什么异常,甚至如果不看日志的话根本没有感知到;但是有一部分小伙伴却深受 OOM 的“迫害”,因为 OOM 可能会导致关键业务中断,甚至系统无法正常运行等现象。SysOM 的 OOM 诊断可以检测 8 类 OOM 的问题,具体如下图所示:
当发生了 OOM 的问题时,可以通过 SysOM 的 OOM 检测来对系统的 OOM 提供快速检测、分析和提供修复建议。
例如整机内存低于水线时,通过 SysOM 的 OOM 诊断可以得到如下界面:
SysOM 检测页面给出了 OOM 当时的内存情况、发生原因和使用内存 TOP 10 的内存使用排名,结果表明这是属于 host 内存 limit 造成的 OOM。这种情况下我们可以:
1、先评估使用内存多的业务进程内存占用是否合理,必要时优化业务进程内存申请量。
2、还排查进程 oom_score_adj 设置是否合理,不合理的 oom_score_adj 值会导致进程占用大量内存而不被 kill 掉。
例如 cgroup 发生 OOM 时,通过 OOM 诊断可以得到如下界面:
可以看到是由于进程 test 所在的 cgroup mm_test 发生 OOM,原因为 cgroup 内存usage 达到 limit 值(90M)。这种情况下我们能够比较快速直接的判断出是 cgroup 内存 usage 达到了上限,我们可以调整使用情况或者 cgroup 的内存可用上限。除了使用达到 limit,oomcheck 还有检测 shmem 泄漏导致的 OOM。
总的来说,OOM 主要可以分为整机和 cgroup 级别的异常,SysOM 中的 OOM 诊断可以快速准确的定位到系统发生的 OOM 异常,从而用户可以根据不同的原因应用不同的方法解决 OOM。
小 A 向前线同事介绍完后,大家都表示以后的问题排查、诊断效率肯定有很大的提升。和同事、客户都交接好后,小 A 感叹着 SysOM 对系统、内核的各种诊断能力的健全,省时省力,快速定位到异常问题的同时也能够指引下一步解决方案。哼着小曲儿回家后,小 A 发现老婆热的汤还是暖呼呼的呢。
龙蜥大讲堂 SysOM 2.0 系列直播《SysOM 2.0 内存相关功能介绍》中讲解了内存诊断中心功能的基本使用和应用场景,展示了三个内存诊断的使用参数和结果分析,也在官网上进行了实时演示。视频回放及 PPT 课件获取见下:
【PPT 课件获取】:关注微信公众号(OpenAnolis),回复“龙蜥课件” 即可获取。有任何疑问请随时咨询龙蜥助手—小龙(微信:openanolis_assis)。
【视频回放】:视频回放可前往龙蜥官网查看。
—— 完 ——
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。