Docker之cgroup篇

一、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 -- 名稱空間子系統。

三、實驗內容:

  1. 實驗環境: 
    RHEL6.5    172.25.44.1     server1.example.com

    iptables selinux disabled

    2.Cgroup的安裝:

    [root@server1 ~]# yum install -y libcgroup.x86_64

    [root@server1 ~]# /etc/init.d/cgconfig start
    Starting cgconfig service:                                 [  OK  ]

    3.內存限制:

    [root@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
    [root@server1 ~]# cat /cgroup/memory/memory.limit_in_bytes
    9223372036854775807            ##內存限制字節數

    [root@server1 ~]# vim /etc/cgconfig.conf

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

        }
    }
    [root@server1 ~]# /etc/init.d/cgconfig restart
    Stopping cgconfig service:                                 [  OK  ]
    Starting cgconfig service:                                 [  OK  ]

    [root@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

    測試:
    [root@server1 ~]# cd /dev/shm/
    [root@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

    補充配置文件:

    [root@server1 shm]# vim /etc/cgconfig.conf
    group x1 {
        memory {
                memory.limit_in_bytes=209715200;
                memory.memsw.limit_in_bytes=209715200;
        }
    }

    [root@server1 shm]# /etc/init.d/cgconfig restart
    Stopping cgconfig service:                                 [  OK  ]
    Starting cgconfig service:                                 [  OK  ]
    [root@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不可以
    [root@server1 ~]# chmod +x memapp*
    [root@server1 ~]# ./memapp1

    -bash: ./memapp1: /lib/ld-linux.so.2: bad ELF interpreter: No such file or directory
    [root@server1 ~]# yum install -y ld-linux.so.2

    [root@server1 ~]# ./memapp1

    Process ID is: 1217

    Grabbing 4096 pages of memory

    Success!

    Press any key to exit

    [root@server1 ~]# ./memapp2

    Process ID is: 1218

    Grabbing 8192 pages of memory

    Success!

    Press any key to exit

    [root@server1 ~]# vim /etc/cgconfig.conf 

    group x1 {
        memory {
                memory.limit_in_bytes=16777216;        ##4096*4*1024=16777216                                                                 memory.memsw.limit_in_bytes=16777216;
        }
    }

    [root@server1 ~]# vim /etc/cgrules.conf

    *:memapp1       memory  x1/
    *:memapp2       memory  x1/    ##限制任何人在執行這兩個腳本時,都遵循x1裏的限制

    [root@server1 ~]# /etc/init.d/cgconfig restart
    Stopping cgconfig service:                                 [  OK  ]
    Starting cgconfig service:                                 [  OK  ]
    [root@server1 ~]# /etc/init.d/cgred restart
    Stopping CGroup Rules Engine Daemon...                     [  OK  ]
    Starting CGroup Rules Engine Daemon:                       [  OK  ]

    測試:
    [root@server1 ~]# ./memapp1

    Process ID is: 1271

    Grabbing 4096 pages of memory

    Success!

    Press any key to exit

    [root@server1 ~]# ./memapp2

    Process ID is: 1272

    Grabbing 8192 pages of memory
    Killed
    5.CPU限制:

    優先級區間19 ~ -20 ,19爲最低優先級。

    修改配置文件:

    [root@server1 ~]# vim /etc/cgconfig.conf

    group x2 {
        cpu {
                cpu.shares=100;    ##優先級設爲100,小於默認的
        }
    }

    [root@server1 ~]# /etc/init.d/cgconfig restart
    
Stopping cgconfig service:                                 [  OK  ]
    Starting cgconfig service:                                 [  OK  ]

    測試:

    若爲2個CPU,則關掉一個

    [root@server1 ~]# cd /sys/devices/system/cpu/cpu1    (注意:cpu0不可以關掉,裏面都沒有online的選擇)

    [root@server1 cpu1]# cat online     ##狀態爲1,表示cpu正在工作
    1    
    [root@server1 cpu1]# echo 0 > online     ##狀態爲0,表示關掉cpu

    [root@server1 cpu1]# dd if=/dev/zero of=/dev/null &
    [1] 1286
    [root@server1 cpu1]# dd if=/dev/zero of=/dev/null &
    [2] 1287
    [root@server1 cpu1]# top    ##可以看到兩個進程在均衡佔用cpu
    wKioL1fc4OHT5WdAAACL98-acDc530.png

    [root@server1 cpu1]# cgexec -g cpu:x2 dd if=/dev/zero of=/dev/null &
    [1] 1291
    [root@server1 cpu1]# top    ##只有一個資源在佔用cpu

    wKiom1fc4VqzUjEWAACEikYh-Eg798.png

    [root@server1 cpu1]# dd if=/dev/zero of=/dev/null &
    [2] 1293
    [root@server1 cpu1]# top    ##可以看到分配的cpu資源不同,因爲優先級不同了

    wKioL1fc4X2wXegdAACDczJ3qBI447.png

    6.I/O限制:

    查看所限制設備的類型:

    [root@server1 cpu1]# ll /dev/vda
    brw-rw---- 1 root disk 252, 0 Sep 17 21:06 /dev/vda

    [root@server1 cpu1]# ll /dev/sda1
    brw-rw---- 1 root disk 8, 1 Sep 17 20:42 /dev/sda1

    修改配置文件:

    [root@server1 ~]# vim /etc/cgconfig.conf

    group x3 {
        blkio {
                blkio.throttle.read_bps_device="252:0 1024000";
        }
    }

    [root@server1 cpu1]# /etc/init.d/cgconfig restart

    測試:

    [root@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:

    修改配置文件:

    [root@server1 cpu1]# vim /etc/cgconfig.conf 

    group x4 {
        freezer {
        }
    }

    [root@server1 cpu1]# /etc/init.d/cgconfig restart

    凍結任務:

    [root@server1 cpu1]# cd /cgroup/freezer/x4

    [root@server1 x4]# echo 7952 > tasks

    cat freezer.state   

        --> THAWED c活躍狀態   

        FROZEN 凍結狀態   

        echo FROZEN > freezer.state 

        會發現7592任務被凍結了,但是任務還在進行中,像CPU等都還在

    

    




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章