cgroup

在生产环境中,运行在服务器中的程序如果对系统资源(CPU、内存等)过量使用,可能导致服务器Hang住,影响其他程序的正常运行。为了应对此类问题,有必要限制程序所能使用的系统资源。要实现这一目的,需借助Linux系统的cgroup机制。
可以使用四种方式操作cgroup:

  • 直接操作cgroup文件系统(/sys/fs/cgroup)
  • 使用cgm客户端(含在cgmanager)
  • 通过cgcreate、cgexec、cgclassify(通过安装包cgroup-tools)
  • 通过文件cgconfig.conf和cgrules.conf(通过安装包cgroup-tools)

这里通过第四种方式来操作cgroup。
将cgroup定义在文件cgconfig.conf中

group cg1 {
      cpuset {
          cpuset.cpus = "1,2";
       }
       memory {
         memory.limit_in_bytes = 1000000000;
       }
}

group cg2 {
      cpuset {
          cpuset.cpus = "3,4";
       }
      memory {
           memory.limit_in_bytes = 1000000000;
       }
}

这里使用了两个controller,cpuset和memory,cg1里面的进程仅能使用cpu1和cpu2,使用的内存不能超过1G,cg2类似。接着定义cgrules.conf文件,这个文件的作用是将选定进程和cgroup绑定。

*:emacs         cpuset,memory      cg1
*:conkeror      cpuset,memory      cg1
*:firefox       cpuset,memory      cg2
*:slack         cpuset,memory      cg2

文件的含义可以运行命令man cgrules.conf查看详细解释
使用下面命令使规则生效

cgconfigparser -l /etc/cgconfig.conf
cgrulesengd

查看配置是否生效,

cat /proc/$(pidof emacs)/cgroup | grep cg1
7:cpuset:/cg1
10:memory:/cg1

冒号将输出内容分为三个部分,从左往右
1,层级的唯一ID号,这个号码和/proc/cgroups里面的内容是对应的
2,绑定到这个层级的controller,多个controller可以使用逗号分隔
3,cgroup的路径,这个路径是相对/sys/fs/cgroup/controller的
注意
删除cgroup,执行命令cgdelete删除,语法如下:
cgdelete subsystems:path
path是相对路径

参考:
https://manpages.debian.org/stretch/manpages/cgroups.7.en.html
https://wiki.archlinux.org/index.php/cgroups
https://github.com/jooyong-park/workspace/wiki/cgroups-on-debian-ubuntu

你可能感兴趣的:(cgroup)