cgroup是一个在Linux上实现资源限制的东西,可以防止某个用户将内存和cpu等资源全部用光,从而实现资源的隔离。RHEL6默认就带有cgroup相关支持和软件包。下面这篇文章是我2013年的时候写的,合并了一下。我直到还有很多朋友依然在使用RHEL5,所以特别发出来,让大家也能在RHEL5上使用cgroup来对资源进行控制,避免用户的应用,内存溢出,最后服务器挂死,或者某个用户把cpu用光,其他用户完全无法使用。
cgroup在RHEL5上实现
cgroup是 什么东西呢。。看百度百科:
Cgroups是control groups的缩写,是Linux内核提供的一种可以限制、记录、隔离进程组(process groups)所使用的物理资源(如:cpu,memory,IO等等)的机制。最初由google的工程师提出,后来被整合进Linux内核。Cgroups也是LXC为实现虚拟化所使用的资源管理手段,可以说没有cgroups就没有LXC。
cgroup在RHEL5上默认是不可以实现的,这个是给RHEL6准备的。主要包括两部分:1. kernel要支持,这个基本要求2.6.24以后才可以,RHEL5是2.6.18,当然不可以。 2.libcgroup程序,这个好解决,可以自己编译或者找rpm包。
关键第一个,kernel,我是找到一个淘宝的kernel修改实现,将RHEL6的kernel移植到了RHEL5上,从而实现了kernel升级。当然你自己升级也可以,但是会遇到很多麻烦。
另外也可以用Oracle的ULK2的kernel。
http://kernel.taobao.org/index.php/Documents/Kernel_build ; 淘宝kernel部分。
升级之后,我写了一个简单的shell程序,将系统上所有用户都create一个group,然后限制内存使用20G。然后实现开机自动启动cgconfig和cgred即可。
以后再也不担心某个用户将系统内存用光,导致系统OOM的情况发生了。
举例:
vi /etc/cgocnfig.conf
mount { cpuset = /cgroup/cpuset; cpu = /cgroup/cpu; ..... memory = /cgroup/memory; } group limitcpu { cpu { cpu.shares=200; } }group limitmem { memory { memory.limit_in_bytes = 50G; memory.memsw.limit_in_bytes = 50G; } }
3. /etc/cgrules.conf
@allstaff cpu limitcpu/ % memory limitmem/
cpu.shares其实设置的是一个权重
最大可以设置为1024,但是,我发现,即使你设置1,如果只是一个人在用,依然是100%的cpu。但是如果另外一个人设置的是2,他和你同时使用的时候,人家就比你占用cpu的时间多一倍。。。要是这个时候,人家设置的是1024,你就悲剧了。。。你只有等别人跑完,因为你只有人家可怜的1/1024。
其实这样设计蛮好,可以最大化利用cpu,同时给高优先级的人更多的cpu时间。
---------------------
cgroups 里,可以用 cpu.cfs_period_us 和 cpu.cfs_quota_us 来限制该组中的所有进程在单位时间里可以使用的 cpu 时间。这里的 cfs 是完全公平调度器的缩写。cpu.cfs_period_us 就是时间周期,默认为 100000,即百毫秒。cpu.cfs_quota_us 就是在这期间内可使用的 cpu 时间,默认 -1,即无限制。
将 cpu.cfs_quota_us 设为 50000,相对于 cpu.cfs_period_us 的 100000 即 50%
不过,这个在RHEL6的kernel 2.6.32中存在的东西,我用了Oracle的UEK2 2.6.39居然发现不存在这个设置了,不知道为何。
网友留言: