centos6 cgroup及cgred簡介和簡單使用

1、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將規則應用到進程之上html

2、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
 200java

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使用率linux

lesscpu結果:nginx

[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

 3、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

4、磁盤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和highiovim

[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

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

[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命令less

[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物理硬盤盤符會隨機更改

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

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

相關文章
相關標籤/搜索