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 掛起進程,恢復執行進程。
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 是一個守護進程,它可根據在 /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
[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
[root@reddhat6_155_200 ~]# vim /etc/cgconfig.conf #添加如下兩段 group lesscpu{ cpu{ } } group morecpu{ 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
[root@reddhat6_155_200 ~]# ll /cgroup/cpu 仔細觀察能夠發現每一個目錄中的文件都是相同的,也就是默認狀況下group會繼承該子系統的全部規則 [root@reddhat6_155_200 ~]# ll /cgroup/cpu/morecpu/ [root@reddhat6_155_200 ~]# ll /cgroup/cpu/morecpu/
[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
[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
[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
[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
[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,具體大小和系統剩餘內存大小有關
[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
[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
[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物理硬盤盤符會隨機更改
[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; }
[root@reddhat6_155_200 ~]# /etc/init.d/cgconfig restart Stopping cgconfig service: [肯定] Starting cgconfig service: [肯定]
[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 ......