目录
指定docker容器可以使用的cpu份额
#查看配置份额的帮助命令:
[root@xianchaomaster1~]#dockerrun--help|grepcpu-shares
cpu配额参数:-c,--cpu-sharesint
CPUshares(relativeweight)在创建容器时指定容器所使用的CPU份额值。cpu-shares的值不能保证可以获得1个vcpu或则多少GHz的CPU资源linux系统安装,仅仅只是一个弹性的加残差。
默认每位docker容器的cpu份额值都是1024。在同一个CPU核心上,同时运行多个容器时,容器的cpu加权的疗效能够彰显下来。
例:两个容器A、B的cpu份额分别为1000和500,结果会如何样?
情况1:A和B正常运行,占用同一个CPU,在cpu进行时间片分配的时侯,容器A比容器B多一倍的机会获得CPU的时间片。
情况2:分配的结果取决于当时其他容器的运行状态。例如容器A的进程仍然是空闲的,这么容器B是可以获取比容器A更多的CPU时间片的;例如主机上只运行了一个容器,虽然它的cpu份额只有50,它也可以独占整个主机的cpu资源。
cgroups只在多个容器同时争抢同一个cpu资源时,cpu配额才能生效。为此,难以单纯依据某个容器的cpu份额来确定有多少cpu资源分配给它,资源分配结果取决于同时运行的其他容器的cpu分配和容器中进程运行情况。
例1:给容器实例分配512权重的cpu使用份额
参数:--cpu-shares512
[root@xianchaomaster1~]#dockerrun-it--cpu-shares512centos/bin/bash
[root@df176dd75bd4/]#cat/sys/fs/cgroup/cpu/cpu.shares#查看结果:
512
注:稍后,我们启动多个容器,测试一下是不是只能使用512份额的cpu资源。单独一个容器,看不下来使用的cpu的比列。因没有docker实例同此docker实例竞争。
总结:
通过-c设置的cpushare并不是CPU资源的绝对数目docker 配置linux命令tar,而是一个相对的权重值。某个容器最终能分配到的CPU资源取决于它的cpushare占所有容器cpushare总和的比列。通过cpushare可以设置容器使用CPU的优先级。
例如在host中启动了两个容器:
dockerrun--name”container_A”-c1024ubuntu
dockerrun--name”container_B”-c512ubuntu
container_A的cpushare1024,是container_B的两倍。当两个容器都须要CPU资源时,container_A可以得到的CPU是container_B的两倍。
须要注意的是,这些按权重分配CPU只会发生在CPU资源紧张的情况下。假如container_A处于空闲状态,为了充分借助CPU资源,container_B也可以分配到全部可用的CPU。
CPUcore核心控制
参数:--cpuset可以绑定CPU
对多核CPU的服务器,docker还可以控制容器运行限定使用什么cpu内核和显存节点,即使用--cpuset-cpus和--cpuset-mems参数。对具有NUMA拓扑(具有多CPU、多显存节点)的服务器尤其有用,可以对须要高性能估算的容器进行性能最优的配置。假如服务器只有一个显存节点,则--cpuset-mems的配置基本上不会有显著疗效。
例:
linux可通过lscpu查看存在的CPU
dockerrun-itd--cpuset-cpus0,1,2,3centos:stress/bin/bash
或则
dockerrun-itd--cpuset-cpus0-3centos:stress/bin/bash
该容器内的进程只会在0,1,2,3,的CPU上运行
扩充:
服务器构架通常分:SMP、NUMA、MPP体系结构介绍
从系统构架来看,目前的商用服务器大体可以分为三类:
1.即对称多处理器结构(SMP:SymmetricMulti-Processor)例:x86服务器,双路服务器。显卡上有两个数学cpu
2.非一致储存访问结构(NUMA:Non-UniformMemoryAccess)例:IBM大型机pSeries690
3.海量并行处理结构(MPP:MassiveParallelProcessing)。例:小型机Z14
CPU配额控制参数的混和使用
在里面那些参数中,cpu-shares控制只发生在容器竞争同一个cpu的时间片时有效。
假如通过cpuset-cpus指定容器A使用cpu0,容器B只是用cpu1,在主机上只有这两个容器使用对应内核的情况,它们各自占用全部的内核资源,cpu-shares没有显著疗效。
怎么能够有疗效?
容器A和容器B配置上cpuset-cpus值并都绑定到同一个cpu上,之后同时占据cpu资源,就可以看出疗效了。
例1:测试cpu-shares和cpuset-cpus混和使用运行疗效,就须要一个压缩力测试工具stress来让容器实例把cpu跑满。
怎样把cpu跑满?
怎样把4核心的cpu中第一和第三核心跑满?可以运行stress,之后使用taskset绑定一下cpu。
先扩充:stress命令
概述:linux系统压力测试软件Stress。
[root@xianchaomaster1~]#yuminstall-yepel-release
[root@xianchaomaster1~]#yuminstallstress-y
stress参数解释
-?显示帮助信息
-v显示版本号
-q不显示运行信息
-n显示已完成的指令情况
-t--timeoutN指定运行N秒后停止
--backoffN等待N微妙后开始运行
-c形成n个进程:每位进程都反复不停的估算随机数的平方根,测试cpu
-i形成n个进程:每位进程反复调用sync(),sync()用于将显存上的内容讲到硬碟上,测试c盘io
-m--vmn形成n个进程,每位进程不断调用显存分配malloc()和显存释放free()函数docker 配置,测试显存
--vm-bytesB指定malloc时显存的字节数(默认256MB)
--vm-hangN指定在free栈的秒数
-d--haddn形成n个执行write和unlink函数的进程
-hadd-bytesB指定写的字节数
--hadd-noclean不unlink
注:时间单位可以为秒s,分m,小时h,天d,年y,文件大小单位可以为K,M,G
例1:形成2个cpu进程,2个io进程,20秒后停止运行
[root@xianchaomaster1]#stress-c2-i2--verbose--timeout20s
#倘若执行时间为分钟,改20s为1m