目录

  • 一、Cgroup资源配置方法
  • 二、使用stress工具测试CPU 和内存
    • 1、权重 --cpu-shares
    • 2、CPU周期限制 --cpu-period、 --cpu-quota
    • 3、CPU Core控制 --cpuset-spus
  • 三、CPU配额控制参数的混合使用
  • 四、内存限额
  • 五、Block IO的限制
    • 1、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工具镜像。

mkdir /opt/stress
vim /opt/stress/DockerfileFROM centos:7
MAINTAINER li
RUN yum install -y wget
RUN wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
RUN yum install -y stresscd /opt/stress/
docker build -t centos:stress .



1、权重 --cpu-shares

使用如下命令创建容器,命令中的- -cpu-shares参数值不能保证可以获得1个vcpu或者多少GHz的CPU资源,它仅是一个弹性的加权值。

docker run -itd --cpu-shares 100 centos:stress

说明:默认情况下,每个Docker容器的CPU份额都是1024。单独一个容器的份额是没有意义的。只有在同时运行多个容器时,容器的CPU加权的效果才能体现出来。
例如,两个容器A、B的CPU份额分别为1000和500,在CPU进行时间片分配的时候,容器A比容器B多一倍的机会获得CPU的时间片。但分配的结果取决于当时主机和其他容器的运行状态,实际上也无法保证容器A一定能获得CPU时间片。如果容器A的进程一直是空闲的,那么容器B是可以获取比容器A更多的CPU时间片的。极端情况下,例如主机上只运行了一个容器,即使它的CPU份额只有50,它也可以独占整个主机的CPU资源。

先创建两个容器
容器产生10个子函数进程,设置cpu优先级为512
docker run -tid --name cpu512 --cpu-shares 512 centos:stress stress -c 10容器产生10个子函数进程,设置cpu优先级为1024
docker run -tid --name cpu1024 --cpu-shares 1024 centos:stress stress -c 10动态查看容器信息
docker stats

2、CPU周期限制 --cpu-period、 --cpu-quota

Docker提供了–cpu-period、–cpu-quota两个参数控制容器可以分配到的CPU时钟周期。

1、–cpu-period 是用来指定容器对CPU的使用要在多长时间内做一 次重新分配。
2、–cpu-quota是用来指定在这个周期内,最多可以有多少时间用来跑这个容器。
3、–cpu-quota是–cpu-period的倍数时,使用多个CPU与–cpu-stress不同的是,这种配置是指一个绝对值,容器对CPU资源的使用绝对不会超过配置的值。cpu-period 和 cpu-quota 的单位为微秒(us)。 cpu-period 的最小值为1000微秒,最大值为1秒(10^6 us),默认值为 0.1 秒(100000 us)。
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秒)。

docker run -tid --cpu-period 100000 --cpu-quota 200000 centos:stress
docker exec -it 602299e4f013 bash
cat /sys/fs/cgroup/cpu/cpu.cfs_period_us
100000
cat /sys/fs/cgroup/cpu/cpu.cfs_quota_us
200000

3、CPU Core控制 --cpuset-spus

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

docker run -tid --name cpu1 --cpuset-cpus 0-1 centos:stress

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

通过下面指令可以看到容器中进程与 CPU 内核的绑定关系,达到绑定CPU内核的目的。

容器内部第一个进程号pid为1被绑定到指定CPU上运行
docker exec 容器ID taskset -c -p 1

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

通过cpuset-cpus参数指定容器A使用CPU内核0,容器B只是用CPU内核1
在主机上只有这两个容器使用对应CPU内核的情况,它们各自占用全部的内核资源,cpu-shares 没有明显效果。
cpuset-cpus. cpuset-mems 参数只在多核、多内存节点上的服务器上有效,并且必须与实际的物理配置匹配,否则也无法达到资源控制的目的。
在系统具有多个CPU内核的情况下,需要通过cpuset-cpus参数为设置容器CPU内核才能方便地进行测试。

docker stop `docker ps -qa`
docker run -itd --name cpu3 --cpuset-cpus 0 --cpu-shares 512 centos:stress stress -c 1docker run -itd --name cpu4 --cpuset-cpus 1 --cpu-shares 1024 centos:stress stress -c 1

四、内存限额

与操作系统类似,容器可使用的内存包括两部分:物理内存和Swap.
Docker通过下面两组参数来控制容器内存的使用量。-m或–memory: 设置(物理)内存的使用限额,例如100M、 1024M.
–memory-swap: 设置内存+ swap的使用限额。
执行如”下命令允许该容器最多使用200M的内存和300M的swap
docker run -it -m 200M --memory-swap=300M progrium/stress --vm 1 --vm-bytes 280M--vm 1:启动一个内存工作线程
--vm-bytes 280M:每个线程分配280M内存

默认情况下,容器可以使用主机上的所有空闲内存。
与CPU的cgroups配置类似,Docker会自动为容器在目录/sys/fs/cgroup/memory/docker/<容器的完整长ID>中创建相应cgroup配置文件

如果让工作线程分配的内存超过300M,分配的内存超过限额,stress线程报错,容器退出。

docker run -it -m 200M --memory-swap=300M progrium/stress --vm 1 --vm-bytes 310M

五、Block IO的限制

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

docker run -it --name container_A --blkio-weight 600 centos:stress
cat /sys/fs/cgroup/blkio/blkio.weightdocker run -it --name container_B --blkio-weight 300 centos:stress
cat /sys/fs/cgroup/blikio.weight

1、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的速率为5MB/s.

docker run -it --device-write-bps /dev/sda:5MB centos:stressdd if=/dev/zero of=test bs=1M count=1024 oflag=direct    //可以按ctrl+c中断查看
#-------------------------输出内容---------------------------------
^C18+0 records in
18+0 records out
18874368 bytes (19 MB) copied, 3.60306 s, 5.2 MB/s


上图说明:通过dd命令测试在容器中写磁盘的速度。因为容器的文件系统是在 host /dev/sda 上的,在容器中写文件相当于对host /dev/sda 进行写操作。另外,oflag=direct 指定用direct lO方式写文件,这样- -device-write-bps才能生效。
结果表明限速5MB/s左右。作为对比测试,如果不限速,结果如下。

不限速 速度会增加
docker run -it centos:stress
dd if=/dev/zero of=test bs=1M count=1024 oflag=direct

Docker通过Cgroup 资源配置相关推荐

  1. Docker Cgroup资源配置(CPU、内存、磁盘)

    一.Cgroup 资源配置方法 Docker 通过 Cgroup 来控制容器使用的资源配额,包括 CPU.内存.磁盘三大方面,基本覆盖了常见的资源配额和使用量控制. Cgroup 是 Control ...

  2. docker资源分配 Cgroup和安全通信 TLS

    1:docker资源分配 Cgroup [CPU 内存 I/O(单位时间内的吞吐量 单位时间内的读写速度)] 为什么要做资源分配 ? 容器----虚拟机 区别 虚拟机在创建的时候已经做了资源分配,(虚 ...

  3. docker之cgroup、compose

    cgroup的功能 docker使用cgroup控制资源,K8S里面也有limits Docker通过Cgroup来控制容器使用的资源配额,包括CPU.内存.磁盘三大方面,基本覆盖了常见的资源配额和使 ...

  4. cgroup资源配置

    一.cgroup介绍 二.利用stress 压力测试工具来测试 三.CPU控制 1.仅用率控制(权重) 2.周期限制 方法一:在命令行里直接设置 方法二:创建容器后,关闭容器在文件里直接修改 方法三: ...

  5. Cgroup 资源配置

    目录 一.Cgroup定义 二.使用stress压力测试工具测试cpu和内存状态 1.创建一个dockerfile文件 2.创建镜像 3.创建容器 ①创建容器 ②.创建容器并产生10个子函数进程 三. ...

  6. Linux云计算架构-docker容器命名和资源配额控制(2)

    文章目录 Linux云计算架构-docker容器命名和资源配额控制(2) 1. docker容器命名和重命名 2. 创建docker容器时指定主机名 3. 设置docker容器开机自动启动 4. cg ...

  7. docker网络原理及cgroup

    docker网络模式的特性  docker初始状态下有三种默认的网络模式 ,bridg(桥接),host(主机),none(无网络设置) 网络模式                            ...

  8. docker导致宿主机重启和Cgroup 驱动程序有关

    现象 某个宿主机突然登录不上了,重启后查看系统日志/var/log/messages和下面的日志类似 Jan 5 15:50:01 hanginx01 systemd: Started Session ...

  9. 这就是你日日夜夜想要的docker!!!---------Docker资源控制--Cgroup

    文章目录 一.什么是 Cgroup? 二.使用 stress 工具测试 CPU 和内存 1.stress工具介绍 2.使用 Dockerfile 来创建一个 stress 的工具镜像: 三.实操 1. ...

最新文章

  1. Linux 统计多个文件中 某字符串出现的行数
  2. 程序员的.NET时代
  3. wxWidgets:事件和事件处理
  4. oracle 11g ocp 笔记(15)--使用rman进行备份
  5. Boost正则表达式的编译与使用方法集
  6. 在vc或mfc中显示IplImage的方法
  7. AI 崛起,科学家的天下,程序员的谢幕
  8. php中的Register Globals
  9. 在CentOS 6上使用yum安装lnmp服务
  10. 先滑窗后时空联合处理MATLAB,时空联合优化重建方法及系统与流程
  11. C语言课后习题(51)
  12. 最想学 Go、Python,全栈开发者紧缺!分析了 11 万条程序员数据后有了这些发现...
  13. 北大毕业 15 年经验架构师,重磅解读 5G 时代的计算平台
  14. hana数据库 字段长度_SAP HANA: 列式内存数据库评测
  15. linux系统堆栈内存分配,Linux中堆栈内存在物理上是连续的吗?
  16. IDEA设置SQL格式化(关键字大写)
  17. 硬件固件名称在软件测试中指什么,固态硬盘升级固件有什么用?固态硬盘怎么升级固件?...
  18. java实现发送匿名邮件,帮帮忙!现在要实现邮件发送(还必须要匿名发送)!该怎么解决...
  19. From Fidelity to Perceptual Quality: A Semi-Supervised Approach for Low-Light Image Enhancement
  20. oracle logon只有3项,oracle 10g 审计logon和logoff

热门文章

  1. Java 程序优化:字符串操作、基本运算方法等优化策略
  2. 写一个 panic blame 机器人
  3. ​稳健、可靠全真即时通信网的架构与应用
  4. 音视频技术开发周刊 | 133
  5. 音视频技术开发周刊 84期
  6. RGB、YUV像素基础知识及处理数据
  7. 腾讯开源 DCache,分布式 NoSQL 存储系统
  8. Upsync:微博开源基于Nginx容器动态流量管理方案
  9. Linux命令发送Http的get或post请求(curl和wget两种方法)
  10. Boost在Linux和windows下的编译 32位 64位