Docker 资源分配与限制


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以上甚至更高。


<点击跳转至开头>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

云计算-Security

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值