乐趣区

关于mysql:linux-利用cgroup-资源控制

  • GreatSQL 社区原创内容未经受权不得随便应用,转载请分割小编并注明起源。
  • GreatSQL 是 MySQL 的国产分支版本,应用上与 MySQL 统一。

cgroups 是 Linux 内核提供的能够限度过程所应用资源的机制,能够对 cpu,内存等资源实现精细化的管制.

什么是 cgroups

  • 管制族群(cgroup) – 关联一组 task 和一组 subsystem 的配置参数。一个 task 对应一个过程, cgroup 是资源分片的最小单位。
  • 子系统(subsystem) – 资源管理器,一个 subsystem 对应一项资源的治理,如 cpu, cpuset, memory 等

    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. freezer 子系统,能够挂起或者复原 cgroups 中的过程。
    9. 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/<pid>/cgroup 进行判断

[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

https://greatsql.cn/

技术交换群:

微信:扫码增加 GreatSQL 社区助手 微信好友,发送验证信息 加群

退出移动版