在生产环境中,运行在服务器中的程序如果对系统资源(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
网友评论