美文网首页
cgroup内存泄露问题

cgroup内存泄露问题

作者: 一舍 | 来源:发表于2020-03-17 10:30 被阅读0次

软硬件环境

  • 硬件环境:ARM64
  • 软件环境
version
kernel 4.4.58-20171215.kylin.server.YUN+-generic
docker 17.03.2-ce-rc1
runc version 1.0.0-rc10+dev
kubernetes 1.14.1

问题现象

问题首先出现是操作系统出现了只读,经过排查系统日志,发现了以下关键词:

SLUB: Unable to allocate memory on node -1
No space left on device

以上现象,据查是由于cgroup内存泄露引起的。

问题分析

什么是cgroup内存泄露呢,这要从内核的kernel memory accounting机制说起。

为了防止出现“fork bomb”,社区中就有人提议通过linux内核限制cgroup中的kmem容量使用,从而限制恶意进程的行为。于是就有了kernel memory accounting机制。

kernel memory accounting机制为cgroup的内存限制增加了stack pages(例如新进程创建)、 slab pages(SLAB/SLUB分配器使用的内存)、sockets memory pressure、tcp memory pressure等。

有人会说,既然kernel memory accounting机制是为了限制cgroup中的kmem容量使用,那为什么还会出现内存无法分配的问题呢,一句话总结,就是当前的内核版本对kernel memory accounting机制的支持存在BUG。

解决方案

  1. 重新编译runc,关闭kmem,替换原先的runc。编译方法如下(可参照https://github.com/opencontainers/runc#build-tags):
go get github.com/opencontainers/runc
cd $GOPATH/src/github.com/opencontainers/runc
make BUILDTAGS='nokmem'
  1. 重新编译kubelet,关闭kmem,替换原先的kubelet。编译方法如下:
git clone https://github.com/kubernetes/kubernetes
cd kubernetes
git checkout v1.14.1
make kubelet GOFLAGS="-tags=nokmem"
  1. 重启机器
  2. 验证禁用是否生效,方法和正确结果如下:
cat /sys/fs/cgroup/memory/kubepods/burstable/pod<pod-id>/<containerID>/memory.kmem.slabinfo
slabinfo - version: 2.1
# name            <active_objs> <num_objs> <objsize> <objperslab> <pagesperslab> : tunables <limit> <batchcount> <sharedfactor> : slabdata <active_slabs> <num_slabs> <sharedavail>
cat /sys/fs/cgroup/memory/kubepods/burstable/pod<podid>/<containerID>/memory.kmem.usage_in_bytes
0

参考资料:

  1. https://github.com/kubernetes/kubernetes/issues/61937
  2. https://tencentcloudcontainerteam.github.io/2018/12/29/cgroup-leaking/
  3. https://github.com/opencontainers/runc
  4. http://www.iceyao.com.cn/2020/01/04/%E8%AE%B0%E4%B8%80%E6%AC%A1k8s-cgroup%E5%86%85%E5%AD%98%E6%B3%84%E9%9C%B2%E9%97%AE%E9%A2%98%E8%A7%A3%E5%86%B3/

相关文章

  • cgroup内存泄露问题

    软硬件环境 硬件环境:ARM64 软件环境 versionkernel4.4.58-20171215.kylin....

  • cgroup 内存泄露问题排查记录

    cgroup 内存泄露造成高内存使用率 配置 出现内存泄漏的主机为集群机器,运行时间约5天,内存使用超90%,其上...

  • Android 内存优化总结&实践

    内存泄露 大部分的内存问题都是内存泄露导致的,Android里也有一些很常见的内存泄露问题这里简单罗列下: 详细见...

  • Java弱引用学习 WeakHashMap、ReferenceQ

    上一篇文章 Java内存泄露学习 ThreadLocal真的会内存泄露吗 提到ThreadLocal内存泄露的问题...

  • cgroup限制内存

    cgroup限制内存的脚本(cgroup_mem.sh)如下: 执行方式: sudo sh cgroup_mem....

  • 关于华为inputMethodManager内存泄露

    一个关于内存泄露的问题,相信使用华为手机检测内存泄露的时候都会发现inputMethodManager内存泄露这个...

  • 内存泄露总结

    内存泄露会产生的问题: 1:内存泄露造成的第一个问题是异常,包括内存分配失败,OOM。 2:内存泄露造成的第二个问...

  • kubernetes cgroup泄露问题,no space l

    当集群运行一段时间以后发现无法创建pod报下面的错误 没有通过创建pod方式在其他的机器上复现,保留了出问题的那台...

  • 内存泄露问题

    在使用系统的CF或者CA开头的类,一定要注意,自己管理内存,要不容易内存泄露 值得一提的是,今天遇到了一个比较特别...

  • 内存泄露系列文章(一) - 内存泄露原因及影响

    前言 内存泄露系列文章内存泄露系列文章(一) - 内存泄露原因及影响内存泄露系列文章(二) - 内存泄露监测及分析...

网友评论

      本文标题:cgroup内存泄露问题

      本文链接:https://www.haomeiwen.com/subject/txvzehtx.html