docker进程的系统资源限制
【本文参考自】:
https:///r/lorel/docker-stress-ng/
- 默认情况下,容器是没有资源限制的,它会尽可能地使用宿主机能够分配给它的资源。
- linux系统内存资源不足的时候就会抛出OOM,之后会开始随机释放用户进程资源,很可能会造成系统崩溃。(提供足够的系统资源,做好业务进程资源隔离,防止内存泄漏)
- 其中,做好资源隔离和资源分配在docker容器进程看来是相当重要的。
- 当然作为业务进程本身也要做好资源限制,就好像JVM,在启动的时候应该利用JVM的最大堆空间的JVM参数做好限制,防止影响到系统内的其他进程。而不是完全依赖容器的隔离能力。(毕竟docker容器的隔离能力可能不靠谱)
- 根据操作系统对进程的定义,容器进程也是一种操作系统进程,和内存进程一样分享着主机资源。他们唯一的差别就是异常中断级别不一样(早就了权限级别不一样)。
参数介绍
限制内存:
限制docker 容器进程的内存被细分为:
- 物理内存 -m或者 --memory
- 交换区内存 --memory-swap
- 内核内存(内核的物理内存) --kernel-memory
限制CPU资源
由于CPU的资源使用是由调度程序决定的,因此我们只是把期望的效果传递给操作系统,具体的限制效果得有操作系统的实现策略来决定。
(就好我们只管提需求给操作系统,而实现的效果就看人了。)
关于CPU的限制,根据【操作系统原理】,体现在亲和性的限制和时间片限制(时间片的限制指的就是CPUI的可用核数)
- 指定容器进程的可用内核数,–cpus=3.5,表示可用3.5个核心。
- 指定亲和性(指定在哪个内核跑), --cpuset-cpus="0,1,3"指定在0号,1号,3号CPU上运行容器进程。
验证Docker资源限制
- 先了解自己VM的性能
$ lscpu
$ free -m
- 拉取docker官方的压测程序
:https:///r/lorel/docker-stress-ng/
docker pull lorel/docker-stress-ng
- 验证步骤为:
- 限制docker容器进程资源压测内存
- 检测容器进程资源使用率。
- 不限制docker容器进程资源压测内存
= 检测容器进程资源使用率。
(压测CPU也是一样的套路)
- 检测docker容器进程的命令是
docker stats 容器ID
- 通过传递参数给压测程序 docker-stress-ng 来模拟压力。
–vm 2
表示开启2个内存占用进程,每个默认占用256M
(可以改默认值,如:–vm-bytes 1024M 调到1G)
- 压测CPU时,通过给 docker-stress-ng 来传递参数 --cpu 4 模拟CPU压力。
–cpu 4
表示创建4个进程。
(顺便提醒,200%的CPU使用率,意思为,运行的进程数为内核数的2倍)
完整的试验用例,如下:
# 模拟2个256M的进程在限制为256M内存的docker容器运行
> docker run --name stress -it --rm -m 256m lorel/docker-stress-ng:latest stress --vm 2
# 检测docker容器状态
> docker stats stress
预计内存占用为256M
# 模拟2个256M的进程在无限制内存的docker容器运行
> docker run --name stress -it --rm lorel/docker-stress-ng:latest stress --vm 2
# 检测docker容器状态
> docker stats stress
预计内存占用为1024M
-------------------
# 模拟8个进程在限制为单核CPU的docker容器运行
> docker run --name stress -it --rm --cpus 1 lorel/docker-stress-ng:latest stress --cpu 8
# 检测docker容器状态
> docker stats stress
预计CPU%为 100%
# 模拟8个进程在无限制CPU数的docker容器运行
> docker run --name stress -it --rm lorel/docker-stress-ng:latest stress --cpu 8
# 检测docker容器状态
> docker stats stress
预计CPU% 大于 100% (如果是2核,预计为 400%,如果为4核心,预计为200%)