文章目录

  • Cgroup概念
  • 利用stress工具测试CPU和内存
  • CPU 周期限制
  • CPU Core 控制
  • CPU 配额控制参数的混合使用
  • 内存限额
  • Block IO 的限制
  • bps 和 iops 的限制

Cgroup概念

Docker通过 Cgroup 来控制容器使用的资源配额,包括 CPU、内存、磁盘三大方面, 基本覆盖了常见的资源配额和使用量控制。
Cgroup 是 Control Groups 的缩写,是Linux 内核提供的一种可以限制、记录、隔离进程组所使用的物理资源(如 CPU、内存、磁盘 IO 等等)的机制,被 LXC、docker 等很多项目用于实现进程资源控制。Cgroup 本身是提供将进程进行分组化管理的功能和接口的基础结构,I/O 或内存的分配控制等具体的资源管理是通过该功能来实现的。

Cgroup的子系统:
blkio:设置限制每个块设备的输入输出控制。例如:磁盘,光盘以及 usb 等等。
CPU:使用调度程序为 cgroup 任务提供 CPU 的访问。
cpuacct:产生 cgroup 任务的 CPU 资源报告。
cpuset:如果是多核心的 CPU,这个子系统会为 cgroup 任务分配单独的 CPU 和 内存。
devices:允许或拒绝 cgroup 任务对设备的访问。
freezer:暂停和恢复 cgroup 任务。
memory:设置每个 cgroup 的内存限制以及产生内存资源报告。
net_cls:标记每个网络包以供 cgroup 方便使用。
ns:命名空间子系统。
perf_event:增加了对每个 group 的监测跟踪的能力,可以监测属于某个特定的 group 的所有线程以及运行在特定CPU上的线程。

利用stress工具测试CPU和内存

使用 Dockerfile 来创建一个基于 Centos 的 stress 工具镜像。
[root@server1 stress]# mkdir /opt/stress
[root@server1 stress]# vim Dockerfile
FROM centos:7
RUN yum -y install wget
RUN wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
RUN yum -y install stress[root@server1 stress]# docker build -t centos:stress .[root@server1 stress]# docker run -itd --cpu-shares 100 centos:stress使用如下命令创建容器,命令中的--cpu-shares 参数值不能保证可以获得 1 个 vcpu 或 者多少 GHz 的 CPU 资源,它仅是一个弹性的加权值。

注意点:默认情况下,每个 Docker容器的CPU份额都是1024。单独一个容器的份额是没有意义的。只有在同时运行多个容器时,容器的 CPU 加权的效果才能体现出来。

例如,两个容 器 A、B 的 CPU 份额分别为 1000 和 500,在CPU进行时间片分配的时候,容器A比容器B多一倍的机会获得 CPU 的时间片。但分配的结果取决于当时主机和其他容器的运行状态, 实际上也无法保证容器 A一定能获得CPU时间片。比如容器A的进程一直是空闲的,那么容器B是可以获取比容器A更多的CPU时间片的。极端情况下,例如主机上只运行了一个容器,即使它的 CPU 份额只有 50,它也可以独占整个主机的CPU资源。

通过 cpu share 可以设置容器使用 CPU 的优先级,比如启动了两个容器及运行查看 CPU 使用百分比。


容器产生10个子函数进程
[root@server1 stress]# docker run -tid --name cpu512 --cpu-shares 512 centos:stress stress -c 10
进入容器使用top查看cpu使用情况
[root@server1 ~]# docker exec -it 64d4537e9072 bash
[root@64d4537e9072 /]# top容器产生10个子函数进程
[root@server1 stress]# docker run -tid --name cpu1024 --cpu-shares 1024 centos:stress stress -c 10
进入容器使用top查看cpu使用情况
[root@server1 stress]# docker exec -it 5601da554380 bash
[root@5601da554380 /]# top



两个容器的CPU使用率约为1:2

CPU 周期限制

Docker 提供了–cpu-period、–cpu-quota 两个参数控制容器可以分配到的 CPU 时钟周期。
–cpu-period 是用来指定容器对 CPU 的使用要在多长时间内做一次重新分配。

–cpu-quota 是用来指定在这个周期内,最多可以有多少时间用来跑这个容器。
与 --cpu-shares 不同的是,这种配置是指定一个绝对值,容器对 CPU 资源的使用绝对不会超过配置的值。

cpu-period 和 cpu-quota 的单位为微秒(μs)。cpu-period 的最小值为 1000 微秒, 最大值为 1 秒(10^6 μs),默认值为 0.1 秒(100000 μs)。
cpu-quota 的值默认为 -1, 表示不做控制。cpu-period 和 cpu-quota 参数一般联合使用。

例如:容器进程需要每 1 秒使用单个 CPU 的 0.2 秒时间,可以将 cpu-period 设置 为 1000000(即 1 秒),cpu-quota 设置为 200000(0.2 秒)。
当然,在多核情况下,如果允许容器进程完全占用两个 CPU,则可以将 cpu-period 设置为 100000(即 0.1 秒), cpu-quota 设置为 200000(0.2 秒)。

[root@server1 stress]# docker run -itd --cpu-period 100000 --cpu-quota 200000 centos:stress
[root@server1 stress]# docker exec -it f0059804ea7e bash
[root@f0059804ea7e /]# cat /sys/fs/cgroup/cpu/cpu.cfs_period_us
100000
[root@f0059804ea7e /]# cat /sys/fs/cgroup/cpu/cpu.cfs_quota_us
200000

CPU Core 控制

对多核 CPU 的服务器,Docker 还可以控制容器运行使用哪些 CPU 内核,即使用–cpuset-cpus 参数。
这对具有多 CPU 的服务器尤其有用,可以对需要高性能计算的容器进行性能最优的配置。

[root@server1 stress]# docker run -itd --name cpu1 --cpuset-cpus 0-1 centos:stress

执行以上命令需要宿主机为双核,表示创建的容器只能用 0、1两个内核。最终生成 的 cgroup 的 CPU 内核配置如下:

[root@server1 stress]# docker run -itd --name cpu1 --cpuset-cpus 0-1 centos:stress

执行以上命令需要宿主机为双核,表示创建的容器只能用 0、1两个内核。最终生成 的 cgroup 的 CPU 内核配置如下:

[root@server1 stress]# docker exec -it fe9c4b60a189 bash
[root@fe9c4b60a189 /]# cat /sys/fs/cgroup/cpuset/cpuset.cpus
0-1[root@server1 stress]# docker exec fe9c4b60a189 taskset -c -p 1
pid 1's current affinity list: 0,1

CPU 配额控制参数的混合使用

通过 cpuset-cpus 参数指定容器 A 使用 CPU 内核 0,容器 B 只是用 CPU 内核 1。
在主机上只有这两个容器使用对应 CPU 内核的情况,它们各自占用全部的内核资源,cpu-shares 没有明显效果。

cpuset-cpus、cpuset-mems 参数只在多核、多内存节点上的服务器上有效,并且必须与实际的物理配置匹配,否则也无法达到资源控制的目的。

在系统具有多个 CPU 内核的情况下,需要通过 cpuset-cpus 参数为设置容器 CPU 内核才能方便地进行测试。

创建容器cpu3,仅使用cpu0核心,加权值为512

[root@server1 stress]# docker run -dit --name cpu3 --cpuset-cpus 0 --cpu-shares 512 centos:stress stress -c 1
daa803551fb1b0f3ffa79b4b7d2c1a895bba581c863005ee1adfd30097b8bd12
[root@server1 stress]# docker exec -it daa803551fb1 bash
[root@daa803551fb1 /]# top


创建容器cpu4,仅使用cpu0核心,加权值为1024

[root@server1 ~]# docker run -dit --name cpu4 --cpuset-cpus 0 --cpu-shares 1024 centos:stress stress -c 1
658977e9e697b97f91250df8343e26426af224a316c61b39b4f9a70e31966fff
[root@server1 ~]# docker exec -it 658977e9e697 bash
[root@658977e9e697 /]# top

内存限额

与操作系统类似,容器可使用的内存包括两部分:物理内存和 Swap。
Docker 通过下面两组参数来控制容器内存的使用量。

-m 或 --memory:设置内存的使用限额,例如 100M、1024M。
–memory-swap:设置 内存+swap 的使用限额。
执行如下命令允许该容器最多使用 200M 的内存和 300M 的 swap。

[root@server1 ~]# docker run -it -m 200M --memory-swap=300M progrium/stress --vm 1 --vm-bytes 280M
--vm 1:启动1个内存工作线程
--vm-bytes 280M:每个线程分配280M内存

默认情况下,容器可以使用主机上的所有空闲内存。
与cpu的cgroups配置类似,Docker会自动为容器在目录/sys/fs/cgroup/memory/docker/<容器的完整长id>中创建相应cgroup配置文件
注意:如果让工作线程分配的内存超过300M,分配的内存超过限额,stress线程报错,容器退出。

[root@server1 ~]# docker run -it -m 200M --memory-swap=300M progrium/stress --vm 1 --vm-bytes 310M

Block IO 的限制

默认情况下,所有容器能平等地读写磁盘,可以通过设置–blkio-weight 参数来改变 容器 block IO 的优先级。
–blkio-weight 与 --cpu-shares 类似,设置的是相对权重值,默认为 500。
在下面 的例子中,容器 A 读写磁盘的带宽是容器 B 的两倍。

[root@server1 stress]# docker run -it --name containA --blkio-weight 600 centos:stress
[root@7033c81f88e6 /]# cat /sys/fs/cgroup/blkio/blkio.weight
600
[root@server1 stress]# docker run -it --name containB --blkio-weight 300 centos:stress
[root@c51ab0744e18 /]# cat /sys/fs/cgroup/blkio/blkio.weight
300

bps 和 iops 的限制

bps 是 byte per second,每秒读写的数据量。
iops 是 io per second,每秒 IO 的次数。
可通过以下参数控制容器的 bps 和 iops:

–device-read-bps,限制读某个设备的 bps。
–device-write-bps,限制写某个设备的 bps。
–device-read-iops,限制读某个设备的 iops。
–device-write-iops,限制写某个设备的 iops。

下面的示例是限制容器写 /dev/sda 的速率为 5 MB/s。

[root@server1 stress]# docker run -it --device-write-bps /dev/sda:5MB centos:stress
[root@81a128f454fe /]# dd if=/dev/zero of=test bs=1M count=1024 oflag=direct
^C178+0 records in
178+0 records out
186646528 bytes (187 MB) copied, 35.6014 s, 5.2 MB/s

通过 dd 命令测试在容器中写磁盘的速度。因为容器的文件系统是在 host /dev/sda 上 的,
在容器中写文件相当于对 host /dev/sda 进行写操作。另外,oflag=direct 指定用 direct IO 方式写文件,
这样 --device-write-bps 才能生效。

结果表明限速 5MB/s 左右。作为对比测试,如果不限速,结果如下。

[root@server1 stress]# docker run -it centos:stress
[root@0eddd801b068 /]# dd if=/dev/zero of=test bs=1M count=1024 oflag=direct
1024+0 records in
1024+0 records out
1073741824 bytes (1.1 GB) copied, 5.23965 s, 205 MB/s

Docker中的资源分配详解相关推荐

  1. Docker中的网络详解

    本节主要是介绍Docker默认的网络行为,包含创建的默认网络类型以及如何创建用户自定义网络,也会介绍如何在单一主机或者跨主机集群上创建网络的资源需求. 1.默认网络 当你安装了docker,她自动创建 ...

  2. Docker(十四):Docker:网络模式详解

    Docker作为目前最火的轻量级容器技术,牛逼的功能,如Docker的镜像管理,不足的地方网络方面. Docker自身的4种网络工作方式,和一些自定义网络模式 安装Docker时,它会自动创建三个网络 ...

  3. Docker持续部署图文详解

    2019独角兽企业重金招聘Python工程师标准>>> Docker持续部署图文详解 博客分类: docker 架构 JAVA项目如何通过Docker实现持续部署(只需简单四步),即 ...

  4. 基于Kubernetes构建Docker集群管理详解

    from: 基于Kubernetes构建Docker集群管理详解 Kubernetes是Google开源的容器集群管理系统,基于Docker构建一个容器的调度服务,提供资源调度.均衡容灾.服务注册.动 ...

  5. Docker系列07—Dockerfile 详解

    Docker系列07-Dockerfile 详解 1.认识Dockerfile 1.1 镜像的生成途径 基于容器制作  dockerfile,docker build 基于容器制作镜像,已经在上篇Do ...

  6. Docker:网络模式详解

    http://www.cnblogs.com/zuxing/articles/8780661.html Docker:网络模式详解 袖珍指南 Docker作为目前最火的轻量级容器技术,牛逼的功能,如D ...

  7. Docker常用命令使用详解(docker help、version、info、images)(一)

    Docker常用命令 命令 描述 docker .docker help.docker --help 列出可用命令 docker version 显示Docker版本信息 docker info 显示 ...

  8. ALSA声卡驱动中的DAPM详解之四:在驱动程序中初始化并注册widget和route

    前几篇文章我们从dapm的数据结构入手,了解了代表音频控件的widget,代表连接路径的route以及用于连接两个widget的path.之前都是一些概念的讲解以及对数据结构中各个字段的说明,从本章开 ...

  9. Asp.net中GridView使用详解(引)【转】

    Asp.net中GridView使用详解(引) GridView无代码分页排序 GridView选中,编辑,取消,删除 GridView正反双向排序 GridView和下拉菜单DropDownList ...

最新文章

  1. 管理邮件用户(附图)---Michaelf
  2. python笔记基础-python学习笔记(一)python简介和基础
  3. sql 获取本周周一和周日
  4. 定时任务 - 构建定时任务task
  5. 老司机给我们解读 Spring Boot 最流行的 16 条实践
  6. html表格横向竖向滚动,利用纯css实现table固定列与表头中间横向滚动的思路和实例...
  7. python logger设置信息取得_shell 脚本中如何获取 python logging 打印的信息?
  8. Less or Equal(CF-977C)
  9. ORACLE数据库多表关联查询效率问题解决方案
  10. flutter html 加载_实操 | 在 Flutter 中创建通信桥
  11. 判断门禁卡是否加密_教你用手机模拟加密门禁卡-不用电脑
  12. Ubuntu 更改系统语言
  13. iconfont 多色图标使用介绍
  14. 该死的强迫症,教你stm32怎么把杜邦线弄整齐
  15. setiosflags与setw使用说明
  16. 出行即服务(MAAS)框架
  17. AutoRun机制详解
  18. Python实战技巧(11)使用python收发邮件时需要的邮箱授权码如何获取
  19. Currency Exchange (SPFA)
  20. a标签去下划线或文字添加下修饰_怎样去除ul li a标签文字下的下划线

热门文章

  1. Linux命令·rmdir
  2. centos7查看ip命令
  3. layui中导航元素的简单使用
  4. 计算机网络离不开光缆,无线网络论文.doc
  5. 动态折线图,制作原来是这么简单
  6. R 语言怎么保存工作目录到当前路径_第一讲 R基本介绍及安装
  7. 蓝桥杯 算法训练 - 连续正整数的和 78这个数可以表示为连续正整数的和,1+2+3,18+19+20+21,25+26+27。   输入一个正整数 n(<=10000)   输出 m 行(n有m
  8. C++string中的insert()插入函数
  9. Android版简历(四)
  10. 考研报名时,需要准备哪些信息?