cgroup的簡單使用


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系統進行限制,這是一個大頁文件系統。

綁定進程到指定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

限制磁盤讀取速度

#要控制/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  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM