资源隔离-cgroup

    xiaoxiao2021-03-25  226

    安装

    安装

    yum -y install libcgroup-tools.x86_64 yum -y install numactl

    numactl是用来看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 命令列出包含指定子系统的层级。

    示例

    限制某进程CPU使用率

    创建控制群组

    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

    设置CPU限制参数

    [root@c2 g1]# cgset -r cpu.cfs_quota_us=50000 g1 [root@c2 g1]# cgget -r cpu.cfs_quota_us g1 g1: cpu.cfs_quota_us: 50000

    将进程加入控制群组

    启动进程,通过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

    CPU使用核数

    创建控制群组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

    其他知识

    获取CPU线程数

    [root@c2 ~]# grep 'processor' /proc/cpuinfo | sort -u | wc -l 32

    获取CPU NUMA内存节点信息

    [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 [root@c2 cpuset]# lscpu | grep NUMA NUMA node(s): 1 NUMA node0 CPU(s): 0-31

    测试脚本

    highcpu.sh

    /tmp/highcpu.sh

    x=0 while [ True ];do x=$x+1 done;

    highmem.sh

    /tmp/highmem.sh

    x="a" while [ True ];do x=$x$x done;
    转载请注明原文地址: https://ju.6miu.com/read-617.html

    最新回复(0)