目录
- 1、CPU
- 2、内存
- 3、磁盘
Host 宿主机:1C/2G 50G 配置
1、CPU
默认情况下所有容器平等使用 Host 宿主机 CPU 资源,Docker 通过 -c 或 --cpu-shares 参数来指定容器使用 CPU 的权重
。如果在运行容器时不指定,则权重值默认为 1024。接下来启动两个容器来做测试:
A 容器:权重1024
docker run -it --name=cpu_a -c 1024 progrium/stress --cpu 1
# --cpu:表示工作线程数
B 容器:权重512
docker run -it --name=cpu_b -c 512 progrium/stress --cpu 1
top 查看宿主机的 CPU 资源消耗情况:
- 66.3 为 A 容器消耗的 CPU
- 33.0 为 B 容器消耗的 CPU
通过上图结果,那是不是表明权重值越高,占用 CPU 的时间就越多呢?
这并不一定,一般这种按权重分配 CPU 只会发生在 CPU 资源紧张的情况下,怎么理解呢,如果 A 容器处于空闲状态,此时为了 CPU 资源的充分利用,B 容器也可以分到全部可用 CPU。
此时,如果我停掉权重为 1024 的容器 cpu_a,再来看看权重为 512 的容器 cpu_b 占用的 CPU:
docker pause cpu_a
top 查看宿主机的 CPU 资源消耗情况:
可以看到,尽管我的容器 B 的权重值为 512,但如果比容器 B 容器大的其他容器不占用 CPU 或对 CPU 的占用少时,权重小的容器依然能够充分利用 CPU 资源。
2、内存
默认情况下 Docker 运行的容器对宿主机的物理内存/swap交换内存
的使用是无限制的,为了避免过多容器使用过多内存导致 Host 的资源消耗殆尽,因此我们需要按照实际情况来对容器进行合理的物理内存/swap交换内存
分配。具体分配指令如下:
docker run -m 200M --memory-swap=300M <image>
# 【-m(或--memory):物理内存】表示该容器允许使用的最大物理内存。默认值为-1,表示无限制
# 【--memory-swap:物理内存+虚拟内存】表示该容器允许使用的最大 swap 交换内存。默认值为-1,表示无限制
示例:
docker run -itd -m 200M --memory-swap=300M centos:7.9.2009
需注意的是:
- 如果只指定 -m,则 --memory-swap 默认为 -m 的两倍;
- 如果 -m 的值等于 --memory-swap 的值,那将无法使用 swap 交换分区。
我们可以使用 progrium/stress 镜像来进行压力测试:
- 启动一个内存工作线程,且每个线程分配 280M 内存
[root@qcloud opt]# docker run -it -m 200M --memory-swap=300M progrium/stress --vm 1 --vm-bytes 280M
stress: info: [1] dispatching hogs: 0 cpu, 0 io, 1 vm, 0 hdd
stress: dbug: [1] using backoff sleep of 3000us
stress: dbug: [1] --> hogvm worker 1 [6] forked
stress: dbug: [6] allocating 293601280 bytes ...
stress: dbug: [6] touching bytes in strides of 4096 bytes ...
stress: dbug: [6] freed 293601280 bytes
stress: dbug: [6] allocating 293601280 bytes ...
stress: dbug: [6] touching bytes in strides of 4096 bytes ...
...
...
# --vm:指定内存工作线程数
# --vm-bytes:指定每个内存工作线程数分配的大小
- 模拟内存分配超过指定的可使用内存大小
[root@qcloud opt]# docker run -it -m 200M --memory-swap=300M progrium/stress --vm 1 --vm-bytes 310M
stress: info: [1] dispatching hogs: 0 cpu, 0 io, 1 vm, 0 hdd
stress: dbug: [1] using backoff sleep of 3000us
stress: dbug: [1] --> hogvm worker 1 [6] forked
stress: dbug: [6] allocating 325058560 bytes ...
stress: dbug: [6] touching bytes in strides of 4096 bytes ...
stress: FAIL: [1] (416) <-- worker 6 got signal 9
stress: WARN: [1] (418) now reaping child worker processes
stress: FAIL: [1] (422) kill error: No such process
stress: FAIL: [1] (452) failed run completed in 1s
# 可看到 kill error: No such process
3、磁盘
这里主要说的是磁盘 IO 读写情况,默认情况下,所有容器平等读写宿主机磁盘,与 CPU 资源类似,也是通过 --blkio-weight 参数设置权重值(默认为 500
)来分配宿主机资源。启动两个容器来做测试:
A 容器:权重600
docker run -it --name disk_a --blkio-weight 600 centos:7.9.2009
B 容器:权重300
docker run -it --name disk_b --blkio-weight 300 centos:7.9.2009
与 CPU 资源利用类似,A 容器磁盘读写带宽为 B 容器的两倍数。
如何限制 bps 和 iops ?
bps:每秒读写数据量
iops:每秒 IO 次数
- –device-read-bps
- –device-write-bps
- –device-read-iops
- –device-write-iops
具体案例:
- 限制
# 限制容器使用宿主机的磁盘IO
# /dev/vda 为宿主机的磁盘设备,限制该容器每秒最多可向宿主机写30MB的数据
[root@qcloud test]# docker run -it --device-write-bps /dev/vda:30MB centos:7.9.2009
[root@03e61211de28 /]# time dd if=/dev/zero of=test_file.out bs=1M count=1000 oflag=direct
1000+0 records in
1000+0 records out
1048576000 bytes (1.0 GB) copied, 33.3441 s, 31.4 MB/s
real 0m33.353s
user 0m0.003s
sys 0m0.224s
从结果可看出,基本在30MB左右。
- 不限制
[root@qcloud test]# docker run -it centos:7.9.2009
[root@fa7ff773d45e /]# time dd if=/dev/zero of=test_file.out bs=1M count=1000 oflag=direct
1000+0 records in
1000+0 records out
1048576000 bytes (1.0 GB) copied, 22.8758 s, 45.8 MB/s
real 0m22.877s
user 0m0.010s
sys 0m0.276s
从结果可看出,不做限制的情况下,基本在45MB以上甚至更高。