利用CGROUP对资源进行限制

Linux系统 0 800 佚名 收藏

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居然发现不存在这个设置了,不知道为何。 


相关推荐:

网友留言:

您需要 登录账户 后才能发表评论

我要评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。
验证码