您的位置:首页 > 运维架构 > Docker

docker 的资源限制 总结

2016-07-29 00:00 726 查看
#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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: