安装
yum -y install libcgroup-tools.x86_64 yum -y install numactlnumactl是用来看cpu的numa内存的 启动
systemctl status cgconfig.service systemctl start cgconfig.service启动后的默认挂载位置:
[root@c2 cgroup]# lssubsys -am cpuset /sys/fs/cgroup/cpuset cpu,cpuacct /sys/fs/cgroup/cpu,cpuacct memory /sys/fs/cgroup/memory devices /sys/fs/cgroup/devices freezer /sys/fs/cgroup/freezer net_cls /sys/fs/cgroup/net_cls blkio /sys/fs/cgroup/blkio perf_event /sys/fs/cgroup/perf_event hugetlb /sys/fs/cgroup/hugetlb如果想要修改,需要umount掉,之后在/etc/cgconfig.conf里修改
systemctl enable cgconfig.service配置cgroup开机启动 服务器开机后,会将cgroup挂载到/sys/fs/cgroup下,但是用echo 3 > /xxx/tasks这种方式一直报错,所以建议切换到自己的目录,网上资料常见的是推荐到/cgroup下 服务器开机后,执行cgclear会清除掉默认的所有挂载 修改/etc/cgconfig.conf,加入如下内容
mount { cpuset = /cgroup/cpuset; cpu = /cgroup/cpu; cpuacct = /cgroup/cpuacct; memory = /cgroup/memory; devices = /cgroup/devices; blkio = /cgroup/blkio; }执行cgconfigparser -l /etc/cgconfig.conf可以让cgroup安装配置文件内的目录进行挂载,而之后也能使用echo 3 > /xxx/tasks ps:重启服务器,会发现还是默认挂载到/sys/fs/cgroup,所以上述操作最好写到开机启动里面 建议多使用cgset和cgget,而不要偷懒使用echo那种更改配置的方式,因为有的时候会报错无法执行成功。譬如cpuset.cpus和cpuset.mems
基础命令
cgclassify -- cgclassify命令是用来将运行的任务移动到一个或者多个cgroup。 cgclear -- cgclear 命令是用来删除层级中的所有cgroup。 cgconfig.conf -- 在cgconfig.conf文件中定义cgroup。 cgconfigparser -- cgconfigparser命令解析cgconfig.conf文件和并挂载层级。 cgcreate -- cgcreate在层级中创建新cgroup。 cgdelete -- cgdelete命令删除指定的cgroup。 cgexec -- cgexec命令在指定的cgroup中运行任务。 cgget -- cgget命令显示cgroup参数。 cgred.conf -- cgred.conf是cgred服务的配置文件。 cgrules.conf -- cgrules.conf 包含用来决定何时任务术语某些 cgroup的规则。 cgrulesengd -- cgrulesengd 在 cgroup 中发布任务。 cgset -- cgset 命令为 cgroup 设定参数。 lscgroup -- lscgroup 命令列出层级中的 cgroup。 lssubsys -- lssubsys 命令列出包含指定子系统的层级。cgcreate -g cpu:/g1 这个命令会创建/sys/fs/cgroup/cpu/g1目录出来,在这个目录下有各种cgroup cpu的配置文件
[root@c2 g1]# pwd /sys/fs/cgroup/cpu/g1 [root@c2 g1]# ls cgroup.clone_children cpuacct.stat cpu.cfs_period_us cpu.rt_runtime_us notify_on_release cgroup.event_control cpuacct.usage cpu.cfs_quota_us cpu.shares tasks cgroup.procs cpuacct.usage_percpu cpu.rt_period_us cpu.stat启动进程,通过top可以看到cpu占用100%,同时拿到进程pid:13642
[root@c2 g1]# cat /tmp/a.sh x=0 while [ True ];do x=$x+1 done; [root@c2 g1]# bash /tmp/a.sh将此进程加入控制群组g1:
[root@c2 ~]# cgclassify -g cpu:/g1 13642 [root@c2 g1]# cat /sys/fs/cgroup/cpu/g1/tasks 13642通过top看,cpu消耗变成了50%
假定已经按照如下方式进行了cgroup挂载
mount { cpuset = /cgroup/cpuset; cpu = /cgroup/cpu; cpuacct = /cgroup/cpuacct; memory = /cgroup/memory; devices = /cgroup/devices; blkio = /cgroup/blkio; }检查CPU的内存节点数
[root@c2 cpuset]# numactl --hardware available: 1 nodes (0) node 0 cpus: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 node 0 size: 98274 MB node 0 free: 95002 MB node distances: node 0 0: 10创建控制群组g1
cgcreate -g cpuset:g1默认的cpuset.cpus和cpuset.mems是空的 设定只用cpu0,需要同时设定这2个值,其中mems的值参考numa的node数字,上面通过numactl --hardware查到是0
cgset -r cpuset.cpus=0 g1 cgset -r cpuset.mems=0 g1设定后获取结果
[root@c2 ~]# cgget -r cpuset.cpus g1 g1: cpuset.cpus: 0 [root@c2 ~]# cgget -r cpuset.mems g1 g1: cpuset.mems: 0执行/tmp/highcpu.sh,进程号是3331,执行mpstat -P ALL 1 1可以看到当前在cpu17上运行 执行cgclassify -g cpuset:g1 3331,将highcpu.sh进程加入g1的控制,执行mpstat -P ALL 1 1可以看到切换到了cpu0运行 修改cpu,cgset -r cpuset.cpus=31 g1,之后highcpu.sh就切换到了cpu31执行,这里cpu.mems一直设定的是0,因为numa只有node 0
创建控制群组g1
cgcreate -g cpuset:g1查看默认内存是没有限制的
cgget -r memory.limit_in_bytes g1限制内存只有1GB
cgset -r memory.limit_in_bytes=1073741824 g1执行/tmp/highmemory.sh,进程号是21127 执行cgclassify -g memory:g1 21127,将highmemory.sh进程加入g1的控制,执行top以看到内存一直在涨,到1G的时候,进程就被kill掉了
这个和cgroup就没有关系了
dd if=/dev/zero of=/home/test/file.img bs=2M count=10 losetup /dev/loop0 /home/test/file.img mkfs.xfs /dev/loop0 mount -t xfs /dev/loop0 /home/test/dir上面依次做了创建一个镜像文件,20M,然后将镜像文件挂载成一个设备/dev/loop0,格式化成xfs文件系统后,挂载到/home/test/dir目录上 通过如下命令可以看到目录容量,向这个目录拷贝文件会发现超过17M就拷贝不进去了
[root@c2 test]# df -h Filesystem Size Used Avail Use% Mounted on /dev/loop0 17M 1.1M 16M 7% /home/test/dir [root@c2 test]# df -h Filesystem Size Used Avail Use% Mounted on /dev/loop0 17M 17M 20K 100% /home/test/dir要控制/dev/sdb的磁盘,通过下述命令查到磁盘驱动号8,16
[root@c2 g1]# ls -l /dev/sdb brw-rw---- 1 root disk 8, 16 Feb 25 10:04 /dev/sdb创建控制组,设定8,16磁盘有1MB的读取限制
cgcreate -g blkio:g1 cgset -r blkio.throttle.read_bps_device='8:16 10485760' g1启动读取测试命令,拿到pid 14468
dd if=/dev/sdb of=/dev/null通过下面命令可以看到对磁盘读写速度的消耗
[root@c2 test]# iotop Total DISK READ : 693.41 M/s | Total DISK WRITE : 3.69 K/s Actual DISK READ: 693.41 M/s | Actual DISK WRITE: 402.03 K/s TID PRIO USER DISK READ DISK WRITE SWAPIN IO> COMMAND 3731 be/4 root 693.41 M/s 0.00 B/s 0.00 % 0.00 % dd if=/dev/sdb of=/dev/null将进程加入g1控制组后,读取速度被限制
cgclassify -g blkio:g1 14468最开始只安装libcgroup.x86_64,会无法启动:
[root@c2 linfeng]# service cgconfig start Redirecting to /bin/systemctl start cgconfig.service Failed to start cgconfig.service: Unit cgconfig.service failed to load: No such file or directory.是因为没有安装libcgroup-tools.x86_64
/tmp/highcpu.sh
x=0 while [ True ];do x=$x+1 done;/tmp/highmem.sh
x="a" while [ True ];do x=$x$x done;