Docker-Cgroups

Docker-Cgroups

起男 33 2025-03-07

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 的配置,限制容器的资源使用。