当前位置: 首页 > news >正文

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,您可以确保每个容器在资源使用上的独立性,并防止资源竞争导致的性能问题

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Linux的chmod指令
  • 电测量数据交换DLMS∕COSEM组件第62部分:COSEM接口类(2)
  • 14.3 Matplotlib与Seaborn数据可视化
  • 基于web网上村委会业务办理系统pf
  • Linux中的锁
  • 预计下半年业务将反弹回升,亚信科技的底气源自哪里?
  • MySQL——单表查询(二)按条件查询(4)空值查询
  • 《深入浅出多模态》(八)多模态经典模型:MiniGPT4
  • qt-16可扩展对话框--隐藏和展现
  • 【硬件模块】震动传感器模块
  • Python做统计图之美
  • 注意!美国跨境选品风向变动,低价产品反成抢手货!
  • vos3000怎样对接voip落地语音网关呢?卡机和O口网关的配置技巧有哪些?
  • 牛客JS题(四十五)数组去重
  • Element-05.组件-Form表单
  • 【162天】黑马程序员27天视频学习笔记【Day02-上】
  • DataBase in Android
  • es6(二):字符串的扩展
  • ES6简单总结(搭配简单的讲解和小案例)
  • JAVA并发编程--1.基础概念
  • Java基本数据类型之Number
  • MySQL数据库运维之数据恢复
  • Rancher如何对接Ceph-RBD块存储
  • Spring Cloud(3) - 服务治理: Spring Cloud Eureka
  • TCP拥塞控制
  • Vue实战(四)登录/注册页的实现
  • webpack4 一点通
  • Webpack入门之遇到的那些坑,系列示例Demo
  • 通过获取异步加载JS文件进度实现一个canvas环形loading图
  • 应用生命周期终极 DevOps 工具包
  • 正则学习笔记
  • scrapy中间件源码分析及常用中间件大全
  • ​Linux Ubuntu环境下使用docker构建spark运行环境(超级详细)
  • # include “ “ 和 # include < >两者的区别
  • # MySQL server 层和存储引擎层是怎么交互数据的?
  • (1)虚拟机的安装与使用,linux系统安装
  • (C#)一个最简单的链表类
  • (Java入门)抽象类,接口,内部类
  • (k8s)Kubernetes 从0到1容器编排之旅
  • (Mac上)使用Python进行matplotlib 画图时,中文显示不出来
  • (react踩过的坑)Antd Select(设置了labelInValue)在FormItem中initialValue的问题
  • (第三期)书生大模型实战营——InternVL(冷笑话大师)部署微调实践
  • (附源码)spring boot火车票售卖系统 毕业设计 211004
  • (附源码)ssm失物招领系统 毕业设计 182317
  • (十)T检验-第一部分
  • ***监测系统的构建(chkrootkit )
  • .bat批处理(五):遍历指定目录下资源文件并更新
  • .naturalWidth 和naturalHeight属性,
  • .NET CORE 2.0发布后没有 VIEWS视图页面文件
  • .NET/MSBuild 中的发布路径在哪里呢?如何在扩展编译的时候修改发布路径中的文件呢?
  • .NET导入Excel数据
  • .net使用excel的cells对象没有value方法——学习.net的Excel工作表问题
  • .NET运行机制
  • /bin/bash^M: bad interpreter: No such file or directory
  • /dev/VolGroup00/LogVol00:unexpected inconsistency;run fsck manually