• Docker原理之Cgroups


    Cgroup简介

      CGroup 是 Control Groups 的缩写,是 Linux 内核提供的一种可以限制、记录、隔离进程组 (process groups) 所使用的物理资源 (如 cpu memory i/o 等等) 的机制。2007 年进入 Linux 2.6.24 内核,CGroups 不是全新创造的,它将进程管理从 cpuset 中剥离出来,作者是 Google 的 Paul Menage。CGroups 也是 LXC 为实现虚拟化所使用的资源管理手段。

    Cgroup架构

      

      CGroup 技术可以被用来在操作系统底层限制物理资源,起到 Container 的作用。图中每一个 JVM 进程对应一个 Container Cgroup 层级,通过 CGroup 提供的各类子系统,可以对每一个 JVM 进程对应的线程级别进行物理限制,这些限制包括 CPU、内存等等许多种类的资源。

    Cgroup子系统解释

    子系统 描述
    blkio  这个子系统为块设备设定输入/输出限制,比如物理设备(磁盘,固态硬盘,USB 等等)
    cpu 这个子系统使用调度程序提供对 CPU 的 cgroup 任务访问
    cpuacct 这个子系统自动生成 cgroup 中任务所使用的 CPU 报告
    cpuset 这个子系统为 cgroup 中的任务分配独立 CPU(在多核系统)和内存节点
    devices 这个子系统可允许或者拒绝 cgroup 中的任务访问设备
    freezer 这个子系统挂起或者恢复 cgroup 中的任务
    memory 这个子系统设定 cgroup 中任务使用的内存限制,并自动生成由那些任务使用的内存资源报告
    net_cls 这个子系统使用等级识别符(classid)标记网络数据包,可允许 Linux 流量控制程序(tc)识别从具体 cgroup 中生成的数据包

    Cgroups限制测试

    • /sys/fs/cgroup下面都称为子系统,目录下包含了限制的资源种类,CentOS7

       

    • cfs_period 和 cfs_quota的关键字,主要是对cpu的限制,功能是限制进程在长度为 cfs_period 的一段时间内,只能被分配到总量为 cfs_quota 的 CPU 时间。
    • 验证cpu限制
      • 进入到cpu目录创建一个自己的容器 busket,系统会默认创建被限制的子系统

        

      • 当前目录默认cpu使用时间
    # 默认cpu使用时间(us)
    ## 结果:100ms
    cat cpu.cfs_period_us 
    100000
    # 分配的时间
    ## -1 表示不限制
    cat cpu.cfs_quota_us
    -1
      • 执行死循环,验证不限制的情况是否占满cpu
    # 执行死循环
    ## 返回pid
    while : ; do : ; done &
    [2] 25013

          

          

          由于我执行了两次死循环,所以看到有两个PID,都把cpu占满了。由于我的虚拟机是分了3cpus,所以top的整个cups占用达到了70.7%,我执行一个的时候占用大概是36%左右。杀掉两个进程后,Cpu(s) 降为正常,小于10%。

      • 更改cpu.cfs_quota_us的值为25000(us), 即单位时间内,即每100毫秒内占用25毫秒的时间,即执行死循环的话,单cpu占用率无限接近25%。验证一下:
        • vi是无权限的,用echo进行修改。
    ## 更改cpu.cfs_quota_us为25000us
    echo 25000 > cpu.cfs_quota_us
        • 执行死循环
    # 执行死循环
    ## 返回pid
    while : ; do : ; done &
    [1] 4853
        • top

        • 把当前跑满cpu的进程ID写入限制进程的tasks子系统中。
    # 把刚才死循环进程id写入tasks子系统
    echo 4853 > tasks
        • 验证单cpu是否无限接近25%

        可以看出,cgroup就是通过这种方式将控制组的资源使用进行限制。

    docker限制

      同理,docker也是通过cgroup进行限制的,可以看到我的子系统下面每个都有docker目录。

     

      

      可以看到cpu目录下有刚才创建的busket,也有docker,还有我安装的k8s的kubepods, 进入docker后里面又有很多容器ID,进入容器ID后也是一系列子系统文件。所以,docker就是基于namespace隔离出来并且通过cgroup做内核资源限制的虚拟化容器,本质是进程。

    参考

      https://time.geekbang.org/column/article/14653

      https://blog.csdn.net/lbyyy/article/details/54342541

    目录

      https://www.cnblogs.com/lioa/p/12664686.html

  • 相关阅读:
    大数据量下的SQL Server数据库自身优化
    NodeJS 学习笔记
    SOA、ESB、NServiceBus、云计算 总结
    .NET及.NET Core系统架构
    TCP/IP协议、HTTP协议、SOCKET通讯详解
    web压测工具http_load
    前端面试问题答案汇总--通识篇
    前端面试问题答案汇总--高级篇
    前端面试问题答案汇总--进阶篇
    前端面试问题答案汇总--基础版
  • 原文地址:https://www.cnblogs.com/lioa/p/12664912.html
Copyright © 2020-2023  润新知