docker分配CPU、内存资源

1 CPU 资源

参数 类型 说明
--cpu-period int 是用来指定容器对CPU的使用要在多长时间内做一次重新分配
--cpu-quota int 是用来指定在这个周期内,最多可以有多少时间用来跑这个容器
--cpu-rt-period int 是用来指定容器对CPU的使用要在多长时间内做一次重新分配(微秒限制CPU实时周期)
--cpu-rt-runtime int 是用来指定在这个周期内,最多可以有多少时间用来跑这个容器(微秒限制CPU实时运行时间)
--cpu-shares或-c int CPU份额(相对权重)
--cpus int CPU数量
--cpuset-cpus string 允许执行的CPU 根据实际情况配置
--cpuset-mems string 只应用于 NUMA 架构的 CPU 生效,关于这个选项这里不过多介绍

1.1  通过参数–cpu-shares分配cpu使用权重

现在运行两个测试 container,一个权重设置为 2,一个权重设置 4,启动命令如下:

docker run -it -d --cpu-shares 2 --name 2_cpu
docker run -it -d --cpu-shares 4 --name 4_cpu

通过压测工具如Stress进行压测,Stress使用实例:

产生13个cpu进程4个io进程1分钟后停止运行

stress -c 13 -i 4 --verbose --timeout 1m

 向磁盘中写入固定大小的文件,这个文件通过调用mkstemp()产生并保存在当前目录下,默认是文件产生后就被执行unlink(清除)操作,但是可以使用–hdd-bytes选项将产生的文件全部保存在当前目录下,这会将你的磁盘空间逐步耗尽

# 生成小文件
# stress -d 1 --hdd-noclean --hdd-bytes 13
# 生成大文件
# stress -d 1 --hdd-noclean --hdd-bytes 3G

在宿主机中查看两个容器CPU占用情况

# docker stats 2_cpu
# docker stats 4_cpu

1.2 通过 –cpu-period & –cpu-quota 限制容器的 CPU 使用上限

  默认的 CPU CFS「Completely Fair Scheduler」period 是 100ms。我们可以通过 –cpu-period 值限制容器的 CPU 使用。一般 –cpu-period 配合 –cpu-quota 一起使用。

  为啥把这两个参数放一起呢?因为这两个参数是相互配合的,–cpu-period和–cpu-quota的这种配置叫Ceiling Enforcement Tunable Parameters,–cpu-shares的这种配置叫Relative Shares Tunable Parameters。–cpu-period是用来指定容器对CPU的使用要在多长时间内做一次重新分配,而–cpu-quota是用来指定在这个周期内,最多可以有多少时间用来跑这个容器。跟–cpu-shares不同的是这种配置是指定一个绝对值,而且没有弹性在里面,容器对CPU资源的使用绝对不会超过配置的值。cpu-period和cpu-quota的单位为微秒(μs)

  比如说A容器配置的–cpu-period=100000 --cpu-quota=50000,那么A容器就可以最多使用50%个CPU资源,如果配置的–cpu-quota=200000,那就可以使用200%个CPU资源。

# docker run -it --cpu-period=100000 --cpu-quota=50000

1.3 cpus设置CPU数量

主要不可以超出核心数,不然会报错

# docker run -d --cpus 1.21 

1.4 cpuset-cpus允许执行的CPU

 允许执行的CPU 根据实际情况配置  

#docker run -d --cpuset-cpus 0-1
#docker run -d --cpuset-cpus 1,3

2 内存资源

2.1 通过 -m 参数限制内存大小

  设置-m值为500Mb,表示容器程序使用内存受限。如果指定 -m 内存限制时不添加 –memory-swap 选项,则表示容器中程序可以使用 500m内存和500m swap 内存。那么容器里程序可以跑到500m*2=1g后才会被oom给杀死。

# docker run -it -d -m 500m --name limit_memory_1
# docker stats limit_memory_1

2.2 参数–memory-swappiness=0 表示禁用容器 swap 功能。

# docker run -it -d -m 500m --memory-swappiness=0

2.3 指定限制内存大小并且设置 memory-swap 值为 -1

 表示容器程序使用内存受限,而 swap 空间使用不受限制(宿主 swap 支持使用多少则容器即可使用多少。如果 –memory-swap 设置小于 –memory 则设置不生效,使用默认设置)。–memory-swap -1

# docker run -it -d -m 500m --memory-swap -1 

2.4  指定限制内存大小并且设置 memory-swap 值

 指定限制内存大小500Mb并且设置 memory-swap 值400Mb当压测值是900Mb时,则容器中的进程会被直接 OOM kill。

# docker run -it -d -m 500m --memory-swap 400m 

2.5 参数–oom-kill-disable ,加上之后则达到限制内存之后也不会被 kill

 正常情况不添加 –oom-kill-disable 容器程序内存使用超过限制后则会直接 OOM kill,加上之后则达到限制内存之后也不会被 kill。

#docker run -it -d -m 500m --oom-kill-disable

 

posted @ 2022-03-22 23:18  滔天蟹  阅读(2654)  评论(0编辑  收藏  举报