欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 财经 > 金融 > docker入门之cgroups

docker入门之cgroups

2024/10/25 5:18:51 来源:https://blog.csdn.net/weixin_46546303/article/details/141202440  浏览:    关键词: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 限制内存使用

{{ .HostConfig.Memory }}
{{ .HostConfig.MemorySwap }}
“Memory”: 0:不限制容器的物理内存。
“MemorySwap”: -1:不限制容器的总内存(物理内存 + 交换空间)。

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

docker run -m 512m my_image

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

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

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

################备注:
在限制内存时,如果提示:

WARNING: Your kernel does not support swap limit capabilities or the cgroup is not mounted. Memory limited without swap.

处理方案:

vim /etc/default/grub
####在GRUB_CMDLINE_LINUX行添加:
cgroup_enable=memory swapaccount=1update-grubreboot
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,您可以确保每个容器在资源使用上的独立性,并防止资源竞争导致的性能问题

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com