docker 的资源限制 总结
2016-07-29 00:00
726 查看
#docker 的资源
Docker的一个很大的特性就是可以对各种资源做隔离以及限制。这些资源包括CPU、内存、网络、硬盘,关于内存、网络、硬盘的资源限制都比较好理解,无非就是分多少用多少。
常见的计算机资源通常都(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 得不到记录, 不能合理的划分 (有问题可以细说) ,缺少一种记录机制,
设置内存 -m, --memory 如果只 设置这个参数的话, 当容器中程序使用内存超过这个值,则程序死,但是容器不会死
限制内存 --memory-swap :如果使用内存超过 设置的值 ,则 容器 也会被kill
基于权重
--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 获得 映射
或者 使用外部命令,来获取挂载
然后在宿主机上执行:
测试
没有限速
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
[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
```
可以看到速度变化 明显
自身: 无网卡限速
第三方:
在外部动刀 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
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
相关文章推荐
- docker资源限制和应用总结
- docker技术剖析--docker资源限制及应用总结 for centos7.2
- docker 资源限制以及应用的总结 推荐
- docker资源限制及应用总结
- docker技术剖析--docker资源限制及应用总结 推荐
- Docker背后的内核知识——cgroups资源限制
- Cgroup的CPU资源隔离介绍&docker cpu限制
- Docker核心原理-资源隔离和限制
- docker学习笔记2 -- 资源限制
- Docker背后的内核知识——cgroups资源限制(转)
- docker cgroups 资源限制
- Docker 资源限制之 IO
- docker高级应用之cpu与内存资源限制
- docker对资源的限制
- window服务程序突破限制访问网络共享资源总结
- docker内存及cpu限制(不断总结中)
- Docker 运行时资源限制
- docker高级应用之cpu与内存资源限制(转)
- docker的资源隔离---cpu、内存、磁盘限制
- Docker CPU 资源限制——CPU分片功能测试