Docker容器进程系统资源限制的最佳实践思考与试验

docker进程的系统资源限制

【本文参考自】:
https://www.cnblogs.com/edisonchou/p/docker_resource_limitation_introduction.html
https://hub.docker.com/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://hub.docker.com/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%)

你可能感兴趣的:(操作系统)