昇腾社区首页
中文
注册

使用Memory Cgroup机制实现业务内存资源控制

简介

昇腾AI软件栈提供了基于Cgroup(Control Groups)机制的内存限制功能,当业务进程的Cgroup达到特定的内存限额后(内存限额设置方法请参见内存限额设置),内核会尝试回收内存。

如果内存回收失败,业务进程会被挂起,后续有内存后再被唤醒,从而避免内存溢出(用户也可以参见内存不足时应用退出设置,实现内存回收失败时应用程序直接退出)。

添加业务进程到Cgroup

开放形态下,用户需要自行在Device侧将业务应用进程添加到业务进程的cgroup中,添加方法如下:

root用户执行如下命令:

echo ServicePID > /sys/fs/cgroup/memory/usermemory/cgroup.procs

ServicePID:业务应用程序的进程ID。

内存限额设置

  • 内存限额的计算方法如下:
    limit = FreeMem - FreeCma - 预留大小
    • FreeMem:空闲内存,可通过“cat /proc/meminfo”命令获取“MemFree”的值,并将其单位转换为字节,即:MemFree*1024。
    • FreeCma:空闲的连续内存,可通过“cat /proc/meminfo”命令获取“CmaFree”的值,并将其单位转换为字节,即:CmaFree * 1024。
    • 预留大小:预留给不在user memory Cgroup中的服务进程使用,若设置太小可能会导致内存限额(limit)起不到限制作用,推荐设置为:200*1024*1024 Byte~300*1024*1024 Byte。
  • 内存限额的设置方法如下:

    echo limit > /sys/fs/cgroup/memory/usermemory/memory.limit_in_bytes

内存限额设置代码示例:

local free_mem=`cat /proc/meminfo  | grep "MemFree" | awk '{print $2}'`
local free_cma=`cat /proc/meminfo | grep "CmaFree" | awk '{print $2}'`

echo $((free_mem * 1024 - free_cma * 1024 - 300 * 1024 * 1024)) > /sys/fs/cgroup/memory/usermemory/memory.limit_in_bytes

内存不足时应用退出设置

当业务进程的Cgroup达到特定的内存限额后,内核会尝试回收内存,如果内存回收失败,业务进程会被挂起。若用户不想一直等待,可执行如下操作,实现内存不足时应用程序自动退出。

  1. 开启操作系统OOM Killer机制。

    登录Device,以root用户执行如下命令启用enable_oom_killer,1表示启用,0表示禁用。

    echo 1 > /proc/sys/vm/enable_oom_killer
  2. 开启memory cgroup的OOM控制机制。

    登录Device,以root用户执行如下命令启用memory cgroup的OOM机制,0表示“oom kill enable”,1表示“oom kill disable”。

    echo 0 >  /sys/fs/cgroup/memory/usermemory/memory.oom_control

    memory Cgroup的kill enable功能生效的前提是系统enable_oom_killer开启。