1 簡介
Linux CGroup全稱Linux Control Group, 是Linux內核的一個功能,用來限制,控制與分離一個進程組群的資源(如CPU、內存、磁盤輸入輸出等)。這個項目最早是由Google的工程師在2006年發起(主要是Paul Menage和Rohit Seth),最早的名稱為進程容器(process containers)。在2007年時,因為在Linux內核中,容器(container)這個名詞太過廣泛,為避免混亂,被重命名為cgroup,並且被合並到2.6.24版的內核中去。然后,其它開始了他的發展。
Linux CGroupCgroup 可為系統中所運行任務(進程)的用戶定義組群分配資源—比如CPU 時間、系統內存、網絡帶寬或者這些資源的組合。可以監控配置的 cgroup,拒絕cgroup 訪問某些資源,甚至在運行的系統中動態配置cgroup。
1.1 主要功能
(1)限制資源使用,比如內存使用上限以及文件系統的緩存限制。
(2)優先級控制,CPU利用和磁盤IO吞吐。
(3)一些審計或一些統計,主要目的是為了計費。
(4)掛起進程,恢復執行進程。
1.2 cgroups子系統
Cgroups(Control Groups)基於進程的限制,而非用戶,因此對於超戶運行的進程也是一樣;
cgroups子系統:
1.blkio 限制每個塊設備的輸入輸出控制。例如:磁盤,光盤以及usb。
2.cpu 限制使用cpu比例
3.cpuacct 產生cgroup任務的cpu資源報告。
4.cpuset 多核心的cpu時為cgroup任務分配單獨的cpu和內存 綁定進程和cpu減少上下文切換 內存訪問情況 就近訪問內存
5.devices 允許或拒絕對設備的訪問。
6.freezer 暫停和恢復cgroup任務。
7.memory 設置內存限制以及產生內存資源報告。
8.net_cls 可以標記 cgroups 中進程的網絡數據包,然后可以使用 tc 模塊(traffic control)對數據包進行控制。
9.net_prio — 這個子系統用來設計網絡流量的優先級。
10.ns 可以使不同 cgroups 下面的進程使用不同的 namespace。
11.hugetlb — 這個子系統主要針對於HugeTLB系統進行限制,這是一個大頁文件系統。
2 綁定進程到指定cpu核數
#yum安裝 #yum install libcgroup libcgroup-tools numactl -y #獲取CPU線程數 #grep 'processor' /proc/cpuinfo | sort -u | wc -l #獲取CPU NUMA內存節點信息 #numactl --hardware 或 #lscpu | grep NUMA
#創建設置small組策略 4核 cgcreate -g cpuset:small cgset -r cpuset.cpus=0-3 small cgset -r cpuset.mems=0 small #創建設置large組策略 8核 cgcreate -g cpuset:large cgset -r cpuset.cpus=0-7 large cgset -r cpuset.mems=0 large
#默認的cpuset.cpus和cpuset.mems是空的;需要同時設定這2個值,其中mems的值參考numa的node數字,上面通過numactl --hardware查到是0
注意:
1.cpuset子系統是有兩個參數是強制要求定義的,cpuset.cpus和cpuset.mems。
cpuset.cpus(強制)
指定允許這個cgroup 中任務訪問的CPU。這是一個用逗號分開的列表,格式為ASCII,使用小橫線(”-”)代表范圍。
cpuset.mems(強制)
指定允許這個cgroup 中任務可訪問的內存節點。這是一個用逗號分開的列表,格式為ASCII,使用小橫線(”-”)代表范圍。
2.對於多線程的程序,該方法不生效;
3. 配置完在/sys/fs/cgroup/cpuset目錄會出現smal,large目錄。
# 運行命令
#cgexec -g cpuset:small 程序運行命令 #cgexec -g cpuset:large 程序運行命令
#示例
#編寫一個消耗cpu的腳本
vi t1.sh #/bin/bash x=0 while [ True ];do x=$x+1 done;
#限制程序運行在固定cpu核數上
#cgexec -g cpuset:small sh t1.sh &
#運行top命令,然后按1,可以看到每個cpu核數的情況
3 限制進程cpu使用率
3.1 示例1
#yum安裝 #yum install libcgroup libcgroup-tools numactl -y #systemctl status cgconfig.service #systemctl start cgconfig.service #查看cgroup掛載點(centos7.7),此處可參見cgroups子系統 #lssubsys -am
#創建隔離組 #cd /sys/fs/cgroup/cpu #mkdir cpu_test 說明:目錄創建完成會自動生成以下文件(注:該目錄無法手動刪除,如果不加入開機自啟,重啟后會消失) #ls cpu_test/
#跑一個耗cpu的腳本 #vi t1.sh #/bin/bash x=0 while [ True ];do x=$x+1 done; #chmod +x t1.sh #sh t1.sh &
#修改參數 # echo 20000 > /sys/fs/cgroup/cpu/cpu_test/cpu.cfs_quota_us 注:默認-1不限制,現在改成20000,是將cpu.cfs_quota_us設為20000,相對於cpu.cfs_period_us的100000是20%;可以理解cpu使用率限制在20%; #找到進程號增加到cpu tasks里面,在看top,cpu使用率很快就下來 #echo 2938 >> /sys/fs/cgroup/cpu/cpu_test/tasks
說明:在上面的情況下,如果將三個進程pid都寫入到tasks,會出現三個進程共享20%cpu的情況;
3.2 示例2
說明:該部分內容補充示例1,使用命令創建控制群組;
#創建控制群組 #cgcreate -g cpu:/g1 說明:這個命令會創建/sys/fs/cgroup/cpu/g1目錄出來,在這個目錄下有各種cgroup cpu的配置文件; #設置CPU限制參數 #cgset -r cpu.cfs_quota_us=20000 g1 #查看是否設置成功 #cgget -r cpu.cfs_quota_us g1 #啟動進程,通過top可以看到cpu占用100%,同時拿到進程pid:2231 #cat t1.sh #/bin/bash x=0 while [ True ];do x=$x+1 done; #sh /tmp/t1.sh & #將此進程加入控制群組g1 #cgclassify -g cpu:/g1 2231 #cat /sys/fs/cgroup/cpu/g1/tasks 通過top看,cpu消耗變成了20% 注意:最好將一個進程寫在一個控制組內;將多個進程寫在一個控制組會共享cpu限制; 如:在一個控制組內寫入3個進程,cpu限制使用為20%,每個進程大概會占6%左右;
4 限制內存使用量
#創建控制群組g2 #cgcreate -g memory:g2 #查看默認內存是沒有限制的 cgget -r memory.limit_in_bytes g2 #限制內存只有1GB cgset -r memory.limit_in_bytes=1073741824 g2 #執行/tmp/highmemory.sh,進程號是21127 #vi /tmp/highmem.sh #/bin/bash x="a" while [ True ];do x=$x$x done; #將highmemory.sh進程加入g2的控制 #cgclassify -g memory:g2 21127
5 限制磁盤讀取速度
#要控制/dev/sdb的磁盤,通過下述命令查到磁盤驅動號8,16 #ls -l /dev/sdb
#創建控制組,設定8,16磁盤有1MB的讀取限制 #cgcreate -g blkio:g1 #cgset -r blkio.throttle.read_bps_device='8:16 10485760' g1 #啟動讀取測試命令,拿到pid 14468 #dd if=/dev/sdb of=/dev/null #通過命令可以看到對磁盤讀寫速度的消耗 #iotop #將進程加入g1控制組后,讀取速度被限制 #cgclassify -g blkio:g1 14468
-------------------------------------------------------------------------------------------------------------------------
參考鏈接:
https://www.cnblogs.com/menkeyi/p/10941843.html
https://www.jianshu.com/p/dc3140699e79
https://blog.csdn.net/micklf/article/details/60868649
https://blog.csdn.net/kwame211/article/details/78730705