如何限制进程使用的内存

  • 创建一个mpiggroup(名字随意),并设置内存限制(例如50GB)

cgcreate -g memory,cpu:mpigroup
cgset -r memory.limit_in_bytes=$((50*1024*1024*1024)) mpigroup
  • 如果进程在运行,则将这个运行进行加入到cgroup

cgclassify -g memory,cpu:mpicgroup $(pidof mpiexec)
  • 如果是启动进程,则使用cgexec

cgexec -g memory,cpu:mpigroup mpiexec COMMAND

cgexec 有一个 --sticky 参数:如果使用--sticky,则cgred服务(是cgrulesengd进程)就不会更改执行命令进程和它的子进程。这样不仅启动的命令会按照cgexec指定的cgroup运行,这个命令启动的子命令也会继承cgexec指定的cgroup。这样即使和cgrules.conf配置冲突(cgred服务使用的配置)也不影响。

否则,虽然cgexec启动的命令可以指定cgroup,但是命令启动的子进程就会收到cgrules.conf配置的限制,而不是启动时候cgexec指定的cgroup。

参考 man cgexec

同样,cgclassify也是有一个--sticky,使用方法相同,即使用--sticky时,可以避免cgrules.conf影响作用于进程和子进程。

注意

cgclassifycgset也可以不实用任何参数,即不使用-g memory,cpu:mpicgroup,此时是cgred服务会作用于进程,按照cgrules.conf配置来调整进程,所以也是非常方便的。

参考

Last updated