七、Docker 资源限制
00 分钟
2024-6-26
2024-6-29
type
status
date
slug
summary
tags
category
icon
password
文章状态
 

什么是 CGroups ?

Cgroups (control groups)是 Linux 内核提供的一种机制,这种机制可以根据需求把一系列系统任务及其子任务整合(或分隔)到按资源划分等级的不同组内,从而为系统资源管理提供一个统一的框架。
通俗地说,cgroups 可以限制、记录任务组所使用的物理资源(包括 CPU、 Memory、 IO 等),为容器实现虚拟化提供了基本保证,是构建 Docker 等一系列虚拟化管理工具的基石。

Cgroups 的作用

实现 cgroups 的主要目的是为不同用户层面的资源管理,提供一个统一化的接口。从单个任务的资源控制到操作系统层面的虚拟化,cgroups 提供了以下四大功能:
  • 资源限制
    • cgroups 可以对任务使用的资源总额进行限制。
      如设定应用运行时使用内存的上限,一旦超过配额就发出 OOM (Out of Memory)提示。
  • 优先级分配
    • 通过分配的 CPU 时间片数量及磁盘 IO 带宽大小,实际上就相当于控制了任务运行的优先级。
  • 资源统计
    • cgroups 可以统计系统的资源使用量,如 CPU 使用时长、内存用量等
      ps. 这个功能非常适用于计费。
  • 任务控制
    • cgroups 可以对任务执行挂起、恢复等操作。

Cgoup 功能验证

使用 cgroups 限制进程对 CPU 的使用
运行 busyloop 程序,执行 top 查看 CPU 使用情况:CPU 占用 200%
运行 busyloop 程序,执行 top 查看 CPU 使用情况:CPU 占用 200%
执行 top 查看 CPU 使用情况:CPU 占用变为 10%
执行 top 查看 CPU 使用情况:CPU 占用变为 10%
 

Docker 限制资源

官方文档:

限制容器 CPU 资源

使用 docker run 的下述标签来限制容器使用的 CPU 资源:
使用 docker run 的下述标签来限制容器使用的 CPU 资源:
  • -cpus=<value>:限制容器可以使用的 CPU 数量。
  • -cpu-shares=<value>:设置容器 CPU 使用的相对权重。
  • -cpu-period=<value>:设置 CPU CFS 调度周期。
  • -cpu-quota=<value>:设置 CPU CFS 调度配额。
容器 CPU 负载为 200%,即单个 CPU 负载的两倍。可理解为两颗 CPU 在 100% 的为它工作。
四个 CPU 的负载都是 50%,加起来容器消耗的 CPU 总量就是两个 CPU 100% 的负载。

限制容器 MEM 资源

使用 docker run 的下述标签来限制容器使用的 内存 资源:
使用 docker run 的下述标签来限制容器使用的 内存 资源:
  • -m, --memory=<value>:限制容器可以使用的内存总量。
  • -memory-reservation=<value>:设置内存软限制。
  • -memory-swap=<value>:限制容器可以使用的交换空间总量。
  • -memory-swappiness=<value>:设置容器使用交换空间的倾向性。
监控容器内存可使用:
监控容器内存可使用:
 
  • 交换分区对内存限额的影响
    • 如果操作系统有 swap 分区,容器会使用 swap 分区来保存内存文件,需要使用 stress --vm 1 --vm-bytes 600M 命令才会触发限制。
      如果操作系统有 swap 分区,容器会使用 swap 分区来保存内存文件,需要使用 stress --vm 1 --vm-bytes 600M 命令才会触发限制。
      或增加 --memory-swap=300M 参数,表示可使用的内存和交换空间的总和为300M。
      根据官方文档,如指定 -m 内存限制时不添加 --memory-swap 参数,则表示容器中程序可以使用 100M 内存 + 100M swap 内存。默认情况 --memory-swap 会被设为 MEM 的 2 倍。
       
  • 设置 Docker 容器的内存软限制
    • 这个”软限制“并不是一个严格的限制,而是一个“预留”值,当系统内存资源紧张时,Docker 会尝试将容器的内存使用量限制在这个预留值以下。
      具体来说,当系统内存资源充足时,容器可以超过这个软限制使用更多的内存;但当系统内存资源紧张时,Docker 会通过内核的内存管理机制(如 OOM killer)来限制容器的内存使用,使其尽量不超过这个预留值。
      这个参数的主要作用是 防止容器在系统内存资源紧张时过度占用内存,从而影响其他容器的正常运行或导致系统整体性能下降。通过设置合理的内存软限制,可以提高系统的稳定性和可靠性。
 
上一篇
八、YAML
下一篇
六、Docker 存储