centos6 cgroup及cgred簡介和簡單使用


一、cgroup簡介

  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 限制資源使用,比如內存使用上限以及文件系統的緩存限制。 2 優先級控制,CPU利用和磁盤IO吞吐。 3 一些審計或一些統計,主要目的是為了計費。 4 掛起進程,恢復執行進程。

cgroups子系統:

 1 cpu 子系統,主要限制進程的 cpu 使用率。  2 cpuacct 子系統,可以統計 cgroups 中的進程的 cpu 使用報告。  3 cpuset 子系統,可以為 cgroups 中的進程分配單獨的 cpu 節點或者內存節點。  4 memory 子系統,可以限制進程的 memory 使用量。  5 blkio 子系統,可以限制進程的塊設備 io。  6 devices 子系統,可以控制進程能夠訪問某些設備。  7 net_cls 子系統,可以標記 cgroups 中進程的網絡數據包,然后可以使用 tc 模塊(traffic control)對數據包進行控制。  8 net_prio — 這個子系統用來設計網絡流量的優先級  9 freezer 子系統,可以掛起或者恢復 cgroups 中的進程。 10 ns 子系統,可以使不同 cgroups 下面的進程使用不同的 namespace
11 hugetlb — 這個子系統主要針對於HugeTLB系統進行限制,這是一個大頁文件系統。

cgred簡介

Cgred 是​​​一​​​個​​​守​​​護​​​進​​​程​​​,它​​​可​​​根​​​據​​​在​​​ /etc/cgrules.conf 文​​​件​​​中​​​設​​​定​​​的​​​參​​​數​​​將​​​任​​​務​​​移​​​動​​​到​​​ cgroup 中​​​。​​​/etc/cgrules.conf 文​​​件​​​中​​​的​​​條​​​目​​​可​​​以​​​使​​​用​​​以​​​下​​​兩​​​個​​​格​​​式​​​之​​​一​​​: user hierarchies control_group user:command hierarchies control_group 例​​​如​​​: maria devices /usergroup/staff
這​​​個​​​條​​​目​​​指​​​定​​​任​​​何​​​屬​​​於​​​名​​​為​​​ maria 用​​​戶​​​的​​​進​​​程​​​根​​​據​​​在​​​
/usergroup/staff cgroup 中​​​指​​​定​​​的​​​參​​​數​​​訪​​​問​​​設​​​備​​​子​​​系​​​統​​​。​​​要​​​將​​​具​​​體​​​命​​​令​​​與​​​具​​​體​​​ cgroup 關​​​聯​​​,請​​​添​​​加​​​ command 參​​​數​​​,如​​​下​​​: maria:ftp devices /usergroup/staff/ftp
該​​​條​​​目​​​現​​​在​​​指​​​定​​​何​​​時​​​名​​​為​​​ maria 的​​​用​​​戶​​​使​​​用​​​ ftp 命​​​令​​​,自​​​動​​​將​​​該​​​進​​​程​​​移​​​動​​​到​​​包​​​含​​​ devices 子​​​系​​​統​​​的​​​層​​​級​​​中​​​的​​​
/usergroup/staff/ftp cgroup 中​​​。​​​請​​​注​​​意​​​:該​​​守​​​護​​​進​​​程​​​只​​​有​​​在​​​符​​​合​​​適​​​當​​​的​​​條​​​件​​​后​​​才​​​可​​​將​​​該​​​進​​​程​​​移​​​動​​​到​​​該​​​ cgroup 中​​​。​​​因​​​此​​​,ftp 可​​​能​​​會​​​在​​​錯​​​誤​​​的​​​組​​​群​​​中​​​短​​​暫​​​運​​​行​​​。​​​再​​​有​​​,如​​​果​​​該​​​進​​​程​​​在​​​錯​​​誤​​​組​​​群​​​中​​​迅​​​速​​​生​​​出​​​子​​​進​​​程​​​,則​​​不​​​會​​​移​​​動​​​這​​​些​​​子​​​進​​​程​​​。​​​ /etc/cgrules.conf 文​​​件​​​中​​​的​​​條​​​目​​​可​​​包​​​括​​​以​​​下​​​額​​​外​​​符​​​號​​​: @ - 當​​​在​​​ user 使​​​用​​​前​​​綴​​​時​​​,代​​​表​​​是​​​一​​​個​​​組​​​群​​​而​​​不​​​是​​​單​​​獨​​​用​​​戶​​​。​​​例​​​如​​​:@admins 是​​​ admins 組​​​群​​​中​​​的​​​所​​​有​​​用​​​戶​​​。​​​ * - 代​​​表​​​“​​​所​​​有​​​”​​​。​​​例​​​如​​​:subsystem 字​​​段​​​中​​​的​​​ * 代​​​表​​​所​​​有​​​子​​​系​​​統​​​。​​​ % - 代​​​表​​​與​​​以​​​上​​​行​​​中​​​項​​​目​​​相​​​同​​​的​​​項​​​目​​​。​​​例​​​如​​​: @adminstaff devices /admingroup @labstaff % %

小結:通過cgroup設置我們想要的規則,通過cgred將規則應用到進程之上

二、CPU限制

1.查看已經使用的子系統

[root@reddhat6_155_200 ~]# lssubsys -m cpuset /cgroup/cpuset cpu /cgroup/cpu cpuacct /cgroup/cpuacct memory /cgroup/memory devices /cgroup/devices freezer /cgroup/freezer net_cls /cgroup/net_cls blkio /cgroup/blkio

2.編輯cgroup配置文件,添加兩個group對CPU使用率的限制

[root@reddhat6_155_200 ~]# vim /etc/cgconfig.conf #添加以下兩段 group lesscpu{ cpu{ } } group morecpu{ cpu{ } }

3.重啟並查看CPU子系統目錄

[root@reddhat6_155_200 ~]# /etc/init.d/cgconfig restart Stopping cgconfig service: [確定] Starting cgconfig service: [確定] [root@reddhat6_155_200 ~]# ll /cgroup/cpu 總用量 0
--w--w--w-. 1 root root 0 2019-09-07 15:50 cgroup.event_control -rw-r--r--. 1 root root 0 2019-09-07 15:50 cgroup.procs -rw-r--r--. 1 root root 0 2019-09-07 15:50 cpu.cfs_period_us -rw-r--r--. 1 root root 0 2019-09-07 15:50 cpu.cfs_quota_us -rw-r--r--. 1 root root 0 2019-09-07 15:50 cpu.rt_period_us -rw-r--r--. 1 root root 0 2019-09-07 15:50 cpu.rt_runtime_us -rw-r--r--. 1 root root 0 2019-09-07 15:50 cpu.shares -r--r--r--. 1 root root 0 2019-09-07 15:50 cpu.stat drwxr-xr-x. 2 root root 0 2019-09-07 15:50 lesscpu #多出兩個目錄,和我們定義的group名稱是一至的 drwxr-xr-x. 2 root root 0 2019-09-07 15:50 morecpu -rw-r--r--. 1 root root 0 2019-09-07 15:50 notify_on_release -rw-r--r--. 1 root root 0 2019-09-07 15:50 release_agent -rw-r--r--. 1 root root 0 2019-09-07 15:50 tasks

4.查看目錄內容

[root@reddhat6_155_200 ~]# ll /cgroup/cpu 仔細觀察可以發現每個目錄中的文件都是相同的,也就是默認情況下group會繼承該子系統的所有規則 [root@reddhat6_155_200 ~]# ll /cgroup/cpu/morecpu/ [root@reddhat6_155_200 ~]# ll /cgroup/cpu/morecpu/

5.添加group規則

[root@reddhat6_155_200 ~]# cat /cgroup/cpu/cpu.shares  #cpu.shares表示程序可以在​​​ cgroup 中​​​的​​​任​​​務​​​可​​​用​​​的​​​相​​​對​​​共​​​享​​​ CPU 時​​​間​​​的​​​整​​​數​​​值​​​,默認為1024 1024 [root@reddhat6_155_200 ~]# vim /etc/cgconfig.conf group lesscpu{ cpu{ cpu.shares=100; #該值不可以超過總大小(1024) } } group morecpu{ cpu{ cpu.shares=200; } } [root@reddhat6_155_200 ~]# /etc/init.d/cgconfig restart Stopping cgconfig service: [確定] Starting cgconfig service: [確定]

 [root@reddhat6_155_200 ~]# cat /cgroup/cpu/lesscpu/cpu.shares
 100
 [root@reddhat6_155_200 ~]# cat /cgroup/cpu/morecpu/cpu.shares
 200

6.為了減少演示的復雜度,我們下線其他CPU,只保留一個CPU

[root@reddhat6_155_200 ~]# lscpu |grep -A 1  "^CPU\(s\):" #查看當前CPU個數及在線個數 CPU(s): 2 On-line CPU(s) list:   0,1 [root@reddhat6_155_200 ~]# echo 0 > /sys/devices/system/cpu/cpu1/online  #將cpu1下線,cpu0為主cpu無法下線 [root@reddhat6_155_200 ~]# lscpu |grep -A 1  "^CPU\(s\):" #查看在線狀態,目前只有cpu0在線 CPU(s): 2 On-line CPU(s) list:   0

7.新開一個窗口,同時執行dd命令,分別選擇lesscpu和morecpu

[root@reddhat6_155_200 ~]# cgexec -g cpu:lesscpu time dd if=/dev/zero of=/dev/null bs=1M count=200000 #窗口1 分配少的先執行 [root@reddhat6_155_200 ~]# cgexec -g cpu:morecpu time dd if=/dev/zero of=/dev/null bs=1M count=200000 #窗口2 [root@reddhat6_155_200 ~]# top   #窗口3 使用top命令監控命令狀態

注意觀察兩個dd命令CPU使用率

lesscpu結果:

[root@reddhat6_155_200 ~]# cgexec -g cpu:lesscpu time dd if=/dev/zero of=/dev/null bs=1M count=200000 記錄了200000+0 的讀入 記錄了200000+0 的寫出 209715200000字節(210 GB)已復制,21.7357 秒,9.6 GB/秒 #注意CPU使用時間 0.01user 10.83system 0:21.73elapsed 33%CPU (0avgtext+0avgdata 7776maxresident)k #注意CPU使用率 0inputs+0outputs (0major+521minor)pagefaults 0swaps

morecpu結果:

[root@reddhat6_155_200 ~]# cgexec -g cpu:morecpu time dd if=/dev/zero of=/dev/null bs=1M count=200000 記錄了200000+0 的讀入 記錄了200000+0 的寫出 209715200000字節(210 GB)已復制,16.26 秒,12.9 GB/0.02user 10.77system 0:16.26elapsed 66%CPU (0avgtext+0avgdata 7744maxresident)k 0inputs+0outputs (0major+519minor)pagefaults 0swaps

 三、MEM限制

1.編輯cgroup配置文件,添加一個mem限制

[root@reddhat6_155_200 ~]# cat /cgroup/memory/memory.limit_in_bytes #查看MEM(物理內存)默認限制大小 單位為字節 以目前機器配置,等同於無限制 9223372036854775807 [root@reddhat6_155_200 ~]# cat /cgroup/memory/memory.memsw.limit_in_bytes #查看MEM(物理內存)+Swap總的大小 此值必須大於等於 memory.limit_in_bytes 9223372036854775807 [root@reddhat6_155_200 ~]# vim /etc/cgconfig.conf #添加一個MEM 限制 group poormem{ memory{ memory.limit_in_bytes=268435456; #限制可以使用內存大小為256M } [root@reddhat6_155_200 ~]# /etc/init.d/cgconfig restart Stopping cgconfig service: [確定] Starting cgconfig service: [確定]
[root@reddhat6_155_200 ~]# cat /cgroup/memory/poormem/memory.limit_in_bytes

268435456

 2.創建一個內存盤

[root@reddhat6_155_200 ~]# mkdir /mnt/tmpfs [root@reddhat6_155_200 ~]# mount -t tmpfs none /mnt/tmpfs  #注意沒有掛載源 使用none [root@reddhat6_155_200 ~]# df -h Filesystem Size Used Avail Use% Mounted on /dev/mapper/vg_redhat6demo01-lv_root 50G 5.4G   42G  12% / tmpfs 2.0G  224K  2.0G   1% /dev/shm /dev/vda1             477M   33M  419M   8% /boot /dev/mapper/vg_redhat6demo01-lv_home 5.5G   12M  5.2G   1% /home none 2.0G     0  2.0G   0% /mnt/tmpfs   #大小2G,具體大小和系統剩余內存大小有關

3.測試tmpfs特性

[root@reddhat6_155_200 ~]# free -m #查看當前內存大小 total used free shared buffers cached Mem: 3959       2508       1451          2        246       1784
-/+ buffers/cache:        477       3482 Swap: 3967          0       3967 [root@reddhat6_155_200 ~]# dd if=/dev/zero of=/mnt/tmpfs/test bs=1M count=1000 #向 tmpfs 掛載點寫入1G內存 記錄了1000+0 的讀入 記錄了1000+0 的寫出 1048576000字節(1.0 GB)已復制,0.466811 秒,2.2 GB/秒 [root@reddhat6_155_200 ~]# free -m #查看系統內存 少了1G total used free shared buffers cached Mem: 3959       3511        448       1002        246       2784
-/+ buffers/cache:        480       3479 Swap: 3967          0       3967 [root@reddhat6_155_200 ~]# rm -f /mnt/tmpfs/test  #刪除剛剛創建的文件 [root@reddhat6_155_200 ~]# free -m  #查看當前剩余內存 total used free shared buffers cached Mem: 3959       2509       1450          2        246       1784
-/+ buffers/cache:        478       3481 Swap: 3967          0       3967

4.測試

[root@reddhat6_155_200 ~]# cgexec -g memory:poormem dd if=/dev/zero of=/mnt/tmpfs/test bs=1M count=200 #配置的為256M 先創建一個200M 測試文件 記錄了200+0 的讀入 記錄了200+0 的寫出 209715200字節(210 MB)已復制,0.097221 秒,2.2 GB/秒 [root@reddhat6_155_200 ~]# rm -f /mnt/tmpfs/test [root@reddhat6_155_200 ~]# cgexec -g memory:poormem dd if=/dev/zero of=/mnt/tmpfs/test bs=1M count=300 #創建一個300M測試文件 掛了 很奇怪,按照文檔說明此處不應該掛的,應該不夠的會從Swap中讀取 只有 memory.memsw.limit_in_bytes 也設置了才會限制從Swap中讀取 不知道為啥??????
已殺死 [root@reddhat6_155_200 ~]# ll -h /mnt/tmpfs/test #查看大小只有
255M -rw-r--r--. 1 root root 255M 2019-09-07 22:03 /mnt/tmpfs/test

四、磁盤IO限制  #使用IO限制時當前系統調度算法必須為cfq算法

[root@reddhat6_155_200 ~]# cat /sys/block/vda/queue/scheduler #查看下當前系統磁盤調度算法 vda表示磁盤名稱 noop anticipatory deadline [cfq] [root@reddhat6_155_200 ~]# cat /cgroup/blkio/blkio.weight #查看磁盤io權重默認值 1000 [root@reddhat6_155_200 ~]# vim /etc/cgconfig.conf #創建io限制規則 group lowio{ blkio{ blkio.weight=100; #設置io優先級 一個低 一個高 } } group highio{ blkio{ blkio.weight=200; } } group ddio{ blkio{ blkio.throttle.read_bps_device="252:0 1000000"; 
#限制程序讀取磁盤的速度 252表示當前主盤符號 0表示副盤符號 1000000表示讀取速率 單位為字節 即1M 需要注意的是,如果是物理設備 SCSI設備重啟后主副盤符會發生變化 可以通過設置邏輯卷 } } [root@reddhat6_155_200
~]# /etc/init.d/cgconfig restart Stopping cgconfig service: [確定] Starting cgconfig service: [確定]

測試

[root@reddhat6_155_200 ~]# dd if=/dev/zero of=/root/bigfile1 bs=1M count=10000 #創建兩個大的文件用於實驗 [root@reddhat6_155_200 ~]# dd if=/dev/zero of=/root/bigfile2 bs=1M count=10000 [root@reddhat6_155_200 ~]# echo 3 > /proc/sys/vm/drop_caches #情況緩存 避免影響結果 [root@reddhat6_155_200 ~]# iotop       #使用iotop命令監控io狀態

新開兩個窗口,分別使用lowio和highio

[root@reddhat6_155_200 ~]# cgexec -g blkio:lowio time cat /root/bigfile1 > /dev/null [root@reddhat6_155_200 ~]# cgexec -g blkio:highio time cat /root/bigfile2 > /dev/null

結果:當兩個cat命令都讀取時,使用highio磁盤速度大約是lowio的兩倍

當highio執行完成后lowio開始獨占磁盤io

[root@reddhat6_155_200 ~]# cgexec -g blkio:lowio time cat /root/bigfile1 > /dev/null 
0.08user 7.52system 0:40.54elapsed 18%CPU (0avgtext+0avgdata 2416maxresident)k 20480360inputs+0outputs (1major+182minor)pagefaults 0swaps [root@reddhat6_155_200 ~]# cgexec -g blkio:highio time cat /root/bigfile2 > /dev/null
0.08user 7.16system 0:32.64elapsed 22%CPU (0avgtext+0avgdata 2432maxresident)k 20480072inputs+0outputs (1major+183minor)pagefaults 0swaps

限制指定用戶執行指定命令

[root@reddhat6_155_200 ~]# vim /etc/cgrules.conf admin:dd blkio ddio/        #此行配置表示 admin用戶執行dd命令時 使用 blkio子系統下ddio group進行限制  此處不僅可以現在命令也可以現在程序 添加程序的啟動命令即可 例 nginx java等 [root@reddhat6_155_200 ~]# /etc/init.d/cgred restart 正在停止 CGroup Rules Engine 守護進程...... [確定] Starting CGroup Rules Engine Daemon: [確定]

使用root用戶測試dd命令

[root@reddhat6_155_200 ~]# dd if=/tmp/bigfile1 of=/dev/null 記錄了20480000+0 的讀入 記錄了20480000+0 的寫出 10485760000字節(10 GB)已復制,18.5243 秒,566 MB/秒  #速度正常

切換至admin用戶執行dd命令

[root@reddhat6_155_200 ~]# mv /root/bigfile1 /tmp/ [root@reddhat6_155_200 ~]# su - admin [admin@reddhat6_155_200 ~]$ dd if=/tmp/bigfile1 of=/dev/null 

新開一個窗口,使用iotop命令監控

[admin@reddhat6_155_200 ~]$ dd if=/tmp/bigfile1 of=/dev/null 記錄了210657+0 的讀入 記錄了210656+0 的寫出 107855872字節(108 MB)已復制,107.986 秒,999 kB/秒  #注意此處的速率 時間是因為我提前中斷了程序

我們發現,無論怎樣,IO讀取不會大於1M

注意事項:

1 磁盤IO調度算法必須為cfq 2 測試前需要先清空磁盤緩存 3 不要使用SSD硬盤 4 讀取速率注意SCSI物理硬盤盤符會隨機更改

五、創建兩個及以上資源控制子系統(默認每種資源只能單獨控制)

1.修改配置文件,配置一個多控制項的子系統

[root@reddhat6_155_200 ~]# vim /etc/cgconfig.conf mount { cpuset = /cgroup/cpuset; # cpu = /cgroup/cpu; #以CPU內存為例,注釋cpu、memory字段 cpuacct = /cgroup/cpuacct; # memory = /cgroup/memory; cpu = /cgroup/cpumem; #新添加cpu、memory字段將其路徑指向同一路徑 memory = /cgroup/cpumem; devices = /cgroup/devices; freezer = /cgroup/freezer; net_cls = /cgroup/net_cls; blkio = /cgroup/blkio; }

2.重啟服務(注意:重啟時需要退出/cgroup目錄,否則會重啟失敗)

[root@reddhat6_155_200 ~]# /etc/init.d/cgconfig restart Stopping cgconfig service: [確定] Starting cgconfig service: [確定]

3.檢查目錄

[root@reddhat6_155_200 ~]# ll /cgroup/ 總用量 8 drwxr-xr-x. 2 root root    0 2019-09-07 15:07 blkio drwxr-xr-x. 2 root root 4096 2019-08-30 17:24 cpu drwxr-xr-x. 2 root root    0 2019-09-07 15:07 cpuacct drwxr-xr-x. 2 root root    0 2019-09-07 15:07 cpumem #我們自定義的  drwxr-xr-x. 2 root root    0 2019-09-07 15:07 cpuset drwxr-xr-x. 2 root root    0 2019-09-07 15:07 devices drwxr-xr-x. 3 root root    0 2019-09-07 15:07 freezer drwxr-xr-x. 2 root root 4096 2019-08-30 17:24 memory drwxr-xr-x. 2 root root    0 2019-09-07 15:07 net_cls [root@reddhat6_155_200 ~]# ll /cgroup/cpu #原先的cpu及memory已經失效了 總用量 0 [root@reddhat6_155_200 ~]# ll /cgroup/memory/ 總用量 0 [root@reddhat6_155_200 ~]# ll /cgroup/cpumem/ #所有mem和cpu配置都在cpumem目錄下 總用量 0
--w--w--w-. 1 root root 0 2019-09-07 15:07 cgroup.event_control -rw-r--r--. 1 root root 0 2019-09-07 15:07 cgroup.procs -rw-r--r--. 1 root root 0 2019-09-07 15:07 cpu.cfs_period_us -rw-r--r--. 1 root root 0 2019-09-07 15:07 cpu.cfs_quota_us -rw-r--r--. 1 root root 0 2019-09-07 15:07 cpu.rt_period_us -rw-r--r--. 1 root root 0 2019-09-07 15:07 cpu.rt_runtime_us -rw-r--r--. 1 root root 0 2019-09-07 15:07 cpu.shares -r--r--r--. 1 root root 0 2019-09-07 15:07 cpu.stat -rw-r--r--. 1 root root 0 2019-09-07 15:07 memory.failcnt --w-------. 1 root root 0 2019-09-07 15:07 memory.force_empty ......

參考文檔:https://access.redhat.com/documentation/zh-cn/red_hat_enterprise_linux/6/html/resource_management_guide/sec-moving_a_process_to_a_control_group#The_cgred_Daemon


免責聲明!

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



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