cgroup v1 内存管理
Kernel Memory Extension (CONFIG_MEMCG_KMEM)
通过内核内存扩展(Kernel Memory Extension),内存控制器(Memory Controller)能够限制系统使用的内核内存量。内核内存基本上不同于用户内存,因为它不能 swap out
(换出),所以DoS攻击可能会针对消耗这种宝贵的资源来进行系统攻击。
默认情况下,所有内存 cgroup
都启用内核内存记账,但是可以通过 cgroup.memory=nokmem
内核参数来在系统范围内 禁用
内核内存记账 。
备注
Red Hat 7所使用 3.10.0-1160.88.1.el7
存在 SLAB leak,会一定概率导致 内存分配错误无法创建容器异常排查 。目前(2023年4月)Red Hat尚未发布修复补丁(也可能因为RHEL 7终止支持而不修复),所以建议升级到 RHEL 8.1(内核已修复),或者在不升级内核的系统中 禁用
内核内存记账 来绕过这个问题。
根cgroup没有强制内核内存限制,所以根使用的 cgroup
可能记入页可能不记入,使用的内存累积到 memory.kmem.usage_in_bytes
。目前没有对内核内存实施软限制,未来可能会达到限制时触发slab回收。
当前记账的内核内存资源
stack pages
: 每个进程都消耗一些stack pages,记入内核内存可以防止内核运行时创建新内存使用率过高slab pages
: 跟踪由 SLAB 或 SLUB 分配器分配的页面。在memcg
内部,每次第一次访问缓存都会创建每个kmem_cache
副本,创建是延迟完成的,所以一些对象仍可以在创建缓存时跳过,slab页面的所有对象都应该属于同一个memcg
,仅在缓存页面分配期间迁移到不同的memcg
会出现保留失败sockets memory pressure
: sockets协议有内存压力阈值tcp memory pressure
: tcp 协议的套接字内存压力