Docker-Cgroups
在 Docker 中,Cgroups 用于管理容器的资源分配和限制,确保容器不会占用过多的主机资源,从而影响其他容器或主机系统的正常运行。
核心功能
-
资源限制
- 限制容器可以使用的资源量(如 CPU、内存、磁盘 I/O、网络带宽等)。
- 例如,可以限制一个容器最多使用 50% 的 CPU 和 1GB 的内存。
-
优先级控制
- 控制容器对资源的访问优先级。
- 例如,可以为高优先级的容器分配更多的 CPU 时间。
-
资源统计
- 记录容器的资源使用情况(如 CPU 时间、内存使用量、磁盘 I/O 等)。
- 这些统计信息可以用于监控和调优。
-
进程控制
- 冻结、恢复或终止容器中的进程。
子系统
Cgroups 通过多个子系统(Subsystems)来管理不同类型的资源。常见的子系统包括:
子系统 | 功能描述 |
---|---|
CPU | 限制 CPU 使用,控制 CPU 时间分配。 |
Memory | 限制内存使用,控制内存分配和回收。 |
Blkio | 限制块设备 I/O,控制磁盘读写带宽。 |
Net_cls | 标记网络数据包,用于流量控制。 |
Devices | 控制设备访问权限。 |
Freezer | 冻结或恢复进程组。 |
Pids | 限制进程数量。 |
常用参数
- CPU 限制:
--cpus
:限制容器可以使用的 CPU 核数。--cpu-shares
:设置 CPU 时间片的相对权重。--cpuset-cpus
:绑定容器到指定的 CPU 核。
- 内存限制:
--memory
:限制容器可以使用的内存量。--memory-swap
:限制容器可以使用的内存和交换分区总量。
- 磁盘 I/O 限制:
--device-read-bps
:限制设备的读取带宽。--device-write-bps
:限制设备的写入带宽。
- 网络带宽限制:
--network
:限制容器的带宽
示例
-
限制容器使用 1.5 个 CPU 核和 512MB 内存:
docker run -it --cpus="1.5" --memory="512m" ubuntu
-
限制容器的磁盘读取带宽为 1MB/s:
docker run -it --device-read-bps="/dev/sda:1mb" ubuntu
原理
Cgroups 层次结构
- Cgroups 通过层次结构(Hierarchy)组织进程组。
- 每个层次结构可以包含多个子系统。
- 进程组(Control Group)是层次结构中的一个节点,用于管理一组进程的资源使用。
资源限制的实现
- 当容器启动时,Docker 会为其创建一个 Cgroup,并将容器的进程添加到该 Cgroup 中。
- 通过 Cgroup 的配置文件,设置资源限制(如 CPU、内存)。
- Linux 内核会根据 Cgroup 的配置,限制容器的资源使用。