#docker 的资源 Docker的一个很大的特性就是可以对各种资源做隔离以及限制。这些资源包括CPU、内存、网络、硬盘,关于内存、网络、硬盘的资源限制都比较好理解,无非就是分多少用多少。
常见的计算机资源通常都(CPU,内存,硬盘,网络),而docker 的资源管控 也从 这几个方面入手,随便说说.我在实际使用中发现的一些 疑惑点
CPU
docker 的cpu 控制 整体上来说,都是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 左右
- 设置内存 -m, --memory 如果只 设置这个参数的话, 当容器中程序使用内存超过这个值,则程序死,但是容器不会死
- 限制内存 --memory-swap :如果使用内存超过 设置的值 ,则 容器 也会被kill
磁盘IO
磁盘 本身 可以通过挂载 数据盘 ,来扩展 容器 默认的10G 空间
- 基于权重
- --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 速度
- 随意创建一个镜像
docker run -it centos bash - 执行 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 }'
- 然后在宿主机上执行:
sudo systemctl set-property --runtime docker-{$CONTAINER_ID}.scope "BlockIOWriteBandwidth=/dev/mapper/docker-8:2-269944452-33b4de5fe561162ca07d8a5b9acc43920902f131edff9a56a0aa3b3f1b46b925 {IO速度}"
- 测试
- 没有限速
[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 ``` 可以看到速度变化 明显
网络
在现在的网络中我们搭建的都是 overlay 的网络。而在网络方面的限制 docker 本身为0 ,这来自于docker 本身的设计思想。
- 自身: 无网卡限速
- 第三方:
- 在外部动刀 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