昇腾社区首页
中文
注册

使用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)起不到限制作用,推荐设置为:昇腾AI处理器的个数*500*1024*1024 Byte。
  • 内存限额的设置方法如下:

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

内存限额设置代码示例:

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

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