控制組(CGroups)是Linux內核的一個特性,主要用來對共享資源進行隔離、限制、審計等。只有能控制分配到容 器的資源,才能避免多個容器同時運行時對宿主機系統的資源競爭。控制組可以提供對容器的內存、CPU、磁盤IO等 資源進行限制和計費管理。控制組的設計目標是為不同的應用情況提供統一的接口,從控制單一進程(比如nice工 具)到系統級虛擬化(包括OpenVZ、Linux-VServer、LXC等)
具體來看,控制組提供:
資源限制(Resource limiting):可以將組設置為不超過設定的內存限制。比如:內存子系統可以為進程組設定一個 內存使用上限,一旦進程組使用的內存達到限額再申請內存,就會出發Out of Memory警告。 優先級 (Prioritization):通過優先級讓一些組優先得到更多的CPU等資源。 資源審計(Accounting):用來統計系統實 際上把多少資源用到適合的目的上,可以使用cpuacct子系統記錄某個進程組使用的CPU時間。 隔離(isolation): 為組隔離命名空間,這樣一個組不會看到另一個組的進程、網絡連接和文件系統。 控制(Control):掛起、恢復和 重啟動等操作。
cgroups: Control Groups 基於進程的限制,而非用戶,因此對於超戶運行的進程也是一樣
cgroup將各種子系統定義為資源,命名為controller: 可配額/可度量 - Control Groups (cgroups)
cgroups實現了對資源的配額和度量九大子系統的資源
1. blkio 限制每個塊設備的輸入輸出控制。例如:磁盤,光盤以及usb
2. cpu 限制使用cpu比例
3. cpuacct 產生cgroup任務的cpu資源報告。
4. cpuset 多核心的cpu時為cgroup任務分配單獨的cpu和內存
5. devices 允許或拒絕對設備的訪問。
6. freezer 暫停和恢復cgroup任務。
7. memory 設置內存限制以及產生內存資源報告。
8. net_cls 標記每個網絡包。
9. ns 名稱空間子系統
例如:對某個進程使用內存進行限制步驟:
1. 需要在controller memory下建立cgroup,如nginx_mem控制組,並針對該控制組nginx_mem設置相應的內存 限制參數
2. 將進程Nginx分配到 memory controller的控制組(nginx_mem),沒有使用controller則不會限制。
Cgroup實現資源限制的方法:
a. cgexec 手動分配 b. cgred 自動分配
Cgroup部署方法
[root@localhost ~]#yum -y install libcgroup* [root@localhost ~]#systemctl enable cgconfig [root@localhost ~]#systemctl start cgconfig [root@localhost ~]#man cgconfig.conf
Cgroup限制步驟
1,創建cgroup,定義相應的限制
2,分配程序到cgroup
案例1:限制進程使用CPU
1,使用cpu子系統創建兩個cgroup
配置文件添加配置
#cat /etc/cgconfig.conf group lesscpu { cpu { cpu.shares=200; } } group morecpu { cpu { cpu.shares=800; } }
創建兩個組lesscpu和morecpu 200 800指定分配的份額
重啟服務
[root@localhost ~]#systemctl restart cgconfig1
2.將程序分配到相應的group 實驗中,為了讓兩個進程搶CPU時間片,故意只留一個CPU在線
[root@localhost ~]#lscpu [root@localhost ~]#echo 0 > /sys/devices/system/cpu/cpu0/online [root@localhost ~]#echo 1 > /sys/devices/system/cpu/cpu1/online
手動分配
[root@localhost ~]#cgexec -g cpu:lesscpu sha1sum /dev/zero [root@localhost ~]#cgexec -g cpu:morecpu md5sum /dev/zero [root@localhost ~]#top
以上三條命令請在三個shell終端中打開,觀察各進程所占用CPU情況。
PS:未成功,設置CPU下線不成功
案例2:限制進程使用Memory
添加cgroup
#cat /etc/cgconfig.conf group lessmem { memory { memory.limit_in_bytes=268435465; //物理內存限制256M } }
重啟
[root@localhost ~]#systemctl restart cgconfig
創建內存盤
[root@localhost ~]# mkdir /mnt/mem_test [root@localhost ~]#mount -t tmpfs /dev/shm /mnt/mem_test [root@localhost ~]# cgexec -g memory:lessmem dd if=/dev/zero of=/mnt/mem_test/file bs=1M count=200 //OK [root@localhost ~]# cgexec -g memory:lessmem dd if=/dev/zero of=/mnt/mem_test/file bs=1M count=500 //OK [root@localhost ~]#free -m
結果為失敗
應該寫成如下
group poormem{ memory{ memory.limit_in_bytes=268435465; //物理內存限制256M memory.memsw.limit_in_bytes=268435465; //總內存限制,物理+SWAP } }