Skip to content
章节导航

容器实现核心技术: CGroups

  • Docker 利用 namespace 实现了容器之间资源隔离,但是 namespace 不能对容器资源限制,比如 CPU,内存等。如果某个容器属于 CPU 密集型任务, 那么会影响其他容器使用 CPU,导致多个容器相互影响并且抢占资源。 如何对多个容器的资源进行限制形成了容器化的主要问题。
  • 引入 Control Groups(简称 CGroups), 限制容器资源。

CGroups

  • 所有的任务就是运行在系统中的一个进程,而 CGroups 以某种标准将一组进程为目标进行资源分配和控制。例如 CPU, 内存,带宽等, 并且可以动态配置。

  • CGroups 主要功能:

    功能描述
    限制进程组使用的资源数量(Resource limitation)可以为进程组设定资源使用上限,例如内存
    进程组优先级控制(Prioritization)可以为进程组分配特定CPU、磁盘IO吞吐量
    记录进程组使用的资源数量(Accounting)例如使用记录某个进程组使用的CPU时间
    进程组控制(Control)可以将进程组挂起和恢复

可控制资源

命令:

shell
ls /sys/fs/cgroups/ -l
资源描述
blkio对快设备的 IO 进行限制
cpu限制 CPU 时间片的分配, 与 cpuacc 挂载同一目录
cpuacc生成 cgroup 中的任务占用 CPU 资源的报告, 与 cpu 挂载同一目录
cpuset给 cgroup 中的任务分配独立的CPU(多核处理器)和内存节点
devices允许或者拍绝 cgroup 中的任务访问设备
freezer暂停/恢复 cqroup 中的任务
memory对 cgroup 中任务的可用内存进行限制,并自动生成资源占用报告
net_cls使用等级识别符(classid)标记网络数据包,这让 Linux流量控制程序(tc)可以识别来自特定从cqroup 任务的数据包,并进行网络限制
net_prio允许基于 cqroup 设置网络流量的优先级
perf_event允许使用 perf 工具来监控 cgroup
pids限制任务的数量

容器实际资源限制位置:

/sys/fs/cgroup/<资源名>/docker/<容器ID>