一、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.comiptables 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
[root@server1 cpu1]# cgexec -g cpu:x2 dd if=/dev/zero of=/dev/null &
[1] 1291
[root@server1 cpu1]# top ##只有一個資源在佔用cpu
[root@server1 cpu1]# dd if=/dev/zero of=/dev/null &
[2] 1293
[root@server1 cpu1]# top ##可以看到分配的cpu資源不同,因爲優先級不同了
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等都還在