
k8s Memory cgroup out of memory Kill process
终于在kubepod上发现了异常 dmesg | grep -i memory 内核日志:Memory cgroup out of memory kill process pid 问题已经清晰了,这是一个典型的cgroup memory导致的内存泄漏问题 cgroup memory内存泄漏 k8s集群随着pod增多,运行久了之后就会出现不能创建pod的情况。执行kubectl describe pod命令可以发现 cannot allocate memory异常。重启对应的服务器之后异常提示才会消失。但继续随着运行时间推移,该问题依然会出现,最终 内存会耗尽,系统会强杀节点释放内存。 使用cat /sys/fs/cgroup/memory/kubepods/memory.kmem.slabinfo检查问题node,如下图则说明没有存在内存泄 漏 如下图显示则说明存在内存泄漏 kmem导致的内存泄露 内核对每个cgroup 子系统的的内存地址页是有限制的,限制的大小定义在 kernel/cgroup.c #L139上。在 cgroup 创建一 个内存地址之后,当开启了 kmem 功能,虽然 cgroup 的地址页删除了,但是内存不会回收。也就是说在3.1内核版本 下,开启了 kmem 功能就会导致内存泄漏。该问题会导致可分配内存越来越少,直到无法创建新 pod 或节点宕机 注:该内存泄漏问题在3.10 的内核上存在,4.x的内核已经修复 解决方案 1:内核参数文件 /boot/grub2/grub.cfg中添加cgroup.memory=nokmem让系统禁用 cgroup的 kmem
2:内核参数文件 /boog/grub2/grub.cfg 中添加cgroup_disable=memory 关掉整个cgroup memory debian修改grub启动参数
vim /etc/default/grub
GRUB_CMDLINE_LINUX=“cgroup_enable=memory” 3:升级内核版本到4.x 5、优化结果 直接关掉了cgroup memory。重启系统之后集群运行正常,之后没有再出现内存泄漏


