容器实现核心技术:CGroups
1. CGroups 概念
-
Docker利用namespace实现了容器之间资源隔离,但是namespace不能对容器资源限制,比如CPU、内存。
-
如果某一个容器属于CPU密集型任务,那么会影响其他容器使用CPU,导致多个容器相互影响并且抢占资源。
-
如何对多个容器的资源使用进行限制就成了容器化的主要问题。
答:引入Control Groups(简称CGroups),限制容器资源
-
CGroups:所有的任务就是运行在系统中的一个进程,而CGroups以某种标准将一组进程为目标进行资源分配和控制。例如CPU、内存、带宽等,并且可以动态配置。
-
CGroups主要功能:
- 限制进程组使用的资源数量(Resourcelimitation):可以为进程组设定资源使用上限,例如内存
- 进程组优先级控制(Prioritization):可以为进程组分配特定CPU、磁盘IO吞吐量
- 记录进程组使用的资源数量(Accounting):例如使用记录某个进程组使用的CPU时间
- 进程组控制(Control):可以将进程组挂起和恢复
-
ls/sys/fs/cgroup/-l查看cgroups可控制的资源:
- blkio :对快设备的IO进行限制。
- cpu:限制CPU时间片的分配,与cpuacct挂载同一目录。
- cpuacct :生成cgroup中的任务占用CPU资源的报告,与cpu挂载同一目录。
- cpuset :给cgroup中的任务分配独立的CPU(多核处理器)和内存节点。
- devices :允许或者拒绝cgroup 中的任务访问设备。
- freezer :暂停/恢复cgroup 中的任务。
- hugetlb :限制使用的内存页数量。
- memory :对cgroup 中任务的可用内存进行限制,并自动生成资源占用报告。
- net_cls :使用等级识别符(classid)标记网络数据包,这让Linux 流量控制程序(tc)可以识别来自特定从cgroup 任务的数据包,并进行网络限制。
- net_prio:允许基于cgroup设置网络流量的优先级。
- perf_event:允许使用perf工具来监控cgroup。
- pids:限制任务的数量。
2. 容器实际资源限制位置
/sys/fs/cgroup/<资源名>/docker/<容器ID>