设为首页 收藏本站
查看: 1294|回复: 1

[经验分享] Docker之cgroup篇

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2016-9-18 09:16:01 | 显示全部楼层 |阅读模式
一、CGroup简介:
CGroup 是 Control Groups 的缩写,是 Linux 内核提供的一种可以限制、记录、隔离进程组 (process groups) 所使用的物力资源 (如 cpu memory i/o 等等) 的机制。2007 年进入 Linux 2.6.24 内核,CGroups 不是全新创造的,它将进程管理从 cpuset 中剥离出来,作者是 Google 的 Paul Menage。CGroups 也是 LXC 为实现虚拟化所使用的资源管理手段。
CGroup 功能及组成
CGroup 是将任意进程进行分组化管理的 Linux 内核功能。CGroup 本身是提供将进程进行分组化管理的功能和接口的基础结构,I/O 或内存的分配控制等具体的资源管理功能是通过这个功能来实现的。这些具体的资源管理功能称为 CGroup 子系统或控制器。CGroup 子系统有控制内存的 Memory 控制器、控制进程调度的 CPU 控制器等。运行中的内核可以使用的 Cgroup 子系统由/proc/cgroup 来确认。
CGroup 提供了一个 CGroup 虚拟文件系统,作为进行分组管理和各子系统设置的用户接口。要使用 CGroup,必须挂载 CGroup 文件系统。这时通过挂载选项指定使用哪个子系统。
二、CGroup子系统介绍:
blkio -- 这个子系统为块设备设定输入/输出限制,比如物理设备(磁盘,固态硬盘,USB 等等)。
cpu -- 这个子系统使用调度程序提供对 CPU 的 cgroup 任务访问。
cpuacct -- 这个子系统自动生成 cgroup 中任务所使用的 CPU 报告。
cpuset -- 这个子系统为 cgroup 中的任务分配独立 CPU(在多核系统)和内存节点。
devices -- 这个子系统可允许或者拒绝 cgroup 中的任务访问设备。
freezer -- 这个子系统挂起或者恢复 cgroup 中的任务。
memory -- 这个子系统设定 cgroup 中任务使用的内存限制,并自动生成由那些任务使用的内存资源报告。
net_cls -- 这个子系统使用等级识别符(classid)标记网络数据包,可允许 Linux 流量控制程序(tc)识别从具体 cgroup 中生成的数据包。
ns -- 名称空间子系统。
三、实验内容:
  • 实验环境:  
    RHEL6.5    172.25.44.1     server1.example.com
    iptables selinux disabled

    2.Cgroup的安装:
    [iyunv@server1 ~]# yum install -y libcgroup.x86_64
    [iyunv@server1 ~]# /etc/init.d/cgconfig start
    Starting cgconfig service:                                 [  OK  ]
    3.内存限制:
    [iyunv@server1 ~]# ls /cgroup/memory/        ##查看memory可用到的限制
    cgroup.event_control             memory.move_charge_at_immigrate
    cgroup.procs                     memory.oom_control
    memory.failcnt                   memory.soft_limit_in_bytes
    memory.force_empty               memory.stat
    memory.limit_in_bytes            memory.swappiness
    memory.max_usage_in_bytes        memory.usage_in_bytes
    memory.memsw.failcnt             memory.use_hierarchy
    memory.memsw.limit_in_bytes      notify_on_release
    memory.memsw.max_usage_in_bytes  release_agent
    memory.memsw.usage_in_bytes      tasks
    [iyunv@server1 ~]# cat /cgroup/memory/memory.limit_in_bytes
    9223372036854775807            ##内存限制字节数
    [iyunv@server1 ~]# vim /etc/cgconfig.conf

    group x1 {
        memory {
                memory.limit_in_bytes=209715200;    ##200*1024*1024=209715200# 限200M        

        }
    }
    [iyunv@server1 ~]# /etc/init.d/cgconfig restart
    Stopping cgconfig service:                                 [  OK  ]
    Starting cgconfig service:                                 [  OK  ]
    [iyunv@server1 ~]# df
    Filesystem                   1K-blocks    Used Available Use% Mounted on
    /dev/mapper/VolGroup-lv_root   6926264 1033680   5540740  16% /
    tmpfs                           510120       0    510120   0% /dev/shm
    /dev/vda1                       495844   33473    436771   8% /boot
    测试:
    [iyunv@server1 ~]# cd /dev/shm/
    [iyunv@server1 shm]# dd if=/dev/zero of=bigfile bs=1M count=300
    300+0 records in
    300+0 records out
    314572800 bytes (315 MB) copied, 0.216686 s, 1.5 GB/s
    在swap,所以,我们还要限制swap
    补充配置文件:
    [iyunv@server1 shm]# vim /etc/cgconfig.conf
    group x1 {
        memory {
                memory.limit_in_bytes=209715200;
                memory.memsw.limit_in_bytes=209715200;
        }
    }
    [iyunv@server1 shm]# /etc/init.d/cgconfig restart
    Stopping cgconfig service:                                 [  OK  ]
    Starting cgconfig service:                                 [  OK  ]
    [iyunv@server1 shm]# cgexec -g memory:x1 dd if=/dev/zero of=bigfile bs=1M count=300
    Killed
    4.执行脚本内存限制:
    下载脚本 memapp1 memapp2两个均为 4096 pages of memory (1个pages of memory = 4字节)加执   行权限,现令memapp1可以执行,memapp2不可以
    [iyunv@server1 ~]# chmod +x memapp*
    [iyunv@server1 ~]# ./memapp1
    -bash: ./memapp1: /lib/ld-linux.so.2: bad ELF interpreter: No such file or directory
    [iyunv@server1 ~]# yum install -y ld-linux.so.2
    [iyunv@server1 ~]# ./memapp1

    Process ID is: 1217

    Grabbing 4096 pages of memory

    Success!

    Press any key to exit

    [iyunv@server1 ~]# ./memapp2

    Process ID is: 1218

    Grabbing 8192 pages of memory

    Success!

    Press any key to exit
    [iyunv@server1 ~]# vim /etc/cgconfig.conf
    group x1 {
        memory {
                memory.limit_in_bytes=16777216;        ##4096*4*1024=16777216                                                                 memory.memsw.limit_in_bytes=16777216;
        }
    }
    [iyunv@server1 ~]# vim /etc/cgrules.conf
    *:memapp1       memory  x1/
    *:memapp2       memory  x1/    ##限制任何人在执行这两个脚本时,都遵循x1里的限制
    [iyunv@server1 ~]# /etc/init.d/cgconfig restart
    Stopping cgconfig service:                                 [  OK  ]
    Starting cgconfig service:                                 [  OK  ]
    [iyunv@server1 ~]# /etc/init.d/cgred restart
    Stopping CGroup Rules Engine Daemon...                     [  OK  ]
    Starting CGroup Rules Engine Daemon:                       [  OK  ]
    测试:
    [iyunv@server1 ~]# ./memapp1

    Process ID is: 1271

    Grabbing 4096 pages of memory

    Success!

    Press any key to exit

    [iyunv@server1 ~]# ./memapp2

    Process ID is: 1272

    Grabbing 8192 pages of memory
    Killed
    5.CPU限制:
    优先级区间19 ~ -20 ,19为最低优先级。
    修改配置文件:
    [iyunv@server1 ~]# vim /etc/cgconfig.conf
    group x2 {
        cpu {
                cpu.shares=100;    ##优先级设为100,小于默认的
        }
    }
    [iyunv@server1 ~]# /etc/init.d/cgconfig restart
    Stopping cgconfig service:                                 [  OK  ]
    Starting cgconfig service:                                 [  OK  ]
    测试:

    若为2个CPU,则关掉一个
    [iyunv@server1 ~]# cd /sys/devices/system/cpu/cpu1    (注意:cpu0不可以关掉,里面都没有online的选择)
    [iyunv@server1 cpu1]# cat online     ##状态为1,表示cpu正在工作
    1   
    [iyunv@server1 cpu1]# echo 0 > online     ##状态为0,表示关掉cpu

    [iyunv@server1 cpu1]# dd if=/dev/zero of=/dev/null &
    [1] 1286
    [iyunv@server1 cpu1]# dd if=/dev/zero of=/dev/null &
    [2] 1287
    [iyunv@server1 cpu1]# top    ##可以看到两个进程在均衡占用cpu
    wKioL1fc4OHT5WdAAACL98-acDc530.jpg

    [iyunv@server1 cpu1]# cgexec -g cpu:x2 dd if=/dev/zero of=/dev/null &
    [1] 1291
    [iyunv@server1 cpu1]# top    ##只有一个资源在占用cpu
    wKiom1fc4VqzUjEWAACEikYh-Eg798.jpg

    [iyunv@server1 cpu1]# dd if=/dev/zero of=/dev/null &
    [2] 1293
    [iyunv@server1 cpu1]# top    ##可以看到分配的cpu资源不同,因为优先级不同了
    wKioL1fc4X2wXegdAACDczJ3qBI447.jpg
    6.I/O限制:
    查看所限制设备的类型:
    [iyunv@server1 cpu1]# ll /dev/vda
    brw-rw---- 1 root disk 252, 0 Sep 17 21:06 /dev/vda
    [iyunv@server1 cpu1]# ll /dev/sda1
    brw-rw---- 1 root disk 8, 1 Sep 17 20:42 /dev/sda1
    修改配置文件:
    [iyunv@server1 ~]# vim /etc/cgconfig.conf
    group x3 {
        blkio {
                blkio.throttle.read_bps_device="252:0 1024000";
        }
    }
    [iyunv@server1 cpu1]# /etc/init.d/cgconfig restart
    测试:
    [iyunv@server1 cpu1]# cgexec -g blkio:x3 dd if=/dev/vda of=/dev/null

    ^C27401+0 records in
    27400+0 records out
    14028800 bytes (14 MB) copied, 13.9036 s, 1.0 MB/s
    限制速度为1M
    7.限制freezer:
    修改配置文件:
    [iyunv@server1 cpu1]# vim /etc/cgconfig.conf
    group x4 {
        freezer {
        }
    }
    [iyunv@server1 cpu1]# /etc/init.d/cgconfig restart
    冻结任务:

    [iyunv@server1 cpu1]# cd /cgroup/freezer/x4
    [iyunv@server1 x4]# echo 7952 > tasks
    cat freezer.state  
        --> THAWED c活跃状态  

        FROZEN 冻结状态  
        echo FROZEN > freezer.state  

        会发现7592任务被冻结了,但是任务还在进行中,像CPU等都还在

   



运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-273734-1-1.html 上篇帖子: Docker与OpenStack集成实战 下篇帖子: docker 使用Dockerfile 创建带jdk 和tomcat的镜像
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表