CPU使用率其实就是你运行的程序占用的CPU资源,表示你的机器在某个时间点的运行程序的情况。
使用率越高,说明你的机器在这个时间上运行了很多程序,反之较少。
CPU使用率的高低与你的CPU强弱有直接关系。

Docker CPU 限制;
Docker 的资源限制和隔离完全基于 Linux cgroups。
对 CPU 资源的限制方式也和 cgroups 相同。
Docker 提供的 CPU 资源限制选项可以在多核系统上限制容器能利用哪些 vCPU。
而对容器最多能使用的 CPU 时间有两种限制方式:
一是有多个 CPU 密集型的容器竞争 CPU 时,设置各个容器能使用的 CPU 时间相对比例。
二是以绝对的方式设置容器在每个调度周期内最多能使用的 CPU 时间。

--cpuset-cpus=""    # 允许使用的 CPU 集合
-c,--cpu-shares= # CPU 共享权值(相对权重)
cpu-period=   # 限制 CPU CFS 的周期,范围从 100ms~1s,即[, ]
--cpu-quota= # 限制 CPU CFS 配额,必须不小于1ms,即 >=
--cpuset-mems="" # 允许在上执行的内存节点(MEMs),只对 NUMA 架构有效

NUMA
非统一内存访问(NUMA)是一种用于多处理器的电脑记忆体设计,内存访问时间取决于处理器的内存位置。 在NUMA下,处理器访问它自己的本地存储器的速度比非本地存储器(存储器的地方到另一个处理器之间共享的处理器或存储器)快一些。

CPU 查看在 cat /proc/cpuinfo

docker run -d -it --cpuset-cpus="0,6" --name Centos-3 centos /bin/bash

我们可以设置容器可以在哪些 CPU 核上运行。

例如:
docker run -it --cpuset-cpus="0,6" --name Centos centos /bin/bash
设置容器中的进程可以在 cpu 0 和 cpu 6上执行。

docker run -it --cpuset-cpus="0-5" --name Centos centos /bin/bash
设置容器中的进程可以在 cpu0 - cpu5 上执行。

在 NUMA CPU 架构上,我们可以设置容器可以使用的内存节点。
docker run -it --cpuset-mems="1,5" --name Centos centos /bin/bash
设置容器中的进程只能使用节点 1 和 5 上的内存。

docker run -it --cpuset-mems="0-3" --name Centos centos /bin/bash
设置容器中的进程只能使用节点 0、1、2、3 上的内存。

CPU 资源的相对限制

默认情况下,所有的容器得到同等比例的 CPU 周期。在有多个容器竞争 CPU 时我们可以设置每个容器能使用的 CPU 时间比例。这个比例叫作共享权值,通过-c或--cpu-shares设置。Docker 默认每个容器的权值为 1024。不设置或将其设置为 0,都将使用这个默认值。系统会根据每个容器的共享权值和所有容器共享权值和比例来给容器分配 CPU 时间。

CPU 资源的绝对限制
Linux 通过 CFS(Completely Fair Scheduler,完全公平调度器)来调度各个进程对 CPU 的使用。
CFS 默认的调度周期是 100ms。
设置每个容器进程的调度周期,以及在这个周期内各个容器最多能使用多少 CPU 时间。

--cpu-period 设置调度周期,
--cpu-quota 设置在每个周期内容器能使用的 CPU 时间。

例如:
docker run -it --cpu-period=50000 --cpu-quota=25000 Centos centos /bin/bash
将 CFS 调度的周期设为 50000,将容器在每个周期内的 CPU 配额设置为 25000,表示该容器每 50ms 可以得到 50% 的 CPU 运行时间。

docker run -it --cpu-period=10000 --cpu-quota=20000 Centos centos /bin/bash
将容器的 CPU 配额设置为 CFS 周期的两倍,CPU 使用时间怎么会比周期大呢?其实很好解释,给容器分配两个 vCPU 就可以了。该配置表示容器可以在每个周期内使用两个 vCPU 的 100% 时间。

CFS 周期的有效范围是 1ms~1s,对应的--cpu-period的数值范围是 1000~1000000。
而容器的 CPU 配额必须不小于 1ms,即--cpu-quota的值必须 >= 1000。可以看出这两个选项的单位都是 us。

正确的理解 "绝对"

--cpu-quota 设置容器在一个调度周期内能使用的 CPU 时间时实际上设置的是一个上限。
并不是说容器一定会使用这么长的 CPU 时间。

启动一个容器,将其绑定到 cpu 1 上执行。给其 --cpu-quota 和--cpu-period 都设置为 50000。

docker run -d --name mongo1 --cpuset-cpus 1 --cpu-quota=50000 --cpu-period=50000 docker.io/mongo
调度周期为 50000,容器在每个周期内最多能使用 50000 cpu 时间。

docker run -d --name mongo2 --cpuset-cpus  --cpu-quota= --cpu-period= docker.io/mongo

再docker stats mongo-1 mongo-2可以观察到这两个容器,
每个容器对 cpu 的使用率在 50% 左右。说明容器并没有在每个周期内使用 50000 的 cpu 时间。

使用docker stop mongo2命令结束第二个容器,再加一个参数-c 2048 启动它:

docker run -d --name mongo2 --cpuset-cpus  --cpu-quota= --cpu-period= -c  docker.io/mongo

再用docker stats mongo-1命令可以观察到第一个容器的 CPU 使用率在 33% 左右,第二个容器的 CPU 使用率在 66% 左右。因为第二个容器的共享值是 2048,第一个容器的默认共享值是 1024,所以第二个容器在每个周期内能使用的 CPU 时间是第一个容器的两倍。

Docker 容器CPU设置的更多相关文章

  1. [转帖]Docker容器CPU、memory资源限制

    Docker容器CPU.memory资源限制 https://www.cnblogs.com/zhuochong/p/9728383.html 处理事项内容等 这一块内容感觉 不清楚.. 背景 在使用 ...

  2. Docker容器CPU限制选项测试

    目录 Docker容器CPU限制选项测试 参考 实验环境 --cpu-shares选项 测试 结论 --cpus选项 测试 结论 --cpuset-cpus选项 测试 结论 Docker容器CPU限制 ...

  3. Docker(二十)-Docker容器CPU、memory资源限制

    背景 在使用 docker 运行容器时,默认的情况下,docker没有对容器进行硬件资源的限制,当一台主机上运行几百个容器,这些容器虽然互相隔离,但是底层却使用着相同的 CPU.内存和磁盘资源.如果不 ...

  4. Docker容器CPU、memory资源限制

    背景 在使用 docker 运行容器时,默认的情况下,docker没有对容器进行硬件资源的限制,当一台主机上运行几百个容器,这些容器虽然互相隔离,但是底层却使用着相同的 CPU.内存和磁盘资源.如果不 ...

  5. docker容器里设置中文时区

    本文讨论docker容器里中文时区的问题,总所周知docker hub上的镜像默认都是英文时区的,在国人使用过程当中需要将时区设置成中文,我原来光配置/etc/localtime了date显示的时间也 ...

  6. docker容器怎么设置开机启动

    https://my.oschina.net/lwenhao/blog/1923003 docker服务器.以及容器设置自动启动 一.docker服务设置自动启动 说明:适用于yum安装的各种服务 查 ...

  7. docker容器启动设置固定IP

    docker安装以后的网络类型 [root@insure updev]# docker network ls NETWORK ID NAME DRIVER SCOPE 14da40175b01 bri ...

  8. docker 容器中设置 mysql lampp php软链接

    在容器中安装xampp后,进入到终端,直接输入mysql php 发现报错,命令未被发现.如果输入/opt/lampp/bin/mysql   就可以进入了,所以我们要找到在容器中安装的位置,然后将他 ...

  9. reboot 后 Docker服务及容器自动启动设置

    https://blog.csdn.net/wxb880114/article/details/82904765 重启reboot操作系统后,发现docker 服务未启动,容器也未启动,天生反骨,怎么 ...

随机推荐

  1. Hello Object Oriented!

    继计组之后,北航计算机学院又一大神课! 希望能以此为契机,和更多热爱技术的朋友们交流.让我们一起,共同进步~ [2019.4.27更新] 建立博客园的最初目的,是为了北航计算机学院OO课程设计的需要. ...

  2. 初入react-redux (基于webpack babel的react应用框架)

    react这么热门的框架也不介绍了,redux是一个单项数据流的小框架,当然不只配合react,它起初是为react而配的,现在面向所有了,比如ng-redux的项目.redux做为react的标准搭 ...

  3. Servlet -- 重定向

    重定向的两种方式: 1: protected void doGet(HttpServletRequest request, HttpServletResponse response) throws S ...

  4. 你应该要知道的vue.js

    前言 小组同事最近都在学习前端,目前我们小组前端技术栈主要是vue.在和同事交流过程成,发现他们对vue都不了解,所以整理了问的比较多的问题. 组件data为什么必须是函数? 因为组件可能被多处使用, ...

  5. webpack 非严格模式设置 npm i babel-plugin-transform-remove-strict-mode

    安装插件:npm i babel-plugin-transform-remove-strict-mode 在.babelrc文件的插件项添加:"transform-remove-strict ...

  6. Python线程状态和全局解释器锁

    在刚接触Python的时候时常听到GIL这个词,并且发现这个词经常和Python无法高效的实现多线程划上等号.本着不光要知其然,还要知其所以然的研究态度,博主搜集了各方面的资料,花了一周内几个小时的闲 ...

  7. POJ 2449 Remmarguts' Date (第k短路径)

    Remmarguts' Date Time Limit: 4000MS   Memory Limit: 65536K Total Submissions:35025   Accepted: 9467 ...

  8. 关于JAVA-JS-JSP之间传值的各种方法

    https://blog.csdn.net/murex_dustyone/article/details/52945552 这篇博文写的非常好,保存下来,一起学习

  9. (replace find)nyoj113-字符串替换

    113-字符串替换 内存限制:64MB 时间限制:3000ms 特判: No通过数:171 提交数:388 难度:2 题目描述: 编写一个程序实现将字符串中的所有"you"替换成& ...

  10. phpcms 标签含义大全

    {template "content","header"}   ----------  调用根目录下phpcms\template\content\header ...