限制容器占用的系统资源

  1. docker run --help

下面通过stress压力测试工具测试

内存限制

image.png
上图是内存参数
试一下
新建一个dockerfile构建镜像

FROM ubuntu
RUN apt-get update && apt-get install -y stress
ENTRYPOINT ["/usr/bin/stress"]
CMD ["--version"]


docker build -t sixmillions/stress .

image.png

docker run --memory=200M sixmillions/stress --vm 1 --verbose --timeout 5s

加上—timeout是让它停下来,不然会一直debug,除非stop掉容器.
只指定—memory的话,—memory-swap也会分配相同大小 .
我给memory分配了200M,没有分配memory-swap,默认memory-swap也会分200M,也就是说.最后是400M
image.png

docker run --memory=200M sixmillions/stress --vm 1 --verbose --vm-bytes 500M --timeout 5s

image.png
因为我们一共才给容器分了400M,用stress测试的时候要用500M,超过了容器资源限制,所以出错了
侧面反映了容器资源限制参数生效了.

cpu限制

image.png
采用的是相对权重.
举例,第一个容器设置为5,第二个容器设置为10,并且机器上就只运行了这两个容器
那他们就以1:2的比例瓜分了cpu资源.
实验一下
我们打开三个窗口
第一个窗口监测主机cpu资源
image.png
第二个窗口准备运行第一个容器testcpu5
分配cpu权重为5

docker run -it --name testcpu5 --cpu-shares=5 sixmillions/stress --cpu 1

image.png
第三个窗口准备运行第二个容器testcpu10
分配cpu权重为10

预测结果:

容器testcpu10分配的cpu资源是容器testcpu5的两倍

我们先运行第一个容器testcpu5
image.png
查看第一个窗口cpu的使用情况
image.png
可以看到这个4330的进程占据了100%cpu

接着我们运行第二容器testcpu10
image.png
观察第一个窗口
image.png
发现并没有按照比例分配,
猜想原因可能是在不同的cpu核上执行的

lscpu

image.png
发现我们是4核
验证我们的猜想
在第一窗口按F或者 shift + f
键盘上下键移动到 P = Last Used Cpu (SMP)
然后按空格,就会出现*
然后按 Q 退出
image.png
image.png
果然使用了不同核心.
我们先停掉并删除这两个容器

docker stop xxx xxx
docker rm xxx xxx

image.png
下面有两种方案测试

方法一:让他们运行在同一个cpu核心上

使用参数 --cpuset-cpus=0 指定为在0核心上运行

docker run -it --name testcpu5 --cpu-shares=5 --cpuset-cpus=0 sixmillions/stress --cpu 1

image.png
查看
image.png
运行第二个容器

docker run -it --name testcpu10 --cpu-shares=10 --cpuset-cpus=0 sixmillions/stress --cpu 1

image.png
查看效果
image.png
结果按照2:1的比例分配cpu资源

方法二:测试4个核心

还是先停掉上面运行的容器
然后使用stress的 --cpu 4 跑满四个核心

docker run -it --name testcpu5 --cpu-shares=5  sixmillions/stress --cpu 4

image.png
查看
image.png
可以看到四个核心都跑着
下面运行第二个容器

docker run -it --name testcpu10 --cpu-shares=10 --cpuset-cpus=0 sixmillions/stress --cpu 4

image.png
查看
image.png
结果并不是那么明显的比例,和我们想的有一些出入,但是不管怎么说,也是进行了cpu资源的分配,
内部使用更复杂的分配方式.

总结:

无论宿主机有多少个cpu或者内核,—cpu-shares选项都会按照比例分配cpu资源。
另外只有一个容器时—cpu-shares选项无意义。

原理

image.png
容器资源限制原理,是linux的Namespaces和文件系统.