美文网首页
Docker的cgroup讲解

Docker的cgroup讲解

作者: 老苗 | 来源:发表于2021-01-14 11:06 被阅读0次

最近在看一个微服务框架github.com/tal-tech/go-zero,在core/stat/internal目录下学习到cgroup知识,本文只涉及到了我所学习到的,正文开始。


概念

cgroup ,控制组,它提供了一套机制用于控制一组特定进程对资源的使用。cgroup绑定一个进程集合到一个或多个子系统上。官方解释

  • subsystem,子系统,一个通过cgroup提供的工具和接口来管理进程集合的模块。一个子系统就是一个典型的“资源控制器”,用来调度资源或者控制资源使用的上限。其实每种资源就是一个子系统。子系统可以是以进程为单位的任何东西,比如虚拟化子系统、内存子系统。

  • hierarchy,层级树,多个cgroup的集合,这些集合构成的树叫hierarchy。可以认为这是一个资源树,附着在这上面的进程可以使用的资源上限必须受树上节点(cgroup)的控制。hierarchy上的层次关系通过cgroupfs虚拟文件系统显示。系统允许多个hierarchy同时存在,每个hierachy包含系统中的部分或者全部进程集合。

  • cgroupfs是用户管理操纵cgroup的主要接口:通过在cgroupfs文件系统中创建目录,实现cgroup的创建;通过向目录下的属性文件写入内容,设置cgroup对资源的控制;向task属性文件写入进程ID,可以将进程绑定到某个cgroup,以此达到控制进程资源使用的目的;也可以列出cgroup包含的进程pid。这些操作影响的是sysfs关联的hierarchy,对其它hierarchy没有影响。

对于cgroup,其本身的作用只是任务跟踪。但其它系统(比如cpusets,cpuacct),可以利用cgroup的这个功能实现一些新的属性,比如统计或者控制一个cgroup中进程可以访问的资源。举个例子,cpusets子系统可以将进程绑定到特定的cpu和内存节点上。

如果未理解跳过往下看,回头再看

讲解

  1. /proc/[pid]/cgroup进程的cgroup信息,如下图:
  • 每行的格式hierarchy-ID:controller-list:cgroup-path,此截图中cgroup-path对应的容器id
  1. /sys/fs/cgroup/目录
  • cpuacct/cpuacct.usage_percpu每个cpu的使用时间,如下图:

    cpuacct.usage_percpu
  • cpuset/cpuset.cpuscpu列表,如下图(我的电脑是4核):

    cpuset.cpus
  • cpu/cpu.cfs_period_us时间周期

  • cpu/cpu.cfs_quota_us用来配置当前cgroup在设置的周期长度内所能使用的CPU时间数,两个文件配合起来设置CPU的使用上限。两个文件的单位都是微秒(us),cfs_period_us的取值范围为1毫秒(ms)到1秒(s),cfs_quota_us的取值大于1ms即可,如果cfs_quota_us的值为-1(默认值),表示不受cpu时间的限制。

  • cpuacct/cpuacct.usage统计这个cgroup中所有任务消耗的总cpu时间(纳秒)

    cpuacct/cpuacct.usage
  1. 附加:/proc/stat该文件包含了所有CPU活动的信息,该文件中的所有值都是从系统启动开始累计到当前时刻,如下图:
    /proc/stat

第一行代表总的cpu时间,单位是jiffies,jiffies是内核中的一个全局变量,用来记录自系统启动一来产生的节拍数,在linux中,一个节拍大致可理解为操作系统进程调度的最小时间片,不同linux内核可能值有不同,通常在1ms到10ms之间。

相关文章

网友评论

      本文标题:Docker的cgroup讲解

      本文链接:https://www.haomeiwen.com/subject/yttpaktx.html