作为linux内核级别的资源限制设置,cgroup在近些年特别是容器技术越发火爆的现在,也越来越多的被重新提及。作为cgroup本身来说,它完全可以被用来限制基于任何用户或者是任何应用程序的资源限制。
首先,假设有这样一个应用场景:我和某位仁兄共享某台4core+4G+Ubuntu1404主机做开发机,这位仁兄不太将公德,一直用这台机器从事挖矿等大规模计算活动,严重影响到了我的日常应用。于是鉴于他出了1/4的钱的份上,我决定只能让他的账户使用4core中的一个,以及1G内存,同时尽可能的限制他的挖矿进程。
既然说到Ubuntu,要吐槽的是,它对于cgroup的默认支持真心不完善,非但不能学习Redhat系简单粗暴的默认支持开启,甚至连cgroup的支持也分为几个包来实现,有点让人摸不着头脑的意思。
首先是把依赖包安装好,老一套的apt-get
~#apt-get update...
~# apt-get install cgroup-bin
cgroup-bin会连带安装的依赖包中有个叫cgroup-lite包。从字面上来说,它只提供了最基础的cgroup功能,并不能直接提供基于用户,或者应用的自动cgroup分组。如果您只需要基础的cgroup功能的话cgroup-lite就够了。
然后就是准备cgroup的配置,即预先配置好几个cgroup组,用来标记资源配额。这里,我们沿用Redhat系的规则,vi /etc/cgconfig.conf
group my_2b_mate{ # cgroup 的名称cpuset { # 资源类型,cpuset
cpuset.cpus = 0-1; # 只能使用cpu 0 - 1
cpuset.mems = 0; #详见:http://www.litrin.net/2016/05/18/cgroup%E7%9A%84cpuset%E9%97%AE%E9%A2%98/
}
}
group his_2b_app{
cpu { #类型是cpu,和cpuset可不是一回事儿
cpu.shares = 1; #调度公平度,默认是1024,越小优先级越低
}
}
然后就是把这个cgroup的配置启用
~# cgconfigparser -l /etc/cgconfig.conf~# ls /sys/fs/cgroup/cpu
..... his_2b_app
~# ls /sys/fs/cgroup/cpuset
...... my_2b_mate
然后就是将用户/应用和cgroup绑定,vi/etc/cgrules.conf
friend cpuset my_2b_mate#这里有3个项目,分别是用户名、控制器类型和cgroup名称
friend:wakuang cpu his_2b_app
#我们将会对用户friend的wakuang进程启用cpu:his_2b_app规则
将它启用起来:
~# cgrulesengd这条命令事实上是一个服务,它会自动监控符合规则的进程,然后将这些进程配置到对应的cgroup策略中从而达到限制资源的目的。
话说这个cgroup-bin自带了一个example文件夹,它位于/usr/share/doc/cgroup-bin/examples目录下,其中有一个cgred明显就是一个service的启动命令,谁知我试着启动它的时候缺发觉这脚本根本就无法使用。好在这几个命令真心的不复杂,我强忍着吐槽的心情,决定自己在cgroup-lite的启动脚本添加对应的启动命令。
vi /etc/init/cgroup-lite.conf
description "mount available cgroup filesystems"author "Serge Hallyn <serge.hallyn@canonical.com>"
start on mounted MOUNTPOINT=/sys/fs/cgroup
pre-start script
test -x /bin/cgroups-mount || { stop; exit 0; }
test -d /sys/fs/cgroup || { stop; exit 0; }
/bin/cgroups-mount
####New added
cgconfigparser -l /etc/cgconfig.conf
cgrulesengd
####end
end script
post-stop script
if [ -x /bin/cgroups-umount ]
then
/bin/cgroups-umount
fi
end script
这样,我们就可以简单的通过service cgroup-lite start/stop来自动的载入对应的cgroup配置和配额规则了。
笑话说完,其实对于现实中的很多应用场景其实或多或少的都会有存在进程之间系统资源抢占的问题,例如LNMP的经典组合,mysql,php-fpm,Nginx混布的同时MySQL很容易和php-fpm争抢内存;很容易和nginx争抢IO。通过限制进程对的资源的访问优先权可以很容易的达到人为干预调度的功能。
好吧,我承认,在redhat/centos上只要在/etc/cgconfig.conf和/etc/cgrules.conf里修改对应的配置就可以了,省却了很多麻烦,这一点Ubuntu和Redhat还是有些差距的。