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