资源隔离-cgroup

来源:互联网 发布:内网端口映射软件 编辑:程序博客网 时间:2024/05/15 12:40

安装

安装

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

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

systemctl status cgconfig.servicesystemctl start cgconfig.service

启动后的默认挂载位置:

[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

如果想要修改,需要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,所以上述操作最好写到开机启动里面
建议多使用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 命令列出包含指定子系统的层级。

示例

限制某进程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

设置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

将进程加入控制群组

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

将此进程加入控制群组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 --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 

CPU使用核数

创建控制群组g1

cgcreate -g cpuset:g1

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

cgset -r cpuset.cpus=0 g1cgset -r cpuset.mems=0 g1

设定后获取结果

[root@c2 ~]# cgget -r cpuset.cpus g1g1:cpuset.cpus: 0[root@c2 ~]# cgget -r cpuset.mems g1g1: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=10losetup /dev/loop0 /home/test/file.imgmkfs.xfs /dev/loop0 mount -t xfs /dev/loop0 /home/test/dir 

上面依次做了创建一个镜像文件,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

磁盘读取速度限制

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

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

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

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

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

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

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

[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

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

cgclassify -g blkio:g1 14468

问题

无法启动

最开始只安装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.

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

其他知识

获取CPU线程数

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

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

测试脚本

highcpu.sh

/tmp/highcpu.sh

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

highmem.sh

/tmp/highmem.sh

x="a"while [ True ];do    x=$x$xdone;
0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 衣服皱了没有熨斗怎么办 油烟机油盒坏了怎么办 实体店不给换货怎么办 台式电脑鼠标不动了怎么办 电脑开机一直长鸣报警怎么办 国外电话卡网速太慢怎么办 滴滴提现忘记登录密码怎么办 微信提现支付密码忘记了怎么办 小米手机前置摄像头打不开怎么办 mp4视频屏幕好小怎么办 投了简历没回应怎么办 借壳上市原股票怎么办 红米note3指纹解锁失灵怎么办 来分期刷脸失败怎么办 买到假货商家不承认怎么办 买到假货翻新货工商局怎么办 三星note8笔丢了怎么办 夜跑结束后该怎么办 lol客户端正在运行中怎么办 瑞和宝终端锁定怎么办 骊爽摩托车动力弱怎么办? 换了手机跟点微信怎么办 手机送点插头换了怎么办 校园网总是显示有代理软件怎么办 电脑连接无线网络需要登录怎么办 智校园密码忘了怎么办 ivvi手机开不开机怎么办 跑鞋子大了一码怎么办 洗浴搓澡出汗多该怎么办 联华超市卡丢了怎么办 飞利浦电视的应用打不开怎么办 贵阳市下岗职工办理门面补贴怎么办 陌陌上被骗了色怎么办 七位数的座机要怎么办 开通米粉卡店铺预留电话号码怎么办 办信用卡没有单位电话怎么办 qq账号永久封停怎么办 qq号给冻结了怎么办 微信被官方封2天怎么办 天虹的卡丢了怎么办 顺丰快递到不了的地区怎么办