容器资源限制
资源限制
容器资源限制介绍:
官方文档:https://docs.docker.com/config/containers/resource_constraints/
默认情况下,容器没有资源的使用限制,可以使用主机内核调度程序允许的尽可能多的资源
Docker提供了控制容器使用资源的方法,可以限制容器使用多少内存或 CPU等, 在docker run 命令的运行时配置标志实现资源限制功能
验证内核是否支持: docker info
处理警告:WARNING: No swap limit support
swap的某个功能没有启用
解决:
vim /etc/default/grub
GRUB_CMDLINE_LINUX=" swapaccount=1"
update-grub
reboot
容器的内存限制:
Docker可以强制执行硬性内存限制,即只允许容器使用给定的内存大小
Docker也可以执行非硬性内存限制,即容器可以使用尽可能多的内存,除非内核检测到主机上的内存不够用了
内存相关选项:
官文文档:https://docs.docker.com/config/containers/resource_constraints/
容器相关内存文件:
ls /sys/fs/cgroup/memory/docker/容器id/
memory.limit_in_bytes 内存最大硬限制
memory.soft_limit_in_bytes 内存最大软限制

docker run选项取值:
b 字节
k 千字节
m 兆字节
g 千兆字节
docker run内存选项:
-m 容器最大物理内存使用,硬限制,最小允许4m
--memory-reservation 容器最大使用内存,软限制,值要比-m小才能生效
--memory-swap 使用swap内存量,必须配合-m使用
--memory-swappiness swap使用倾向,0-100,与内核参数的使用一样
--kernel-memory 容器使用内核内存的最大量,因为涉及到内核态的io,当内核内存不足时,会有io阻塞,建议不改动
--oom-kill-disable omm发生时,内核默认终止容器的大占用进城,此设置为不限制容器内存使用,不会被杀掉进程。如果使用,建议配合-m,否则不加限制可能把系统内存用完
例:限制mysql的内存使用
docker run -e MYSQL_ROOT_PASSWORD=123456 -it -m 1g --oom-kill-disable mysql:5.7.30
例: 限制tomcat的内存使用
docker run -p 8080:8080 -m 100m --oom-kill-disable -d --name t1 tomcat
#查看容器状态
docker stats
#ab压测工具访问,看看是否超过限制的资源
ab -n 50 -c 50 127.0.0.1:8080/index.jsp

限制容器的的最大内存
一次性修改:
docker run -it --rm -m 200M lorel/docker-stress-ng --vm 2 --vm-bytes 256M
cat /sys/fs/cgroup/memory/docker/容器id/memory.limit_in_bytes
动态修改:
不建议缩小内存,缩小有风险,动态增大内存可用
需要换算单位,字节
echo `echo 1024*1024*300|bc` > /sys/fs/cgroup/memory/docker/容器id/memory.limit_in_bytes
swap使用限制:
选项:
--memory-swap
不同的--memory-swap 设置会产生不同的效果:
| swap使用 | 内存使用 | 功能 |
|---|---|---|
| 正数S | 正数M | 容器内存总空间为S,物理内存为M,swap为S-M,若S=M,则没有swap,如2G的S,1G的M,2-1=1Gswap |
| 0 | 正数M | 未使用swap,相当于unset |
| unset | 正数M | 若物理机启用swap时,容器是默认2倍的M的swap |
| -1 | 正数M | 若物理机启用swap时,容器最大使用物理机全部swap |
注意: 在容器中执行free命令看到的是宿主机的内存和swap使用,而非容器自身的swap使用情况
kubernets对swap的要求:
k8s的1.8.3版本开始,宿主机开启交换分区,安装前的环境检查会报错
官方报错信息:https://github.com/kubernetes/kubernetes/blob/release-1.8/CHANGELOG-1.8.md
容器的CPU限制:
官方文档说明:https://docs.docker.com/config/containers/resource_constraints/
Linux kernel进程的调度基于CFS(Completely Fair Scheduler)算法,完全公平调度。内核和磁盘都是此算法
容器相关的CPU文件:
ls /sys/fs/cgroup/cpuset/docker/容器id/
cpuset.cpus cpu绑定在哪
cpu.shares cpu使用权重

docker run的cpu选项:
--cpus= 指定容器可使用的cpu比率,如物理机总共4核,可--cpus=1.5(4个cpu中都用一点),但必须小于物理cpu个数。docker 1.13版本新增,代替period、quota
--cpu-period= 设置CFS程序调度周期,必须与--cpu-quota一起用,默认100微秒。docker 1.13以上用--cpus
--cpu-quota=
--cpuset-cpus= cpu绑定,与nginx一样,绑定在某些cpu
0开始
1,3 2和4号cpu
0-3 1到4号cpu
--cpu-shares=1024 cpu资源使用权重。优先使用,配合cpuset时,cpuset总数超过物理cpu总数才能看到效果。宿主机多核 CPU 总数为 100%,假如容器 A 为1024,容器 B为 2048,那么容器 B 将最大是容器 A 的可用 CPU 的两倍 )
stress-ng 压力测试工具:
可以通过软件仓库进行安装,也提供了docker版本的容器
容器未做内存使用限制时,该容器可以利用到系统内存最大空间,默认创建的容器没有做内存资源限制
本身是专业的系统压测工具,也可用来做容器压测
安装:
yum/apt install -y stress-ng
docker pull lorel/docker-stress-ng
stree-ng命令:
stress-ng [OPTION [ARG]]
内存相关选项:
docker run -it --rm --name t1 lorel/docker-stress-ng 查看帮助
-m/--vm 启动worker进城数量
--vm-bytes 限制每个worker进程的最大内存,不限制时默认2^62字节
内存相关压测例子:
例:
docker run -it --rm --name t1 lorel/docker-stress-ng -m 2
docker stats t1 动态查看docker资源状态
启动时开两个线程,并限制内存最大300m
docker run -it --rm --name t1 -m 300m lorel/docker-stress-ng -m 2
docker stats t1 --no-stream
模拟oom场景
docker run -it --rm --name t1 lorel/docker-stress-ng --vm 4
docker stats --no-stream
tail /var/log/syslog 等于message文件,等待oom错误出现
内存大小软限制:
docker run -it --rm -m 256m --memory-reservation 128m --name t1 lorel/docker-stress-ng --vm 2
关闭oom机智:
docker run -it --rm -m 256m --oom-kill-disable --name t1 lorel/docker-stress-ng --vm 2 --vm-bytes 256M
交换分区限制:
docker run -it --rm -m 256m --memory-swap 512m --name c1 centos bash
CPU相关:
docker run -it --rm --name t1 lorel/docker-stress-ng |grep cpu
选项:
-c/--cpu cpu个数
--cpu-ops
-l/--cpu-load
--cpu-method
cpu压测相关例子
分4颗cpu:
docker run -it --rm --name t1 lorel/docker-stress-ng --cpu 4
docker stats --no-stream t1
限制cpu使用,比例分配:
docker run -it --rm --cpus 1.5 --name t1 lorel/docker-stress-ng --cpu 4
绑定CPU:
不建议绑在0号,因为0号默认使用,且较忙碌
docker run -it --rm --cpus 1.5 --cpuset-cpus 2-4 lorel/docker-stress-ng --cpu 4
多个容器时的cpu使用率限制:加权重
docker run -it --rm --name c1 --cpu-shares 1000 lorel/docker-stress-ng --cpu 4
docker run -it --rm --name c2 --cpu-shares 500 lorel/docker-stress-ng --cpu 4
docker stats
动态修改cpu shares:
echo重定向修改:cpu.shares

浙公网安备 33010602011771号