知识共享许可协议
本作品采用知识共享署名-非商业性使用-禁止演绎 3.0 未本地化版本许可协议进行许可。

说明
只是记录cgroup在centos 6.5的简单使用。
相关的介绍和命令的使用自行在网上查阅。
安装
yum install libcgroup -y
服务
默认没有启cgconfig服务,可以用 service cgconfig status 看到.
启动cgconfig服务, 使用: service cgconfig start
启动服务时,默认加载的配置文件是 /etc/cgconfig.conf

配置文件默认内容:
mount {
    cpuset  = /cgroup/cpuset;
    cpu     = /cgroup/cpu;
    cpuacct = /cgroup/cpuacct;
    memory  = /cgroup/memory;
    devices = /cgroup/devices;
    freezer = /cgroup/freezer;
    net_cls = /cgroup/net_cls;
    blkio   = /cgroup/blkio;
}

默认会挂载所有的controller

如果使用cgconfig服务,当这个服务器停掉会删除它挂载的所有东西。

可以使用cgsnapshot 生成快照:
cgsnapshot -s > /etc/cgconfig.conf 
挂载 cgroup 文件系统
mount -t cgroup cgroup /cgroup

可以使用 -o 指定 子系统, 比如使用 cpu 子系统:
mount -t cgroup -o cpu cpu /cgroup

重新挂载 指定 remount
mount -t cgroup -o remount cgroup /cgroup
只有在没有下层层级的情况下才能 remount

卸载test层级,使用umount就行:
umount /cgroup/test
列出所有的子系统
lssubsys -am
列出所有的group
lscgroup
CPU
  • CPU绑定,将线程分配给固定的CPU

    使用cpuset, 内核需要开启 CONFIG_CPUSETS=y
    执行 cat /boot/config-`uname -r` | grep CPUSETS 可以确认
    
    创建子层级:
        mkdir /cgroup/cpuset/test
    删除子层级
        rmdir /cgroup/cpuset/test
    执行 lscpu 查看cpu, 把cpu 1 分配给这个组
        echo 1 > /cgroup/cpuset/test/cpuset.cpus
        echo 0 > /cgroup/cpuset/test/cpuset.mems
    把当前bash的进程加入tasks
        echo $$ > /cgroup/cpuset/test/tasks
    启动测试程序
        perl -e 'while (true) {}' &
    
        进程号为 2232
    查看当前的信息
        ps -eLo pid,lwp,psr,args | grep -v grep | grep perl
    
        2232  2232   1 perl -e while (true) {}
    
  • CPU时间分配

    创建两个分组
        mkdir /cgroup/cpu/test1
        mkdir /cgroup/cpu/test2
    此时, test1, test2 分别使用50%的CPU资源
    
    可以修改 cpu.shares 设置使用CPU的比例
    echo 1024 > /cgroup/cpu/test1/cpu.shares
    echo 512 > /cgroup/cpu/test2/cpu.shares
    此时, test1使用的CPU资源是test2的2倍
    
    限制绝对的CPU使用率, 比如限制50%:
    echo 50000 > /cgroup/cpu/test/cpu.cfs_quota_us
    
内存
  • 限制内存的使用量

    mkdir /cgroup/memory/test1
    
    限制 1G 的使用量
    echo 1G > /cgroup/memory/test1/memory.limit_in_bytes
    写入 -1 表示无限制
    
    当内存超过1G则会触发OOM,进程直接被杀掉!
    
  • 关闭 oom killer

    echo 1 > /cgroup/memory/test1/memory.oom_control
    
网络
mkdir /cgroup/net_cls/test
echo 0x100001 > /cgroup/net_cls/test/net_cls.classid

然后使用 tc 或 iptables 对 0x100001 做网络限制
tc只能对流出的流量(上传)做限制

参考: http://lxr.free-electrons.com/source/Documentation/cgroups/net_cls.txt
磁盘
  • 设置权重

    内核需要开启 CONFIG_BLK_CGROUP, CONFIG_CFQ_GROUP_IOSCHED,
    使用下面两条命令确认:
    
    cat /boot/config-`uname -r` | grep CONFIG_BLK_CGROUP
    cat /boot/config-`uname -r` | grep CONFIG_CFQ_GROUP_IOSCHED
    
    mkdir /cgroup/blkio/test1
    
    echo 1000 > /cgroup/blkio/test1/blkio.weight
    权重范围 100 - 1000, 权重越大优先级越高
    
  • 限制读的IOPS

    echo "8:0 100000" > /cgroup/blkio/test1/blkio.throttle.read_iops_device
    其中 "8:0" 为主次设备号, ls -l /dev/sda 或者 stat /dev/sda 可以查到。
    https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/tree/Documentation/devices.txt 这个网址有详细的说明 
    "100" 为限制的磁盘IOPS
    
  • 限制读的bps

    echo "8:0 1048576" > /cgroup/blkio/test1/blkio.throttle.read_bps_device
    
  • 限制写的IOPS

    echo "8:0 100000" > /cgroup/blkio/test1/blkio.throttle.write_iops_device
    
  • 限制写的bps

    echo "8:0 1048576" > /cgroup/blkio/test1/blkio.throttle.write_bps_device