docker入门之cgroups

在 Docker 中,cgroups(Control Groups)是一个 Linux 内核功能,允许将资源(如 CPU、内存、磁盘I/O 等)分配和限制到特定的进程组。Docker 利用 cgroups 来限制和隔离容器的资源使用,以确保容器之间的资源独立性。

1. cgroups 的基本概念

cgroups 是 Linux 内核提供的一种机制,用于控制和限制一组进程的资源使用。cgroups 可以限制的资源包括但不限于:

  • CPU 使用
  • 内存使用
  • I/O 操作
  • 网络带宽

2. 使用 Docker 配置 cgroups

Docker 使用 cgroups 来管理和限制容器的资源。你可以在启动容器时通过 Docker 的命令行参数来设置这些限制。

2.1 限制 CPU 使用

你可以使用 --cpus 参数来限制容器使用的 CPU 数量。例如,限制容器只能使用 1.5 个 CPU:

docker run --cpus="1.5" my_image

另一种方式是使用 --cpu-shares 参数来设置相对 CPU 共享权重:

docker run --cpu-shares=512 my_image

默认的 CPU 共享权重是 1024。

2.2 限制内存使用

你可以使用 -m--memory 参数来限制容器的内存使用。例如,限制容器的内存使用为 512MB:

docker run -m 512m my_image

你还可以设置交换内存的限制:

docker run -m 512m --memory-swap=1g my_image

这里 --memory-swap 参数设置为 1GB,则表示 512MB 的物理内存加上 512MB 的交换内存。

2.3 限制 I/O 使用

你可以使用 --blkio-weight 参数来设置容器的块 I/O 权重:

docker run --blkio-weight=500 my_image

权重值的范围是 10 到 1000,默认值是 500。

你还可以通过 --device-read-bps--device-write-bps 参数来限制特定设备的读写速率:

docker run --device-read-bps /dev/sda:1mb --device-write-bps /dev/sda:1mb my_image

3. 检查和监控 cgroups

你可以使用以下命令来查看和监控容器的资源使用情况:

docker stats

此命令将显示所有正在运行的容器的实时资源使用情况,包括 CPU、内存、网络和 I/O。

4. cgroups 版本

Linux 内核提供了两种版本的 cgroups:cgroups v1 和 cgroups v2。cgroups v2 简化了资源管理,并提供了一些新功能。

检查 cgroups 版本

你可以通过以下命令来检查系统正在使用的 cgroups 版本:

docker info | grep "Cgroup"

输出示例:

Cgroup Driver: cgroupfs
Cgroup Version: 2

补充知识

1.CPU 共享权重

CPU 共享权重(CPU shares)是用于控制多个容器共享 CPU 资源的相对权重。它允许您在多容器环境中更细粒度地管理 CPU 资源的分配。

概念

每个容器的 CPU shares 设置代表了它在其他容器之间的相对优先级。默认情况下,每个容器的 CPU shares 值是 1024。CPU shares 值越大,容器获得 CPU 时间的优先级就越高。

例如,如果有两个容器 A 和 B:

  • 容器 A 的 CPU shares 设置为 1024。
  • 容器 B 的 CPU shares 设置为 512。

这意味着容器 A 在 CPU 争用时会比容器 B 获得更多的 CPU 时间,具体来说是两倍于容器 B。

示例场景:多个容器的 CPU 共享
假设您有三个容器:

  • 容器 A 的 CPU shares 设置为 1024。
  • 容器 B 的 CPU shares 设置为 512。
  • 容器 C 的 CPU shares 设置为 256。

这三个容器共享相同的 CPU 资源。如果所有容器都需要 CPU 资源,那么 CPU 时间将按照如下比例分配:

  • 容器 A 将获得 1024/(1024+512+256) 约 50% 的 CPU 时间。
  • 容器 B 将获得 512/(1024+512+256) 约 25% 的 CPU 时间。
  • 容器 C 将获得 256/(1024+512+256) 约 12.5% 的 CPU 时间。
实践中的注意事项
  1. 相对权重而非绝对值:CPU shares 是相对权重,而不是绝对的 CPU 限制。它们只在容器争用 CPU 资源时生效。

  2. 不影响单独运行的容器:如果一个容器独占 CPU,它将使用尽可能多的 CPU 时间,而不会受到 CPU shares 的限制。

  3. 适当设置 CPU shares:过多或过少的 CPU shares 可能导致资源分配不均。根据应用需求合理设置 CPU shares 以确保性能和资源利用率。

2.块io权重

块 I/O 权重(Block I/O Weight)是用于控制容器对块设备(如硬盘)的 I/O 操作的相对优先级。通过设置块 I/O 权重,您可以确保关键容器在 I/O 密集型操作中获得更多的 I/O 带宽,从而提高其性能。

块 I/O 权重的工作原理

每个容器的块 I/O 权重设置代表了它在其他容器之间的相对优先级。默认情况下,每个容器的块 I/O 权重值是 500。块 I/O 权重值的范围是 10 到 1000。权重值越大,容器在 I/O 争用时获得 I/O 带宽的优先级就越高。

示例场景:多个容器的块 I/O 共享

假设您有三个容器:

  • 容器 A 的块 I/O 权重设置为 1000。
  • 容器 B 的块 I/O 权重设置为 500。
  • 容器 C 的块 I/O 权重设置为 250。

这三个容器共享相同的块设备资源。如果所有容器都需要进行 I/O 操作,那么 I/O 带宽将按照如下比例分配:

  • 容器 A 将获得 1000/(1000+500+250) 约 57% 的 I/O 带宽。
  • 容器 B 将获得 500/(1000+500+250) 约 29% 的 I/O 带宽。
  • 容器 C 将获得 250/(1000+500+250) 约 14% 的 I/O 带宽。
实践中的注意事项
  1. 相对权重而非绝对值:块 I/O 权重是相对权重,而不是绝对的 I/O 限制。它们只在容器争用 I/O 资源时生效。

  2. 不影响单独运行的容器:如果一个容器独占 I/O 资源,它将使用尽可能多的 I/O 带宽,而不会受到块 I/O 权重的限制。

  3. 适当设置块 I/O 权重:过多或过少的块 I/O 权重可能导致资源分配不均。根据应用需求合理设置块 I/O 权重以确保性能和资源利用率。

总结

cgroups 是 Docker 实现资源隔离和限制的重要机制。通过合理配置 cgroups,您可以确保每个容器在资源使用上的独立性,并防止资源竞争导致的性能问题

  • 9
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值