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

posted @ 2020-04-09 11:27  正宗老菜鸟  阅读(2180)  评论(0编辑  收藏  举报