指定docker容器可以使用的CPU份额

#查看配置份额的帮助命令
# docker run --help|grep cpu-shares
  -c, --cpu-shares int                 CPU shares (relative weight)

        CPU shares (relative weight)在创建容器时指定容器所使用的CPU份额值。cpu-shares 的值不能保证可以获得1个vcpu或者多少GHz的CPU资源,仅仅只是一个弹性的加权值。
        默认每个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-shares 512   < =可简写为= > -c 

[root@localhost ~]# docker run -it --cpu-shares 512 centos/bin/bash

[root@a628f657a785 / ]# cat /sys/fs/cgroup/cpu/cpu.shares
512

总结:
通过-c设置的cpu share 并不是CPU资源的绝对数量,而是一个相对的权重值。某个容器最终能分配到的CPU资源取决于它的cpu share占所有容器cpu share 总和的比例。通过cpushare 可以设置容器使用CPU的优先级。

比如在host中启动了两个容器:

docker run --name "container_A" -c 1024 ubuntu
docker run --name "container_B" -c 512 ubuntu

        container_A的 cpu share 1024,是container_B的两倍。当两个容器都需要CPU资源时,container_A 可以得到的CPU 是container_B的两倍。需要注意的是,这种按权重分配CPU只会发生在CPU资源紧张的情况下。如果container_A 处于空闲状态,为了充分利用CPU资源,container_B 也可以分配到全部可用的CPU。

        对多核CPU的服务器,docker还可以控制容器运行限定使用哪些cpu内核和内存节点,即使用--cpuset-cpus和--cpuset-mems参数。对具有NUMA拓扑(具有多CPU、多内存节点)的服务器尤其有用,可以对需要高性能计算的容器进行性能最优的配置。如果服务器只有一个内存节点,则--cpuset-mems的配置基本上不会有明显效果。

为什么把进程绑定到cpu上,运行效率就高?
注:当cpu数量很多时,确实需要绑定进程到cpu上,这样可以减少cpu上下文切换的开销,节约时间。
 

例:虚拟机一共有6个核心,创建的容器只能用0、1、2这三个核心。

[root@localhost ~]# docker run -it --name cpu1 --cpuset-cpus 0-2 centos bash

[root@5ffce71532e1 / ]#cat /sys/fs/cgroup/cpuset/cpuset.cpus
0-2

例:测试 cpu-shares和cpuset-cpus混合使用运行效果,就需要一个压缩力测试工具stress来让容器实例把cpu跑满,如何把cpu跑满?案例:如何把4核心的cpu中第一和第三核心跑满?

可以运行stress,然后使用taskset绑定一下cpu。

扩展:stress命令
概述: linux系统压力测试软件Stress。stress可以测试Linux系统cpu/menory/IO/disk的负载。

yum install -y epel-release
yum install stress -y

实例3:创建两个容器实例:dockerA和dockerB。让dockerA和dockerB只运行在cpu0和cpu1上,最终测试一下dockerA和dockerB使前cpu的百分比。

[root@localhost ~]# docker run -itd --name dockerA --cpuset-cpus 0,1 --cpu-shares 512 centos /bin/bash

#指定dockerA只能在cpu0和cpu1上运行,而且dockerA的使用cpu的份额512
#参数-itd就是又能打开一个伪终端,又可以在后台运行着docker 实例

[root@localhost ~]# docker run -itd --name dockeB --cpuset-cpus 0,1 --cpu-shares 1024 centos /bin/bash
#指定dockerB只能在cpu0和cpu1上运行,而且dockerB的使用cpu的份额1024,比dckerA多一倍

#进入dockerA,使用stress测试进程是不是只在cpu0,1上运行:
[root@localhost ~]# docker exec -it dockerA /bin/bash
[root@d1a431815090/]# yum install -y epel-release #安装epel扩展源

[root@d1a431815090 /]# yum install stress -y #安装stress命令e
[root@d1a431815090/]# stress -c 2 -v -t 10m  #运行2个进程,把两个cpu占满

在物理机另外一个虚拟终端上运行top命令,按1快捷键,查看每个cpu使用情况:

docker调度引擎 docker控制cpu资源_bash

docker容器资源配额控制之IO-

[root@xuegod63 ~]# docker run --help I grep write -b

--device-write-bps value    #限制此设备上的写速度,单位可以是kb、mb或者gb。
--device-read-bps value     #限制此设备上的读速度,单位可以是kb、mb或者gb。

为什么阿云平台上普通云盘的IO为: 1000 lOPS,为什么这么小?
原因是一台存储给2000台云主机使用,需要控制一下。防止某台云主机吃光你的磁盘Ⅰ/О资源

情景:防止某个Docker容器吃光你的磁盘l/О资源

例1:限制容器实例对硬盘的最高写入速度设定为1MB/s。--device 参数:将主机设备添加到容器

# mkdir -p /var/www/html/
# docker run -it -v/var/www/html/:/var/www/html --device/dev/sda:/dev/sda --device-write-bps /dev/sda:1mb centos /bin/bash

docker容器实例运行结束后自动释放资源

[root@localhost ~]# docker run --help |grep rm
--rm参数∶      作用∶当容器命令运行结束后,自动删除容器,自动释放资源
应用场景∶在某些环境下,可能需要大量的新建docker实例,然后仅仅运行几秒钟或几分钟
然后就彻底删除。如运行单元测试或测试弹性云计算。‘
例︰阿里云,要模拟双11的压力,需要快速创建1万docker实例,每个docker容器实例中都运行ab命令,拼命访问tmall.com首页,运行1个小时,1小时后自动删除。

docker run -it --rm --name conname centos sleep 5  #5秒后自动退出
docker run -it -m 128m centos    #允许使用的最大内存128m

#创建一个docker,只使用两个cpu核心,只能使用128M内存
docker run -it --cpuset-cpu 0,1 -m 128m centos