前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Linux利用Cgroup资源控制

Linux利用Cgroup资源控制

作者头像
GreatSQL社区
发布2023-02-23 11:02:30
8960
发布2023-02-23 11:02:30
举报

* GreatSQL社区原创内容未经授权不得随意使用,转载请联系小编并注明来源。

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

代码语言:javascript
复制
mount -t cgroup 可以查看当前已经挂载的子系统

任务(task)- 每个cgroup都会有一个task列表文件tasks,一个task就对应一个进程。

cpu子系统

cgroups的创建很简单,只需要在相应的子系统下创建目录即可。下面我们到 cpu 子系统下创建测试文件夹:

1.创建cpu系统的cgroup

代码语言:javascript
复制
/sys/fs/cgroup/cpu/ctest

执行完成创建就可以看到

代码语言:javascript
复制
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

查看当前进程

代码语言:javascript
复制
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 中

代码语言:javascript
复制
echo $$ > tasks

查看task 会将当前bash 进行与所有子进程都放入tasks 中

代码语言:javascript
复制
root@moyu20:/sys/fs/cgroup/cpu/ctest# cat tasks 
1273114
1306199

3.验证

制作一个耗时cpu 的进程

代码语言:javascript
复制
while true;do echo;done;

查看监控可以非常容易发现 cpu 跑满了一个cpu

代码语言:javascript
复制
╰─○ 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

代码语言:javascript
复制
echo 25000 > cpu.cfs_quota_us 
while true;do echo;done;

再查看监控

代码语言:javascript
复制
╰─○ 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

代码语言:javascript
复制
╭─root@moyu20 /sys/fs/cgroup/cpu 
╰─# cgdelete cpu:ctest   

cgroup在Docker 中的使用

Docker 是目前常用容器,它就依赖cgroup 对资源进行限制

创建一个centos7 分配0.25 个cpu 与1g 内存

代码语言:javascript
复制
docker run  -itd  --name test7 -m 1g  --cpus 0.25  centos:7 bash

可以看到

代码语言:javascript
复制
╰─○ docker inspect test7|more
[
    {
        "Id": "7d1d6b1865094f5e357f89f615dcdf57ce50954f6299d8a7aea41b4ca0cc73c8",
        "Created": "2022-07-28T09:29:30.247354976Z",

在宿主机上可以看到Docker 创建了容器相关的 cpu 的cgroup

代码语言:javascript
复制
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 中

代码语言:javascript
复制
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 的实际值并不准确

代码语言:javascript
复制
[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/1/cgroup 进行判断

代码语言:javascript
复制
[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 中了。

Enjoy GreatSQL :)


《深入浅出MGR》视频课程

戳此小程序即可直达B站

https://www.bilibili.com/medialist/play/1363850082?business=space_collection&business_id=343928


文章推荐:


关于 GreatSQL

GreatSQL是由万里数据库维护的MySQL分支,专注于提升MGR可靠性及性能,支持InnoDB并行查询特性,是适用于金融级应用的MySQL分支版本。

GreatSQL社区官网: https://greatsql.cn/

Gitee: https://gitee.com/GreatSQL/GreatSQL

GitHub: https://github.com/GreatSQL/GreatSQL

Bilibili:

https://space.bilibili.com/1363850082/video

本文参与?腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2022-08-26,如有侵权请联系?cloudcommunity@tencent.com 删除

本文分享自 GreatSQL社区 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与?腾讯云自媒体分享计划? ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 什么是cgroups
  • cpu子系统
    • 1.创建cpu系统的cgroup
      • 2.创建进程加入cgroup
        • 3.验证
          • 4.移除cgroup
            • cgroup在Docker 中的使用
            相关产品与服务
            容器镜像服务
            容器镜像服务(Tencent Container Registry,TCR)为您提供安全独享、高性能的容器镜像托管分发服务。您可同时在全球多个地域创建独享实例,以实现容器镜像的就近拉取,降低拉取时间,节约带宽成本。TCR 提供细颗粒度的权限管理及访问控制,保障您的数据安全。
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
            http://www.vxiaotou.com