Docker 的资源限制
官方文档: https://docs.docker.com/config/containers/resource_constraints/
namespace和control group是docker的核心技术
control group是实现资源限制的核心技术,依赖于内核
默认情况下,容器没有资源的使用限制,可以使用主机内核调度程序允许的尽可能多的资源
其中许多功能都要求宿主机的内核支持,要检查是否支持这些功能,可以使用docker info 命令 ,如果内核中的某项特性可能会在输出结尾处看到警告, 如下所示:
WARNING: No swap limit support 没有启用swap限制功能会出现此提示警报
修改内核参数消除以上警告
[root@ubuntu2204 ~]#vim /etc/default/grub
GRUB_CMDLINE_LINUX="net.ifnames=0 cgroup_enable=memory swapaccount=1"
[root@ubuntu2204 ~]#update-grub
[root@ubuntu2204 ~]#reboot
OOM (Out of Memory Exception)
对于 Linux 主机,如果没有足够的内存来执行其他重要的系统任务,将会抛出OOM (Out of Memory Exception,内存溢出,内存泄漏,内存异常 ),随后系统会开始杀死进程以释放内存, 凡是运行在宿主机 的进程都有可能被 kill ,包括 Dockerd和其它的应用程序, 如果重要的系统进程被 Kill,会导致和该进 程相关的服务全部宕机.通常越消耗内存比较大的应用越容易被kill,比如: MySQL数据库,Java程序等
OOM 优先级机制:
linux会为每个进程计算一个分数,最终将分数最高的kill
/proc/PID/oom_score_adj
#范围为-1000到1000,值越高容易被宿主机 kill掉,如果将该值设置为-1000,则进程永远不会被宿主机 kernel kill
/proc/PID/oom_adj
#范围为-17到+15,取值越高越容易被干掉,如果是-17,则表示不能被kill,该设置参数的存在是为了和旧版本的Linux内核兼容.
/proc/PID/oom_score
#这个值是系统综合进程的内存消耗量,CPU时间(utime+存活时间(uptime - start time) 和oom_adj计算出的进程得分,消耗内存越多得分越高,容易被宿主机kernel强制杀死
查看oom相关值
[root@ubuntu2004 ~]#ps aux |grep docker
得出dockerd的进程号
查看adj值
[root@ubuntu2004 ~]#cat /proc/95087/oom_adj
-8
查看oom_score_adj值
[root@ubuntu2004 ~]#cat /proc/95087/oom_score_adj
-500
查看oom_score的值
[root@ubuntu2004 ~]#cat /proc/95087/oom_score
343
更改oom相关值
[root@ubuntu2004 ~]#cat /proc/95087/oom_adj
-8
更改值:
[root@ubuntu2004 ~]#echo -17 > /proc/95087/oom_adj
[root@ubuntu2004 ~]#cat /proc/95087/oom_adj
-17
Stress-ng 压力测试工具
官方文档:https://wiki.ubuntu.com/Kernel/Reference/stress-ng
Docker 镜像:lorel/docker-stress-ng
stress-ng 安装
容器方式安装
[root@ubuntu2004 ~]#docker pull lorel/docker-stress-ng
查看帮助
[root@ubuntu2004 ~]#docker run --name stress-ng lorel/docker-stress-ng
Example: stress-ng --cpu 8 --io 4 --vm 2 --vm-bytes 128M --fork 4 --timeout 10s
关闭swap分区
关闭swap分区的三种办法
一:swapoff -a #临时关闭
二:cat /etc/fstab #注释或者删除awap
三:systemctl mask swap.target #重启
容器的内存限制
1、-m 限制内存
2、--memory reservation 允许指定小于 --memory 的软限制 ,当 Docker 检测到主机上的争用或 内存不足时会激活该限制,如果使-- memory-reservation,则必须将 其设置为低于 --memory 才能使其优先生效. 因为它是软限制,所以 不能保证容器不超过限制
3、--oom-kill-disable 发生内存不足的错误,内核不会终止容器中的进程,配合-m使用
使用stress-ng测试内存限制
1、-m
假如一个容器未做内存使用限制,则该容器可以利用到系统内存最大空间,默认创建的容器没有做内存资源限制.
范例: 默认一个workers 分配256M内存,2个即占512M内存
docker run --name c1 -it --rm lorel/docker-stress-ng --vm 2
在另一个终端串口执行命令查看内存使用情况
docker stats --no-stream
停掉原来的容器,宿主机限制容器最大内存使用,申请256,最多给200
docker run -it --rm --name c1 -m 200M lorel/docker-stressng --vm 2 --vm-bytes 256M
查看宿主机基于 cgroup 对容器进行内存资源的大小限制
cat /sys/fs/cgroup/memory/docker/f69729b2acc16e032658a4efdab64d21ff97dcb6746d1cef451 ed82d5c98a81f/memory.limit_in_bytes
209715200
动态修改内存限制
echo 314572800 > /sys/fs/cgroup/memory/docker/f69729b2acc16e032658a4efdab64d21ff97dcb6746d1cef451 ed82d5c98a81f/memory.limit_in_bytes
cat /sys/fs/cgroup/memory/docker/f69729b2acc16e032658a4efdab64d21ff97dcb6746d1cef451 ed82d5c98a81f/memory.limit_in_bytes
314572800
在另一个终端串口执行命令查看内存使用情况
docker stats --no-stream
2、--memory reservation 内存大小软限制,软限制的设置不能超过硬限制
范例:允许超过128m的软限制,不允许超过256的硬限制
docker run -it --rm -m 256m --memory-reservation 128m -- name c1 lorel/docker-stress-ng --vm 2 --vm-bytes 256M
在另一个终端串口执行命令查看内存使用情况
docker stats --no-stream
查看宿主机基于 cgroup 对容器进行内存资源的大小软限制
#cat /sys/fs/cgroup/memory/docker/aeb38acde58155d421f998a54e9a99ab60635fe00c9070da050 cc49a2f62d274/memory.soft_limit_in_bytes
134217728
3、--oom-kill-disable 发生内存不足的错误,内核不会终止容器中的进程,配合-m使用
范例:docker run -e MYSQL_ROOT_PASSWORD=123456 -it --rm -m 1g --oom-kill-disable mysql:5.7.30
容器的CPU限制
1、--cpus= 指定一个容器可以使用多少个可用的CPU核心资源.例如,如果主机有两个 CPU,如果设置了 --cpus="1.5" ,则可以保证容器最多使用1.5个的CPU (每个CPU都会用,累加起来使用1.5个CPU)
2、--cpuset-cpus CPU绑定
使用压力-ng测试Cpu配置
1、--cpus=
查看当前cpu
lscpu |grep cpu
占用4个CPU资源.但只是平均的使用CPU资源
docker run -it --rm --name c1 lorel/docker-stress-ng --cpu 4
在另一个终端串口执行命令查看内存使用情况
docker stats --no-stream
限制使用cpu,申请4个CPU,但最多只给使用1.5个cpu
docker run -it --rm --name c1 --cpus=1.5 lorel/docker-stress-ng --cpu 4
2、--cpuset-cpus CPU绑定,把进程和cpu关联
一般不建议绑在0号CPU上,因0号CPU一般会较忙
申请4个CPU,但最多只给使用1.5个cpu,2,4,5cpu提供使用
docker run -it --rm --name c1 --cpus 1.5 --cpuset-cpus 2,4-5 lorel/docker-stress-ng --cpu 4
在另一个终端串口执行命令查看内存使用情况
docker stats --no-stream
查看绑定关系
ps axo pid,cmd,psr |grep stress-ng
标签:限制,14,--,CPU,oom,内存,memory,docker,Docker
From: https://blog.51cto.com/mfc001/6461843