GreatSQL社區原創內容未經授權不得隨意使用,轉載請聯繫小編並註明來源。 GreatSQL是MySQL的國產分支版本,使用上與MySQL一致。 cgroups 是Linux內核提供的可以限制進程所使用資源的機制,可以對 cpu,記憶體等資源實現精細化的控制. 什麼是cgroups 控制族群(cgr ...
- GreatSQL社區原創內容未經授權不得隨意使用,轉載請聯繫小編並註明來源。
- GreatSQL是MySQL的國產分支版本,使用上與MySQL一致。
cgroups 是Linux內核提供的可以限制進程所使用資源的機制,可以對 cpu,記憶體等資源實現精細化的控制.
什麼是cgroups
-
控制族群(cgroup) - 關聯一組task和一組subsystem的配置參數。一個task對應一個進程, cgroup是資源分片的最小單位。
-
子系統(subsystem) - 資源管理器,一個subsystem對應一項資源的管理,如 cpu, cpuset, memory等
- cpu 子系統,主要限制 cpu 使用率。
- cpuacct 子系統,可以統計 cgroups 中的進程的 cpu 使用報告。
- cpuset 子系統,可以為 cgroups 中的進程分配單獨的 cpu 節點或者記憶體節點。
- memory 子系統,可以限制進程的 memory 使用量。
- blkio 子系統,可以限制進程的塊設備 io。
- devices 子系統,可以控制進程能夠訪問某些設備。
- net_cls 子系統,可以標記 cgroups 中進程的網路數據包,然後可以使用 tc 模塊(traffic control)對數據包進行控制。
- freezer 子系統,可以掛起或者恢復 cgroups 中的進程。
- ns 子系統,可以使不同 cgroups 下麵的進程使用不同的 namespace。
-
層級(hierarchy) - 關聯一個到多個subsystem和一組樹形結構的cgroup. 和cgroup不同,hierarchy包含的是可管理的subsystem
mount -t cgroup 可以查看當前已經掛載的子系統
-
任務(task)- 每個cgroup都會有一個task列表文件tasks,一個task就對應一個進程。
cpu 子系統
cgroups的創建很簡單,只需要在相應的子系統下創建目錄即可。下麵我們到 cpu 子系統下創建測試文件夾:
1.創建cpu 系統的cgroup
/sys/fs/cgroup/cpu/ctest
執行完成創建就可以看到
root@moyu20:/sys/fs/cgroup/cpu/ctest# ls -l
總用量 0
-rw-r--r-- 1 root root 0 7月 29 15:25 cgroup.clone_children
-rw-r--r-- 1 root root 0 7月 29 15:25 cgroup.procs
-r--r--r-- 1 root root 0 7月 29 15:25 cpuacct.stat
-rw-r--r-- 1 root root 0 7月 29 15:25 cpuacct.usage
-r--r--r-- 1 root root 0 7月 29 15:25 cpuacct.usage_all
-r--r--r-- 1 root root 0 7月 29 15:25 cpuacct.usage_percpu
-r--r--r-- 1 root root 0 7月 29 15:25 cpuacct.usage_percpu_sys
-r--r--r-- 1 root root 0 7月 29 15:25 cpuacct.usage_percpu_user
-r--r--r-- 1 root root 0 7月 29 15:25 cpuacct.usage_sys
-r--r--r-- 1 root root 0 7月 29 15:25 cpuacct.usage_user
-rw-r--r-- 1 root root 0 7月 29 15:25 cpu.cfs_period_us
-rw-r--r-- 1 root root 0 7月 29 15:25 cpu.cfs_quota_us
-rw-r--r-- 1 root root 0 7月 29 15:25 cpu.shares
-r--r--r-- 1 root root 0 7月 29 15:25 cpu.stat
-rw-r--r-- 1 root root 0 7月 29 15:25 cpu.uclamp.max
-rw-r--r-- 1 root root 0 7月 29 15:25 cpu.uclamp.min
-rw-r--r-- 1 root root 0 7月 29 15:25 notify_on_release
-rw-r--r-- 1 root root 0 7月 29 15:25 tasks
已經把cpu子系統 對應控制文件創建好了
2.創建進程加入cgroup
查看當前進程
root@moyu20:/sys/fs/cgroup/cpu/ctest# echo $$
1273114
root@moyu20:/sys/fs/cgroup/cpu/ctest# ps -aux|grep 1273114
root 1273114 0.0 0.0 13988 4944 pts/4 S 15:10 0:00 bash
root 1304325 0.0 0.0 12132 2512 pts/4 S+ 15:35 0:00 grep --color=auto 1273114
將進程號添加到 tasks 中
echo $$ > tasks
查看task 會將當前bash 進行與所有子進程都放入tasks 中
root@moyu20:/sys/fs/cgroup/cpu/ctest# cat tasks
1273114
1306199
3 驗證
製作一個耗時cpu 的進程
while true;do echo;done;
查看監控可以非常容易發現 cpu 跑滿了一個cpu
╰─○ top -p 1273114
top - 15:40:21 up 23 days, 5:12, 1 user, load average: 1.71, 1.36, 1.23
任務: 1 total, 1 running, 0 sleeping, 0 stopped, 0 zombie
%Cpu(s): 12.7 us, 12.0 sy, 0.0 ni, 75.2 id, 0.1 wa, 0.0 hi, 0.0 si, 0.0 st
MiB Mem : 15605.0 total, 971.2 free, 12135.4 used, 2498.4 buff/cache
MiB Swap: 15718.7 total, 1156.2 free, 14562.5 used. 2939.0 avail Mem
進程號 USER PR NI VIRT RES SHR %CPU %MEM TIME+ COMMAND
1273114 root 20 0 13988 4944 3396 R 100.0 0.0 0:29.73 bash
cgoups 利用 cpu.cfs_quota_us 與cfs_period_us 限制cpu 的頻率分配, 分配為 cfs_quota_us / cfs_period_us
限制分配0.25 個cpu
echo 25000 > cpu.cfs_quota_us
while true;do echo;done;
再查看監控
╰─○ top -p 1273114
top - 15:45:43 up 23 days, 5:17, 1 user, load average: 1.28, 1.51, 1.36
任務: 1 total, 1 running, 0 sleeping, 0 stopped, 0 zombie
%Cpu(s): 7.1 us, 3.9 sy, 0.0 ni, 89.0 id, 0.1 wa, 0.0 hi, 0.0 si, 0.0 st
MiB Mem : 15605.0 total, 209.3 free, 11560.7 used, 3835.0 buff/cache
MiB Swap: 15718.7 total, 953.0 free, 14765.7 used. 3522.6 avail Mem
進程號 USER PR NI VIRT RES SHR %CPU %MEM TIME+ COMMAND
1273114 root 20 0 13988 4944 3396 R 25.0 0.0 1:24.41 bash
可以非常明顯看到了進程被限制最大使用 25% 了
同理可以創建 memory , blkio 等cgroup 用於限制系統資源
4.移除cgroup
退出tasks
╭─root@moyu20 /sys/fs/cgroup/cpu
╰─# cgdelete cpu:ctest
5.cgroup 在Docker 中的使用
docker 是目前常用容器,它就依賴cgroup 對資源進行限制
創建一個centos7 分配0.25 個cpu 與1g 記憶體
docker run -itd --name test7 -m 1g --cpus 0.25 centos:7 bash
可以到
╰─○ docker inspect test7|more
[
{
"Id": "7d1d6b1865094f5e357f89f615dcdf57ce50954f6299d8a7aea41b4ca0cc73c8",
"Created": "2022-07-28T09:29:30.247354976Z",
在宿主機上可以看到Docker 創建了容器相關的 cpu 的cgroup
root@moyu20:/sys/fs/cgroup/cpu/docker/7d1d6b1865094f5e357f89f615dcdf57ce50954f6299d8a7aea41b4ca0cc73c8$ ls
cgroup.clone_children cpuacct.usage cpuacct.usage_percpu_sys cpuacct.usage_user cpu.shares cpu.uclamp.min
cgroup.procs cpuacct.usage_all cpuacct.usage_percpu_user cpu.cfs_period_us cpu.stat notify_on_release
cpuacct.stat cpuacct.usage_percpu cpuacct.usage_sys cpu.cfs_quota_us cpu.uclamp.max tasks
root@moyu20:/sys/fs/cgroup/cpu/docker/7d1d6b1865094f5e357f89f615dcdf57ce50954f6299d8a7aea41b4ca0cc73c8$ cat cpu.cfs_quota_us
25000
進入容器在Docker 中
docker exec -it test7 bash
可以看到相同的目錄已經被 mount 到 /sys/fs/cgroup/cpu 下了
[root@7d1d6b186509 ~]# cat /sys/fs/cgroup/cpu/cpu.cfs_quota_us
25000
類似 top, free 等命令查看 /proc/ 目錄都是宿主機的信息
就會導致 free 的實際值並不准確
[root@7d1d6b186509 cpu]# while true;do echo;done;
[root@7d1d6b186509 cpu]# free -g
total used free shared buff/cache available
Mem: 15 10 0 0 3 3
Swap: 15 14 0
[root@7d1d6b186509 /]# top
top - 08:03:26 up 23 days, 5:35, 0 users, load average: 2.73, 1.83, 1.54
Tasks: 4 total, 1 running, 3 sleeping, 0 stopped, 0 zombie
%Cpu(s): 11.6 us, 2.2 sy, 0.0 ni, 86.0 id, 0.2 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 15979492 total, 392728 free, 11511792 used, 4074972 buff/cache
KiB Swap: 16095996 total, 1042540 free, 15053456 used. 3935784 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1 root 20 0 11844 292 16 S 0.0 0.0 0:00.02 bash
34 root 20 0 11820 2920 2516 S 0.0 0.0 0:19.85 bash
55 root 20 0 11844 2968 2556 S 0.0 0.0 0:00.02 bash
72 root 20 0 56212 3732 3176 R 0.0 0.0 0:00.00 top
實際已經將分配的資源使用完了,但是在容器內這些命令並不能顯示正確的結果,實際顯示的宿主系統的資源使用情況,會對使用的情況產生誤導,需要註意
判斷進程是否屬於cgroup 可以通過 /proc/
[root@7d1d6b186509 ~]# cat /proc/1/cgroup
13:hugetlb:/docker/7d1d6b1865094f5e357f89f615dcdf57ce50954f6299d8a7aea41b4ca0cc73c8
12:net_cls,net_prio:/docker/7d1d6b1865094f5e357f89f615dcdf57ce50954f6299d8a7aea41b4ca0cc73c8
11:freezer:/docker/7d1d6b1865094f5e357f89f615dcdf57ce50954f6299d8a7aea41b4ca0cc73c8
10:cpuset:/docker/7d1d6b1865094f5e357f89f615dcdf57ce50954f6299d8a7aea41b4ca0cc73c8
9:devices:/docker/7d1d6b1865094f5e357f89f615dcdf57ce50954f6299d8a7aea41b4ca0cc73c8
8:rdma:/docker/7d1d6b1865094f5e357f89f615dcdf57ce50954f6299d8a7aea41b4ca0cc73c8
7:memory:/docker/7d1d6b1865094f5e357f89f615dcdf57ce50954f6299d8a7aea41b4ca0cc73c8
6:misc:/
5:pids:/docker/7d1d6b1865094f5e357f89f615dcdf57ce50954f6299d8a7aea41b4ca0cc73c8
4:blkio:/docker/7d1d6b1865094f5e357f89f615dcdf57ce50954f6299d8a7aea41b4ca0cc73c8
3:perf_event:/docker/7d1d6b1865094f5e357f89f615dcdf57ce50954f6299d8a7aea41b4ca0cc73c8
2:cpu,cpuacct:/docker/7d1d6b1865094f5e357f89f615dcdf57ce50954f6299d8a7aea41b4ca0cc73c8
1:name=systemd:/docker/7d1d6b1865094f5e357f89f615dcdf57ce50954f6299d8a7aea41b4ca0cc73c8
0::/docker/7d1d6b1865094f5e357f89f615dcdf57ce50954f6299d8a7aea41b4ca0cc73c8
可以明顯看到這個進程被分配到docker 下的cgroup 中了
關於 GreatSQL
GreatSQL是由萬里資料庫維護的MySQL分支,專註於提升MGR可靠性及性能,支持InnoDB並行查詢特性,是適用於金融級應用的MySQL分支版本。
GreatSQL社區 Gitee GitHub Bilibili
技術交流群:
微信:掃碼添加
GreatSQL社區助手
微信好友,發送驗證信息加群
。