Docker 容器CPU设置
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设置的更多相关文章
- [转帖]Docker容器CPU、memory资源限制
Docker容器CPU.memory资源限制 https://www.cnblogs.com/zhuochong/p/9728383.html 处理事项内容等 这一块内容感觉 不清楚.. 背景 在使用 ...
- Docker容器CPU限制选项测试
目录 Docker容器CPU限制选项测试 参考 实验环境 --cpu-shares选项 测试 结论 --cpus选项 测试 结论 --cpuset-cpus选项 测试 结论 Docker容器CPU限制 ...
- Docker(二十)-Docker容器CPU、memory资源限制
背景 在使用 docker 运行容器时,默认的情况下,docker没有对容器进行硬件资源的限制,当一台主机上运行几百个容器,这些容器虽然互相隔离,但是底层却使用着相同的 CPU.内存和磁盘资源.如果不 ...
- Docker容器CPU、memory资源限制
背景 在使用 docker 运行容器时,默认的情况下,docker没有对容器进行硬件资源的限制,当一台主机上运行几百个容器,这些容器虽然互相隔离,但是底层却使用着相同的 CPU.内存和磁盘资源.如果不 ...
- docker容器里设置中文时区
本文讨论docker容器里中文时区的问题,总所周知docker hub上的镜像默认都是英文时区的,在国人使用过程当中需要将时区设置成中文,我原来光配置/etc/localtime了date显示的时间也 ...
- docker容器怎么设置开机启动
https://my.oschina.net/lwenhao/blog/1923003 docker服务器.以及容器设置自动启动 一.docker服务设置自动启动 说明:适用于yum安装的各种服务 查 ...
- docker容器启动设置固定IP
docker安装以后的网络类型 [root@insure updev]# docker network ls NETWORK ID NAME DRIVER SCOPE 14da40175b01 bri ...
- docker 容器中设置 mysql lampp php软链接
在容器中安装xampp后,进入到终端,直接输入mysql php 发现报错,命令未被发现.如果输入/opt/lampp/bin/mysql 就可以进入了,所以我们要找到在容器中安装的位置,然后将他 ...
- reboot 后 Docker服务及容器自动启动设置
https://blog.csdn.net/wxb880114/article/details/82904765 重启reboot操作系统后,发现docker 服务未启动,容器也未启动,天生反骨,怎么 ...
随机推荐
- [luogu2296][寻找道路]
直接赋题目..... 题目描述 在有向图G 中,每条边的长度均为1 ,现给定起点和终点,请你在图中找一条从起点到终点的路径,该路径满足以下条件: 1 .路径上的所有点的出边所指向的点都直接或间接与终点 ...
- PHP的SQL语句优化
(转)仅供自己学习,特此转发 普遍遇到的慢SQL有以下三种: 1.未走索引 2.where条件里包含子查询,多表联查 3.查询大量数据 解决 一.索引:SQL中的高速公路 但凡优化SQL,首先要看的就 ...
- 第二篇-Django建立数据库各表之间的联系(中)
上篇中已经建立了两个table,Book和Publish.这篇介绍如何用python增删改查数据库中的数据. 在views.py中创建一个index函数 from django.shortcuts i ...
- 计算基因上外显子碱基覆盖度(exon coverage depth):Samtool工具使用
假设想要计算ATP1A4基因上的外显子碱基覆盖度 首先查询这个基因所有exon的起始和终止位置,查询链接:http://grch37.ensembl.org/Homo_sapiens/Transcri ...
- HTML5(FileRdeader)
主要作用: 异步读取存储在用户计算机上的文件(或原始缓冲区的内容),使用File或Blob对象指定要读取的文件或数据.其中File是input元素上选择文件后返回的FileList对象,也可以是拖放操 ...
- CentOS上手工部署kubernetes集群
本文完全是根据二进制部署kubernets集群的所有步骤,同时开启了集群的TLS安全认证. 环境说明 在下面的步骤中,我们将在三台CentOS系统的物理机上部署具有三个节点的kubernetes1.7 ...
- 分享两个好用的nosql GUI工具
redis: 真是千呼万唤始出来,终于有了redis gui 谢谢作者,但中文乱码问题貌似还没有解决呀! https://github.com/caoxinyu/RedisClient mongoDB ...
- java io系列04之 管道(PipedOutputStream和PipedInputStream)的简介,源码分析和示例
本章,我们对java 管道进行学习. 转载请注明出处:http://www.cnblogs.com/skywang12345/p/io_04.html java 管道介绍 在java中,PipedOu ...
- SNMP支持IPv6
SNMP Trap 网上好像很少提到ipv6的配置文件格式,这个配置文件的格式应该为: trap2sink udp6:[fec0::]:: 创建监听的函数入口:netsnmp_udp_transp ...
- 关于Android Studio开发环境变量的设置(avd启动黑屏)
之前因为乱按网上的设置导致启动avd启动黑屏,查了很久原来是ANDROID_AVD_HOME变量没有加$符号 以下是正确的环境变量配置 添加环境变量(注意avd中有一个$符号) ANDROID_SDK ...