-
背景信息 现有操作系统中,支持配置离线业务和在线业务。当内存发生OOM时,会优先选择离线业务控制组中的消耗内存最多的进程,结束进程回收内存,但是对于某些离线业务也有核心业务,因此会造成很大的影响。 针对这个问题,HCE调整了OOM时回收内存的策略,增加了配置cgroup优先级的功能。 内存紧张情况下内核会遍历cgroup,对低优先级的cgroup结束进程,并回收内存,使离线业务中重要的业务可以存活下来。
-
memcg OOM优先级接口功能说明 表1 接口功能说明 接口 说明 取值 memcg_qos_enable memcg OOM优先级策略开关。 0:不开启优先级配置。当OOM时,按照系统原有的OOM操作结束进程,结束内存消耗最大的进程,回收内存。 1:开启优先级配置并以cgroup为粒度。当OOM时,结束优先级低的cgroup所有进程,并回收内存。 2:开启优先级配置并以单个进程个为粒度。当OOM时,结束优先级低的cgroup中的最大的一个进程,并回收内存。 整数形式,取值范围为0~2,默认值为0。 memory.qos_level 配置cgroup组优先级。值越小cgroup组优先级越低。 当memcg OOM时,会以当前cgroup组为父节点,查找子节点优先级最低的cgroup组中内存使用最大的进程,结束该进程,回收内存。 当OOM时,对于优先级相等的cgroup组,会根据组的内存使用量进行二次排序,选择内存使用最大的进行OOM操作。 说明: 使用memory.qos_level的前提条件为memcg_qos_enable取值须为1或2。 新创建的cgroup组的memory.qos_level值默认会继承父节点的memory.qos_level的值,但是子节点的优先级不受父节点的限制。 如果修改cgroup组父节点的优先级,子节点的优先级会自动调整,和父节点保持一致。 整数形式,取值范围为-1024~1023,默认值为0。
-
约束限制 程序未按照2MB对齐编译时,每段中不足2MB的部分无法使用大页,建议对齐使用。 mprotect系统调用要求传入的地址按2M对齐、大小为2M的倍数,程序代码需要进行适配修改。 2MB地址对齐需要重新编译程序,并在链接器选项中加入"-Wl,-zcommon-page-size=2097152 -Wl,-zmax-page-size=2097152" 大页预留不足时会尝试申请2MB页,如果由于内存碎片等原因申请失败时,程序会回退至小页。程序中多个线程进入回退小页流程会触发SIGBUS。