容器资源限制

资源限制

容器资源限制介绍:

官方文档:https://docs.docker.com/config/containers/resource_constraints/

默认情况下,容器没有资源的使用限制,可以使用主机内核调度程序允许的尽可能多的资源
Docker提供了控制容器使用资源的方法,可以限制容器使用多少内存或 CPU等, 在docker run 命令的运行时配置标志实现资源限制功能

验证内核是否支持: docker info

处理警告:WARNING: No swap limit support
swap的某个功能没有启用

官方文档:https://docs.docker.com/install/linux/linux-postinstall/#your-kernel-does-not-support-cgroup-swap-limit-capabilities

解决:
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 	内存最大软限制

image

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

image

限制容器的的最大内存

一次性修改:
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使用权重

image

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

posted @ 2022-02-24 19:38  suyanhj  阅读(321)  评论(0)    收藏  举报