docker 的资源限制 总结

#docker 的资源 Docker的一个很大的特性就是能够对各类资源作隔离以及限制。这些资源包括CPU、内存、网络、硬盘,关于内存、网络、硬盘的资源限制都比较好理解,无非就是分多少用多少。html

常见的计算机资源一般都(CPU,内存,硬盘,网络),而docker 的资源管控 也从 这几个方面入手,随便说说.我在实际使用中发现的一些 疑惑点node

CPU

docker 的cpu 控制 总体上来讲,都是docker 自带的,而按 功能来分 的话 ,能够分为docker

  • 共享:--cpu-shares, 经过设置对应的权重参数来控制CPU的分配, 例如 A --cpu-shares 1024 B --cpu-shares 512 那么 若是都跑满 A 将占有2/3 cpu 时间 ,B是 1/3 ,可是 当 A 不使用时 ,B 是能用使用所有的 CPU 资源的
  • 独占:--cpuset-cpus 能够设置容器执行在具体 的 某个或者某几个核上。core 编号 从0 开始
    • 现象:在测试中 我发现 核Id 是能够反复写,也就是 docker 并不会 管 这个 core 是否 被 独占,依然是一种共享的状态下。那么问题来了
    • 现象: 如今在测试环境下搭建都用的是 使用swarm 搭建的 docker 集群 ,而 swarm 的 调度策略有 spread, binpack, random.
      • random 不用都说
      • spread 默认策略,及那一台host 运行的 容器少,就在那一台运行,这个是经过计数来实现的
      • binpack 这个是尽量得集中运行
    • 问题 , 若是在 以售卖 资源的 业务模式下 ,cpu 得不到记录, 不能合理的划分 (有问题能够细说) ,缺乏一种记录机制,

内存

docker 的内存 ,以 测试虚拟机 (16G 内存) , 分给docker 能使用的内存 是 14.5G 左右centos

  • 设置内存 -m, --memory 若是只 设置这个参数的话, 当容器中程序使用内存超过这个值,则程序死,可是容器不会死
  • 限制内存 --memory-swap :若是使用内存超过 设置的值 ,则 容器 也会被kill

磁盘IO

磁盘 自己 能够经过挂载 数据盘 ,来扩展 容器 默认的10G 空间bash

  • 基于权重
    • --blkio-weight Block IO (relative weight), between 10 and 1000
    • --blkio-weight-device=[] Block IO weight (relative device weight)
  • 精细控制
    • --device-read-bps=[] Limit read rate (bytes per second) from a device
    • --device-read-iops=[] Limit read rate (IO per second) from a device
    • --device-write-bps=[] Limit write rate (bytes per second) to a device
    • --device-write-iops=[] Limit write rate (IO per second) to a device 经过 参数 来 精细控制 我没有成功(其应该是控制外部挂载盘的),可是我采用了另一种办法 ,成功的如今住了 IO 速度
  1. 随意建立一个镜像
    docker run -it centos bash
  2. 执行 mount 得到 映射
在第一行,获取挂载   /dev/mapper/docker-8:2-269944452-33b4de5fe561162ca07d8a5b9acc43920902f131edff9a56a0aa3b3f1b46b925 on / type xfs (rw,relatime,nouuid,attr2,inode64,logbsize=64k,sunit=128,swidth=128,noquota)

或者 使用外部命令,来获取挂载网络

sudo /usr/bin/nsenter --target $(docker inspect -f '{{ .State.Pid }}' $CONTAINER_ID) --mount --uts --ipc --net --pid mount | head -1 | awk '{ print $1 }'
  1. 而后在宿主机上执行:
sudo systemctl set-property --runtime docker-{$CONTAINER_ID}.scope "BlockIOWriteBandwidth=/dev/mapper/docker-8:2-269944452-33b4de5fe561162ca07d8a5b9acc43920902f131edff9a56a0aa3b3f1b46b925 {IO速度}"
  1. 测试
    • 没有限速
    [root@97dfbe989adb /]# time $(dd if=/dev/zero of=testfile0 bs=1000 count=100000 && sync)

100000+0 records in 100000+0 records out 100000000 bytes (100 MB) copied, 0.685456 s, 146 MB/s real 0m7.292s user 0m0.089s sys 0m0.619s * 限速 10m [root@97dfbe989adb /]# time $(dd if=/dev/zero of=testfile0 bs=1000 count=100000 && sync) 100000+0 records in 100000+0 records out 100000000 bytes (100 MB) copied, 0.615627 s, 162 MB/s real 0m10.887s user 0m0.084s sys 0m0.589s ``` 能够看到速度变化 明显app

网络

在如今的网络中咱们搭建的都是 overlay 的网络。而在网络方面的限制 docker 自己为0 ,这来自于docker 自己的设计思想。dom

  • 自身: 无网卡限速
  • 第三方:
    • 在外部动刀 openswitch 的ops http://www.aixchina.net/club/thread-123385-1-1.html
    • 内部动刀(tc(镜像中没有此命令 去要安装)),启动容器时 须要加下面的参数 yum -y install iproute tc qdisc add dev eth0 root tbf rate 50kbit latency 50ms burst 1000 (在个人 虚拟机测试中差6.6倍,其对应的测试下载速度为330K) 删除此规则 :tc qdisc del dev eth0 root tbf 没有作 限速 能有 70M/s
相关文章
相关标签/搜索