cgroup-资源隔离

来源:互联网 发布:js 字符串对象转数组 编辑:程序博客网 时间:2024/05/16 11:24

转载来自:http://blog.csdn.net/micklf/article/details/60868649

安装(基于centos7)

安装

yum -y install libcgroup-tools.x86_64yum -y install numactl
  • 1
  • 2
  • 1
  • 2

numactl是用来看cpu的numa内存的 
启动

systemctl status cgconfig.servicesystemctl start cgconfig.service
  • 1
  • 2
  • 1
  • 2

启动后的默认挂载位置:

[root@c2 cgroup]# lssubsys -amcpuset /sys/fs/cgroup/cpusetcpu,cpuacct /sys/fs/cgroup/cpu,cpuacctmemory /sys/fs/cgroup/memorydevices /sys/fs/cgroup/devicesfreezer /sys/fs/cgroup/freezernet_cls /sys/fs/cgroup/net_clsblkio /sys/fs/cgroup/blkioperf_event /sys/fs/cgroup/perf_eventhugetlb /sys/fs/cgroup/hugetlb
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

如果想要修改,需要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;}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

执行cgconfigparser -l /etc/cgconfig.conf可以让cgroup安装配置文件内的目录进行挂载,而之后也能使用echo 3 > /xxx/tasks 
ps:重启服务器,会发现还是默认挂载到/sys/fs/cgroup,所以上述操作最好写到开机启动里面 
建议多使用cgsetcgget,而不要偷懒使用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 命令列出包含指定子系统的层级。
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

示例

限制某进程CPU使用率

创建控制群组

cgcreate -g cpu:/g1 
这个命令会创建/sys/fs/cgroup/cpu/g1目录出来,在这个目录下有各种cgroup cpu的配置文件

[root@c2 g1]# pwd/sys/fs/cgroup/cpu/g1[root@c2 g1]# lscgroup.clone_children  cpuacct.stat          cpu.cfs_period_us  cpu.rt_runtime_us  notify_on_releasecgroup.event_control   cpuacct.usage         cpu.cfs_quota_us   cpu.shares         taskscgroup.procs           cpuacct.usage_percpu  cpu.rt_period_us   cpu.stat
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

设置CPU限制参数

[root@c2 g1]# cgset -r cpu.cfs_quota_us=50000 g1[root@c2 g1]# cgget -r cpu.cfs_quota_us g1g1:cpu.cfs_quota_us: 50000
  • 1
  • 2
  • 3
  • 4
  • 1
  • 2
  • 3
  • 4

将进程加入控制群组

启动进程,通过top可以看到cpu占用100%,同时拿到进程pid:13642

[root@c2 g1]# cat /tmp/a.sh x=0while [ True ];do    x=$x+1done;[root@c2 g1]# bash /tmp/a.sh 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

将此进程加入控制群组g1:

[root@c2 ~]# cgclassify -g cpu:/g1 13642[root@c2 g1]# cat /sys/fs/cgroup/cpu/g1/tasks 13642
  • 1
  • 2
  • 3
  • 1
  • 2
  • 3

通过top看,cpu消耗变成了50%

功能

假定已经按照如下方式进行了cgroup挂载

mount {    cpuset  = /cgroup/cpuset;    cpu     = /cgroup/cpu;    cpuacct = /cgroup/cpuacct;    memory  = /cgroup/memory;    devices = /cgroup/devices;    blkio   = /cgroup/blkio;}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

检查CPU的内存节点数

[root@c2 cpuset]# numactl --hardwareavailable: 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 31node 0 size: 98274 MBnode 0 free: 95002 MBnode distances:node   0   0:  10 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

CPU使用核数

创建控制群组g1

cgcreate -g cpuset:g1
  • 1
  • 1

默认的cpuset.cpus和cpuset.mems是空的 
设定只用cpu0,需要同时设定这2个值,其中mems的值参考numa的node数字,上面通过numactl --hardware查到是0

cgset -r cpuset.cpus=0 g1cgset -r cpuset.mems=0 g1
  • 1
  • 2
  • 1
  • 2

设定后获取结果

[root@c2 ~]# cgget -r cpuset.cpus g1g1:cpuset.cpus: 0[root@c2 ~]# cgget -r cpuset.mems g1g1:cpuset.mems: 0
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

执行/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 memory:g1
  • 1
  • 1

查看默认内存是没有限制的

cgget -r memory.limit_in_bytes g1
  • 1
  • 1

限制内存只有1GB

cgset -r memory.limit_in_bytes=1073741824 g1
  • 1
  • 1

执行/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=10losetup /dev/loop0 /home/test/file.imgmkfs.xfs /dev/loop0 mount -t xfs /dev/loop0 /home/test/dir 
  • 1
  • 2
  • 3
  • 4
  • 1
  • 2
  • 3
  • 4

上面依次做了创建一个镜像文件,20M,然后将镜像文件挂载成一个设备/dev/loop0,格式化成xfs文件系统后,挂载到/home/test/dir目录上 
通过如下命令可以看到目录容量,向这个目录拷贝文件会发现超过17M就拷贝不进去了

[root@c2 test]# df -hFilesystem               Size  Used Avail Use% Mounted on/dev/loop0                17M  1.1M   16M   7% /home/test/dir[root@c2 test]# df -hFilesystem               Size  Used Avail Use% Mounted on/dev/loop0                17M   17M   20K 100% /home/test/dir
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

磁盘读取速度限制

要控制/dev/sdb的磁盘,通过下述命令查到磁盘驱动号8,16

[root@c2 g1]# ls -l /dev/sdbbrw-rw---- 1 root disk 8, 16 Feb 25 10:04 /dev/sdb
  • 1
  • 2
  • 1
  • 2

创建控制组,设定8,16磁盘有1MB的读取限制

cgcreate -g blkio:g1cgset -r blkio.throttle.read_bps_device='8:16 10485760' g1
  • 1
  • 2
  • 1
  • 2

启动读取测试命令,拿到pid 14468

dd if=/dev/sdb of=/dev/null 
  • 1
  • 1

通过下面命令可以看到对磁盘读写速度的消耗

[root@c2 test]# iotopTotal DISK READ :     693.41 M/s | Total DISK WRITE :       3.69 K/sActual 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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 1
  • 2
  • 3
  • 4
  • 5

将进程加入g1控制组后,读取速度被限制

cgclassify -g blkio:g1 14468
  • 1
  • 1

问题

无法启动

最开始只安装libcgroup.x86_64,会无法启动:

[root@c2 linfeng]# service cgconfig startRedirecting to /bin/systemctl start  cgconfig.serviceFailed to start cgconfig.service: Unit cgconfig.service failed to load: No such file or directory.
  • 1
  • 2
  • 3
  • 1
  • 2
  • 3

是因为没有安装libcgroup-tools.x86_64

其他知识

获取CPU线程数

[root@c2 ~]# grep 'processor' /proc/cpuinfo | sort -u | wc -l32
  • 1
  • 2
  • 1
  • 2

获取CPU NUMA内存节点信息

[root@c2 cpuset]# numactl --hardwareavailable: 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 31node 0 size: 98274 MBnode 0 free: 95002 MBnode distances:node   0   0:  10 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
[root@c2 cpuset]# lscpu  | grep NUMANUMA node(s):          1NUMA node0 CPU(s):     0-31
  • 1
  • 2
  • 3
  • 1
  • 2
  • 3

测试脚本

highcpu.sh

/tmp/highcpu.sh

x=0while [ True ];do    x=$x+1done;
  • 1
  • 2
  • 3
  • 4
  • 1
  • 2
  • 3
  • 4

highmem.sh

/tmp/highmem.sh

x="a"while [ True ];do    x=$x$xdone;
原创粉丝点击