使用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开启。