容器实现核心技术: 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>
剑鸣秋朔