使用Memory Cgroup机制实现业务内存资源控制
简介
昇腾AI软件栈提供了基于Cgroup(Control Groups)机制的内存限制功能,当业务进程的Cgroup达到特定的内存限额后(内存限额设置方法请参见内存限额设置),内核会尝试回收内存。
如果内存回收失败,业务进程会被挂起,后续有内存后再被唤醒,从而避免内存溢出(用户也可以参见内存不足时应用退出设置,实现内存回收失败时应用程序直接退出)。
添加业务进程到Cgroup
开放形态下,用户需要自行在Device侧将业务应用进程添加到业务进程的cgroup中,添加方法如下:
以root用户执行如下命令:
echo ServicePID > /sys/fs/cgroup/memory/usermemory/cgroup.procs
ServicePID:业务应用程序的进程ID。
内存限额设置
内存限额设置代码示例:
free_mem=0
MaxCpuID=`cat /proc/cpuinfo | grep "processor" | tail -1 | tr -cd "[0-9]"`
free_cma=`cat /proc/meminfo | grep "CmaFree" | awk '{print $2}'`
case ${MaxCpuID} in
15)
free_mem=$((free_mem + `cat /sys/devices/system/node/node1/meminfo | grep "Node 1 MemFree" | awk '{print $4}'`))
;&
7)
free_mem=$((free_mem + `cat /sys/devices/system/node/node0/meminfo | grep "Node 0 MemFree" | awk '{print $4}'`))
;;
*)
echo "modify usermem limit failed"
return 0
;;
esac
ddr_node_num=$((MaxCpuID/8+1))
mem_limit=$((free_mem * 1024 - ddr_node_num * 500 * 1024 * 1024 - free_cma * 1024))
echo $((mem_limit)) > /sys/fs/cgroup/memory/usermemory/memory.limit_in_bytes
echo $((mem_limit / 2)) > /sys/fs/cgroup/memory/usermemory/cust_aicpu/memory.limit_in_bytes
内存不足时应用退出设置
当业务进程的Cgroup达到特定的内存限额后,内核会尝试回收内存,如果内存回收失败,业务进程会被挂起。若用户不想一直等待,可执行如下操作,实现内存不足时应用程序自动退出。
- 开启操作系统OOM Killer机制。
登录Device,以root用户执行如下命令启用enable_oom_killer,1表示启用,0表示禁用。
echo 1 > /proc/sys/vm/enable_oom_killer
- 开启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开启。