目录

  • 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 资源消耗情况:

cpu满 docker跑jar docker 默认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 资源消耗情况:

cpu满 docker跑jar docker 默认cpu核数_物理内存_02

可以看到,尽管我的容器 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以上甚至更高。