cgroup的使用

1、cgroup的安装:
在安装系统的时候,默认已经安装了libcgroup软件包,如果没有安装可以使用以下命令进行安装:
[root@susir /]# rpm -q libcgroup
libcgroup-0.36.1-6.el6.x86_64
如果没有安装请用YUM安装。
2、cgroup服务的控制:
将其更改为伴随系统的启动而启动:
[root@susir /]# chkconfig --list cgconfig
cgconfig               0:off        1:off        2:off        3:off        4:off        5:off        6:off
[root@susir /]# chkconfig cgconfig on
[root@susir /]# chkconfig --list cgconfig
cgconfig               0:off        1:off        2:on        3:on        4:on        5:on        6:off
服务的停止和启动
[root@susir cgroup]# /etc/init.d/cgconfig stop/start
3、cgroup的配置文件cgconfig.conf文件介绍:
在cgconfig.conf文件中,主要包含了两个主要类型:mount和group。mount是指创建以及挂载哪些层次为虚拟文件系统,并附上子系统的层次结构。cgconfig.conf文件的内容如下所示:
[root@susir /]# cat /etc/cgconfig.conf  | more
#
#  Copyright IBM Corporation. 2007
#
#  Authors:        Balbir Singh < balbir@linux.vnet.ibm.com >
#  This program is free software; you can redistribute it and/or modify it
#  under the terms of version 2.1 of the GNU Lesser General Public License
#  as published by the Free Software Foundation.
#
#  This program is distributed in the hope that it would be useful, but
#  WITHOUT ANY WARRANTY; without even the implied warranty of
#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
#
# See man cgconfig.conf for further details.
#
# By default, mount all controllers to /cgroup/<controller>

mount {
        cpuset        = /cgroup/cpuset;
        cpu        = /cgroup/cpu;
        cpuacct        = /cgroup/cpuacct;
        memory        = /cgroup/memory;
        devices        = /cgroup/devices;
        freezer        = /cgroup/freezer
......省略。。。。。。。
例如cpuset=/cgroup/cputest,就可以理解为以下几条命令
[root@susir /]# mount -t cgroup -o cpuset cpuset /cgroup/cpuset
mount: cpuset already mounted or /cgroup/cpuset busy
[root@susir /]# umount /cgroup/cpu
cpu/     cpuacct/ cpuset/  
[root@susir /]# umount /cgroup/cpuset
[root@susir /]# mount -t cgroup -o cpuset cpuset /cgroup/cpuset
4、与cgroup相关的几个命令:
lssubsys-----显示已经存在的子系统。
[root@susir /]# lssubsys -am
cpu /cgroup/cpu
cpuacct /cgroup/cpuacct
memory /cgroup/memory
devices /cgroup/devices
freezer /cgroup/freezer
net_cls /cgroup/net_cls
blkio /cgroup/blkio
cpuset /cgroup/cpuset
ns
上所示,除ns子系统没有在/etc/cgconfig.conf文件里设置外,其他的都挂载在对应的目录下面。
lscgroup-----显示所有的cgroup。
[root@susir /]# lscgroup 
cpu:/
cpuacct:/
memory:/
devices:/
freezer:/
net_cls:/
blkio:/
cpuset:/
5、挂载与卸载子系统层次:
如上所示,各个模块均以挂载与对于的目录下面。以下卸载了cpu子系统层次:
[root@susir /]# umount /cgroup/cpu
[root@susir /]# lssubsys -am  #(-a代表所有,-m代表显示挂载点。)
cpuacct /cgroup/cpuacct
memory /cgroup/memory
devices /cgroup/devices
freezer /cgroup/freezer
net_cls /cgroup/net_cls
blkio /cgroup/blkio
cpuset /cgroup/cpuset
ns
cpu
其他的卸载与挂载都一样。使用以下命令将其挂载回去:
[root@susir /]# mount -t cgroup -o cpu cpu /cgroup/cpu
[root@susir /]# lssubsys -am
cpuacct /cgroup/cpuacct
memory /cgroup/memory
devices /cgroup/devices
freezer /cgroup/freezer
net_cls /cgroup/net_cls
blkio /cgroup/blkio
cpuset /cgroup/cpuset
cpu /cgroup/cpu
ns
6、创建一个自定义的cgroup:
这里要用到cgcreate命令,具体用法如下所示:先来看个示例:
[root@susir /]# cgcreate 
Usage is cgcreate -t <tuid>:<tgid> -a <agid>:<auid> -g <list of controllers>:<relative path to cgroup>

[root@susir /]# cgcreate -g cpu,net_cls:/test-subgroup
[root@susir /]# lssubsys -am
cpuacct /cgroup/cpuacct
memory /cgroup/memory
devices /cgroup/devices
freezer /cgroup/freezer
net_cls /cgroup/net_cls
blkio /cgroup/blkio
cpuset /cgroup/cpuset
cpu /cgroup/cpu
ns
没有出来。看到么。其实挂载上去之后,使用lssubsys命令是看不到的。因为啊。创建完了之后,系统还不能挂载,因为挂载点不存在,等挂载点创建了之后,系统会自动挂载上去的。
7、删除cgroup
[root@susir /]# cgdelete 

Usage is cgdelete [-r] <list of controllers>:<relative path to cgroup> [...]


cgroup 将系统分为多个controller,比如cpu,memory,blkio

进程通过cgred服务定义到某个cgroup子系统中,从而达到限制目的

cgconfig服务启动后,在根目录下产生/cgroup目录,每个控制器单独对应一个文件夹(cgroup子系统)。可以通过lssubsys -m 查看当前controller和子系统文件夹的对应关系。

controller生成的目录根据/etc/cgconfig.conf产生,同一个controller只能对应一个文件夹,同一个文件夹可以对应多个controller

cgroup的配置保存在/etc/cgconfig.conf,自定义的cgroup也是在此进行配置

#cgroup的基本结构如下

cgroup lesscpu{

#lesscpu为cgroup名称

    cpu{

#controller从cpu继承,产生的子系统文件夹从cpu继承

        cpu.shares = 100;

#cpu份额值,默认等于父controller的值,设置值不能超过父controller的值

    }

}

cgroup morecpu{

    cpu{

        cpu.shares = 300;

#同一级子系统,份额值高于lesscpu,在发生cpu抢占时,morecpu优先获得cpu资源

    }

}

通过cgexec 指定命令调用某个cgroup。

cgexec -g cpu:lesscpu command

#命令行方式指定命令调用某个cgroup限制。

下面是内存限制的写法

cgroup lessmem{

    memory{

        memory.limit_in_bytes = 536870912;

#物理内存限制为512M字节,超出部分将写入到交换分区。

        memory.memsw.limit_in_bytes = 536870912;

#物理内存+交换分区的总值限制为512M字节,结合前一条设置,结论是不使用交换分区

    }

}


应用此cgroup的程序使用超过限制的内存时,进程将被kill

下面是磁盘I/O限制的写法

group lowio{

    blkio{

    blkio.weight=100;

#blkio.weight应用在基于cfq调度算法的磁盘,其他算法不支持

    }

}

group highio{

    blkio{

    blkio.weight=200;

    }

}

group ddio{

    blkio{

    blkio.throttle.read_bps_device="8:0 1000000";

#限制第一个scsi设备的读速率为1m(ll /dev/sda可以得出8:0类似编号)

    }

}

cgroup的规则配置写入到 /etc/cgrules.conf,配置文件写法与limit.conf文件类似

user:program  controller  cgroup子系统

vim /etc/cgrules.conf

cat /etc/cgrules.conf

john:dd    blkio    ddio/

*:dd    blkio    ddio/

john:*    cpu    lesscpu/


配置完成后,通过service cgred restart 重新加载此配置文件

cgroup还可以冻结指定进程,配置写法如下

group stopit{

    freezer{

    }

}

#freezer不需要任何参数


echo pid > /cgroup/freezer/stopit/tasks

#将需要控制的进程号放到tasks中

echo FROZEN > /cgroup/freezer/stopit/freezer.state

#执行冻结操作,操作队tasks中的进程号生效

echo THAWED > /cgroup/freezer/stopit/freezer.state

#执行解冻操作


### 配置和使用 cgroup 的方法 cgroup(Control Groups)是 Linux 内核提供的一种机制,用于限制、控制和隔离一组进程对系统资源的访问[^3]。以下是对 cgroup 的配置和使用的详细说明。 #### 1. 检查 cgroup 是否已挂载 在大多数现代 Linux 发行版中,cgroup 已经默认挂载。可以通过以下命令检查是否挂载成功: ```bash mount | grep cgroup ``` 如果输出类似以下内容,则表示 cgroup 已正确挂载: ``` tmpfs on /sys/fs/cgroup type tmpfs (ro,nosuid,nodev,noexec,mode=755,inode64) cgroup2 on /sys/fs/cgroup/unified type cgroup2 (rw,nosuid,nodev,noexec,relatime,nsdelegate) ``` 上述信息表明系统支持 cgroup v2[^1]。 #### 2. 创建新的 cgroup 并分配资源 以限制 CPU 资源为例,展示如何创建一个新的 cgroup 并设置资源限制。 ##### 2.1 创建 cgroup 目录 进入 `/sys/fs/cgroup/unified` 或 `/sys/fs/cgroup/cpu`(根据系统版本),然后创建一个新目录: ```bash sudo mkdir /sys/fs/cgroup/unified/my_group ``` ##### 2.2 设置 CPU 配额 通过修改 `cpu.max` 文件来限制 CPU 使用时间。例如,将 CPU 配额设置为每秒 100ms: ```bash echo "100000 1000000" | sudo tee /sys/fs/cgroup/unified/my_group/cpu.max ``` 此处 `100000` 表示分配给该组的周期内允许使用的微秒数,`1000000` 表示每个周期的时间长度(1 秒)[^3]。 ##### 2.3 将进程添加到 cgroup 找到目标进程的 PID,并将其写入 `cgroup.procs` 文件: ```bash echo <PID> | sudo tee /sys/fs/cgroup/unified/my_group/cgroup.procs ``` 替换 `<PID>` 为实际的进程 ID。 #### 3. 配置内存限制 类似于 CPU 配置,可以限制内存使用。例如,设置最大内存为 512MB: ```bash echo $((512 * 1024 * 1024)) | sudo tee /sys/fs/cgroup/unified/my_group/memory.max ``` 此命令将内存限制设置为 512MB,单位为字节[^3]。 #### 4. 验证配置效果 可以通过读取相关文件来验证配置是否生效。例如,查看当前 CPU 使用情况: ```bash cat /sys/fs/cgroup/unified/my_group/cpu.stat ``` #### 5. 其他资源类型 除了 CPU 和内存,cgroup 还支持其他资源类型的限制,例如磁盘 I/O 和网络带宽。具体配置方式与上述类似,只需操作对应的文件即可[^2]。 ### 示例代码 以下是一个完整的脚本示例,用于创建 cgroup 并限制资源: ```bash #!/bin/bash # 创建 cgroup 目录 sudo mkdir -p /sys/fs/cgroup/unified/my_group # 设置 CPU 配额(每秒 100ms) echo "100000 1000000" | sudo tee /sys/fs/cgroup/unified/my_group/cpu.max > /dev/null # 设置内存限制(512MB) echo $((512 * 1024 * 1024)) | sudo tee /sys/fs/cgroup/unified/my_group/memory.max > /dev/null # 将当前 shell 进程加入 cgroup echo $$ | sudo tee /sys/fs/cgroup/unified/my_group/cgroup.procs > /dev/null echo "cgroup 配置完成,当前进程已加入 my_group" ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值