0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Linux技术中Cgroup的原理和实践

454398 来源:博客园 作者:遥望那云端 2020-10-15 14:04 次阅读

一、什么是Cgroup,使用场景?

容器本质上是进程,既然是进程就会消耗掉系统资源,比如:CPU、内存、磁盘、网络带宽等,如果不加以限制,容器在某些情况下就会无限制地吃掉宿主机的系统资源,显然这不是我们期望发生的,另外当我们的环境中运行了很多容器,且系统资源一定的情况下,我们有优先保证主要容器应用的需求,如何既能够解决此问题同时又能够满足我们的需求呢?答案就是:Linux Cgroup(全程Linux Control Group),在前面的文章中,介绍了namespace为容器这类进程提供了隔离,而Cgroup可以为容器这类进程提供资源使用上限,两者黄金搭档,共同为容器应用保驾护航。

二、Cgroup的原理和实践

CPU的周期控制

Cgroup可以为容器进程使用的CPU、内存、磁盘、网络带宽资源进行限制,具体是如何实现的呢?接下来我们一起来实操下,在 Linux 中,Cgroups 给用户暴露出来的操作接口是文件系统,即它以文件和目录的方式组织在操作系统的 /sys/fs/cgroup 这个路径下,我们先去此目录查看下

[root@k8s-master /]# cd sys/fs/cgroup/ [root@k8s-master cgroup]# ls blkio cpuacct cpuset freezer memory net_cls,net_prio perf_event rdma cpu cpu,cpuacct devices hugetlb net_cls net_prio pids systemd

可以看到在cgroup的这个目录下存在很多子目录,这些都是cgroup可以限制地资源种类,我们在进一步进入到CPU的子目录查看下,里面有限制资源种类的详细的限制地指标,比如

1、cpu.cfs_period_us:指定容器对CPU的使用多长时间重新做一次分配

2、cpu.cfs_quota_us:指在cpu.cfs_period_us周期内给分配多少时间给容器

这两个指标需要一起配合使用来实现CPU的周期控制,我们先手动模拟容器创建的时候,如何完成利用cgroup来实现资源限制,以CPU周期控制为例子,先在/sys/fs/cgroup/cpu目录下创建1个container_

test的目录,如下所示我已经创建好(红色字体)。

[![复制代码](https://common.cnblogs.com/images/copycode.gif)](javascript:void(0); “复制代码”)

[root@k8s-master cgroup]# cd cpu [root@k8s-master cpu]# ls cgroup.clone_children cpuacct.usage_all cpu.cfs_period_us docker cgroup.procs cpuacct.usage_percpu cpu.cfs_quota_us kubepods cgroup.sane_behavior cpuacct.usage_percpu_sys cpu.rt_period_us notify_on_release container_test cpuacct.usage_percpu_user cpu.rt_runtime_us release_agent cpuacct.stat cpuacct.usage_sys cpu.shares system.slice cpuacct.usage cpuacct.usage_user cpu.stat tasks

[![复制代码](https://common.cnblogs.com/images/copycode.gif)](javascript:void(0); “复制代码”)

然后进入到此目录下,ls查看下,这里出现了一个神奇的形象,此目录下自动生成了很多CPU子系统控制的指标,这些指标我们并未进行新增,也就是说在/sys/fs/cgroup/cpu目录下会给新建的目默认配置CPU子系统资源限制的指标

[![复制代码](https://common.cnblogs.com/images/copycode.gif)](javascript:void(0); “复制代码”)

[root@k8s-master cpu]# cd container_test/ [root@k8s-master container_test]# ls cgroup.clone_children cpuacct.usage_percpu cpu.cfs_period_us cpu.stat cgroup.procs cpuacct.usage_percpu_sys cpu.cfs_quota_us notify_on_release cpuacct.stat cpuacct.usage_percpu_user cpu.rt_period_us tasks cpuacct.usage cpuacct.usage_sys cpu.rt_runtime_us cpuacct.usage_all cpuacct.usage_user cpu.shares

[![复制代码](https://common.cnblogs.com/images/copycode.gif)](javascript:void(0); “复制代码”)

这些指标如何作用呢?为了体现资源的使用情况,我们先写一个程序来模拟来吃掉系统资源的情况,然后再来查看指标

[root@k8s-master sh]# cat while.sh #!/bin/bash while : ; do : ; done &

[root@k8s-master sh]# sh while.sh

通过如上程序,写了一个while无限循环的shell脚本,默认情况下,这个程序之后的进程会占据掉系统所剩集群的所有资源,可通过top命令查看下

[root@k8s-master sh]# ps -ef |grep while root 14975 1 97 20:29 pts/1 00:02:48 sh while.sh

如上图所示,while循环的进程占据掉了96.3%的CPU资源,在实际的应用中若进程这样无限制的使用资源,将会给操作系统带来很大的负担,那么如何控制进程资源的使用呢?回到我们之前创建在container_test目录下

[root@k8s-master container_test]# cat cpu.cfs_quota_us -1 [root@k8s-master container_test]# cat cpu.cfs_period_us 100000

默认创建的目录下cfs_quota_us 若为-1,则表示还未启用quota,即还未实行资源限制,cfs_period_us默认为100000us=100ms=0.1s(秒),接下来我们向cpu.cfs_quota_us 输入30ms=30000us,cfs_period_us值维持不变还是为100ms,在前面关于这2个概念有介绍,cpu.cfs_quota_us表示的是cfs_period_us的周期内,分配30/100的时间,即30%,接下来验证下

[root@k8s-master container_test]# echo 30000 》 /sys/fs/cgroup/cpu/container_test/cpu.cfs_quota_us

[root@k8s-master container_test]# cat cpu.cfs_quota_us

30000

设置已完成,但是此时还不会立即生效,还需要将进程ID输入到资源限制地task里

[root@k8s-master container_test]# echo 14975 》 /sys/fs/cgroup/cpu/container_test/tasks

接下来我们在通过top查看下资源使用情况,如下图所示,可以看到CPU的资源使用上限由原来的96.3%已经降到29.9%了,表明此while进程的CPU的资源使用上限已经设置成功。

以上整个过程为手动设置模拟容器创建的过程中CPU份额控制的过程,实际上在容器创建的过程中,并不需要上面这般步骤,我们只需要在run容器的时候指定指标参数即可,如下所示

[root@k8s-master container_test]# docker run -it -d --cpu-period=100000 --cpu-quota=30000 nginx /bin/bash

上面的命令是后台守护进程的方式运行了1个nginx的容器,且指定CPU的每隔100000us=100ms做一次分配,且每次分配给容器的时间为30ms,可以看到这个分配和前面手动分配是一致的,值得注意的是这里需要加上-d来创建容器,若不加上的话会进入到终端交互界面,一旦提出终端交互界面后,容器这个进程也将会退出,而我们希望容器进程保持后台运行,因此需要加上-d,容器运行成功后,将会在docker目录下新建一个以容器ID命名的目录,这个目录和前面手动创建的目录以上,系统会默认配置资源限制的参数,我们可以如下看下:

[root@k8s-master container_test]# docker run -it -d --cpu-period=100000 --cpu-quota=30000 nginx /bin/bash 16f51f6780685be9c83b1684515005f30aed91916fdd6573b28eaf56be201e4a

[![复制代码](https://common.cnblogs.com/images/copycode.gif)](javascript:void(0); “复制代码”)

[root@k8s-master docker]# ls 01a0fd62d2110e54b0c3635b2897e7c18e6b78f026fa57b4214d7662dd3b38ba cpuacct.usage_sys 16f51f6780685be9c83b1684515005f30aed91916fdd6573b28eaf56be201e4a cpuacct.usage_user cgroup.clone_children cpu.cfs_period_us cgroup.procs cpu.cfs_quota_us cpuacct.stat cpu.rt_period_us cpuacct.usage cpu.rt_runtime_us cpuacct.usage_all cpu.shares cpuacct.usage_percpu cpu.stat cpuacct.usage_percpu_sys notify_on_release cpuacct.usage_percpu_user tasks

[![复制代码](https://common.cnblogs.com/images/copycode.gif)](javascript:void(0); “复制代码”)

如上红色部分为docker目录下依据容器的名称默认创建的目录,我们进入到这个目录,然后输出下之前我们在创建的时候指定的cpu.cfs_quota_us和cfs_period_us值

[root@k8s-master 16f51f6780685be9c83b1684515005f30aed91916fdd6573b28eaf56be201e4a]# cat cpu.cfs_period_us 100000

[root@k8s-master 16f51f6780685be9c83b1684515005f30aed91916fdd6573b28eaf56be201e4a]# cat cpu.cfs_quota_us 30000

可以看到我们之前设置的值已经生效了,也就是说这个nginx的容器最多可以支持使用到30%左右的CPU带宽。

相类似的我们可以对容器获取CPU的资源的优先级进行设置,通过--cpu-share这个参数,其指定的值并非是给容器具体的份额,其实是个权重,在需要对容器资源进行限制时才会生效,权重大的,可以优先得到CPU的资源;另外还可以对使用的核数进行限制,针对多核的服务器,可以控制容器运行限定使用哪些CPU内核和内存节点,即使用-cpuset-cpus和-cpuset-mens参数,比如:我们可以指定创建的容器只能用0、1、2三核。

三、总结

本文以CPU中周期控制限制某进程的CPU资源使用为例子,介绍了其手动设置参数和容器自动设置参数,每新建1个容器,在/sys/fs/cgroup/cpu/docker目录下都会自动以容器的ID为名字创建1个目录,且在此目录下支持对CPU、内存、网络带宽、磁盘的资源使用进行限制,而其限制地处理与CPU的周期控制是类似的,这里就未做过多介绍
编辑:hfy

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • cpu
    cpu
    +关注

    关注

    68

    文章

    10442

    浏览量

    206547
  • Linux
    +关注

    关注

    87

    文章

    10990

    浏览量

    206733
  • 容器
    +关注

    关注

    0

    文章

    481

    浏览量

    21876
收藏 人收藏

    评论

    相关推荐

    Linux的dmesg命令介绍

    命令简介dmesg 命令用于显示系统开机信息,可用于诊断系统故障。 内核会将系统开机信息存储在ring buffer,可以使用dmesg命令来查看,开机信息保存在/var/log/dmesg文件
    发表于 04-08 08:20

    【书籍评测活动NO.31】大语言模型:原理与工程实践

    深远影响,尤其在优化业务流程和重塑组织结构方面。然而,在研究和实践过程,我们遇到了一个主要挑战:市场上缺乏大语言模型在实际应用方面的资料。现有的资料多聚焦于理论研究,而具体的实践方法多被保密,难以获得
    发表于 03-18 15:49

    WLAN射频技术理论和实践练习

    电子发烧友网站提供《WLAN射频技术理论和实践练习.ppt》资料免费下载
    发表于 11-18 09:55 0次下载
    WLAN射频<b class='flag-5'>技术</b>理论和<b class='flag-5'>实践</b>练习

    电子系统的噪声抑制与衰减技术

    内容简介随着电路在通信、计算机、自动化以及其他方面的广泛应用,电磁干扰已经成为电路设计师所要面对的一个重要问题。包括电路噪声抑制技术实践应用的方方面面。涵盖了两种基本的噪声控制方法:屏蔽和接地
    发表于 09-25 08:13

    基于树莓派的嵌入式Linux开发教学

    树莓派对于全球嵌入式 Linux 开发及教育已经并将继续带来广泛的影响,及早将之引入我国主流的嵌入式开发与教学环境或将是有益的。尽管传统的 “ARM 开发板硬件设计 +Linux 移植裁剪
    发表于 09-21 07:09

    如何判断是否在docker镜像

    实战首先需要判断服务器是否为docker环境。常用的判断方法有两种。 1、通过执行 ls -alh /.dockerenv是否存在.dockerenv文件 docker环境下存在该文件 非
    发表于 09-20 07:42

    《SoC底层软件低功耗系统设计与实现》基于Linux专门讲解软件低功耗框架和设计的书籍

    Linux的某个模块的实现那么就能理论结合实践,这才是好的技术书籍的叙述方式。现在有点过于为了讲解代码而讲解代码了。然而大部分人看了贴出的代码根本学不到什么,能看懂这些代码的直接去
    发表于 09-08 23:38

    尖端AR技术如何在美国革新外科手术实践

    ,Vuzix开始了深入探索,最终于近期发布了一份综合报告。该报告深入探讨了美国外科医生对在其临床实践中采用AR智能眼镜的意愿,通过对全美 500 多名外科医生的调查,结果表明,这些技术精湛的专业人士非常希望
    发表于 09-05 09:57

    让新手如何更快速地学习Linux技术

    如果你此时还在纠结于如何快速地入门Linux系统,不妨先再思考下自己为什么想要学习Linux技术,是对它感兴趣?还是想要获得高薪?
    的头像 发表于 08-28 15:57 229次阅读
    让新手如何更快速地学习<b class='flag-5'>Linux</b><b class='flag-5'>技术</b>

    移动云操作系统改造技术实践分享

    近年来,Linux 操作系统在技术、社区和商业化方案均取得了快速发展,移动云先后发布了新一代天元操作系统和易行迁移工具,保障了移动云全场景业务高效迁移。在移动云 CentOS 迁移实践过程中
    发表于 08-10 17:29 358次阅读
    移动云操作系统改造<b class='flag-5'>技术</b><b class='flag-5'>实践</b>分享

    【触觉智能 Purple Pi OH 开发板体验】触觉智能PurplePiOH 3566 OpenHarmony3.2R 64位运行docker 18.03.1

    , 在此感谢相关开发者。 1.环境信息 1.PurplePiOH 3566(3.2Release) 2.sd卡一张 3.Linux内核:5.10 4.Docker:18.03.1 2.准备支持
    发表于 08-03 06:29

    Linux性能调优的思路

    Linux操作系统是一个开源产品,也是一个开源软件的实践和应用平台
    的头像 发表于 07-11 09:13 285次阅读

    OpenHarmony Docker移植实践

    Docker简介 从操作系统诞生之日起,虚拟化技术就不断的演进与发展,结合目前云原生的发展态势,容器无疑是其中的重要一环。 Docker是一个开源的软件项目,可以在Linux操作系统上提供一层额外
    发表于 05-18 10:03

    使用Ansible构建虚拟机部署Linux的最佳实践

    编者按:本文节选自节选自《基于Linux的企业自动化》第五章。“第5章,使用Ansible构建用于部署的虚拟机模板,通过构建虚拟机模板来探索部署Linux的最佳实践,虚拟机模板将以实际操作的方式大规模部署在虚拟机管理程序上。”
    的头像 发表于 05-16 15:13 718次阅读

    部署Linux的最佳实践探索

    编者按:本文节选自节选自《基于Linux的企业自动化》第五章。“第5章,使用Ansible构建用于部署的虚拟机模板,通过构建虚拟机模板来探索部署Linux的最佳实践,虚拟机模板将以实际操作的方式大规模部署在虚拟机管理程序上。”
    的头像 发表于 05-16 09:35 336次阅读