首页 > 其他分享 >14、Docker 的资源限制

14、Docker 的资源限制

时间:2023-06-12 14:03:33浏览次数:57  
标签:限制 14 -- CPU oom 内存 memory docker Docker

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

相关文章

  • mybatis-config.xml配置文件有顺序限制
    Thecontentofelementtype"configuration"mustmatch"(properties?,settings?,typeAliases?,typeHandlers?,objectFactory?,objectWrapperFactory?,reflectorFactory?,plugins?,environments?,databaseIdProvider?,mappers?)".......
  • 12、容器单机编排工具Docker Compose安装
    容器单机编排工具DockerCompose安装DockerCompose离线安装,直接从github或国内镜像站下载安装对应版本https://github.com/docker/compose/releases找到docker-compose-linux-x86_64,下载拖入linux系统[root@ubuntu2004~]#mvdocker-compose-linux-x86_64-v2.12.0/usr/bin/d......
  • 【区块链】HyperLedger Besu Docker异地组网(续)
    最近有些朋友私信我,说之前《【区块链】HyperLedgerBesuDocker异地组网》中提到使用dockerswarm可以进行异地组网,但实际上在公网层面无法实现。嗯...的确之前我没有说清楚,其实在我实施的过程中还是遇到了比较多的问题的,譬如:国内三大网络运营商对于公网接入会有不同的网络策略;......
  • 14-7 shell脚本进阶数组
    一、数组的基本用法关联数组需要先声明[root@centos8~]#declare-adeclare-aBASH_ARGC=()declare-aBASH_ARGV=()declare-aBASH_COMPLETION_VERSINFO=([0]="2"[1]="7")declare-aBASH_LINENO=()declare-aBASH_SOURCE=()declare-arBASH_VERSINFO=([0]=&......
  • How to Clear Logs of Running Docker Containers
    HowtoClearLogsofRunningDockerContainers https://www.howtogeek.com/devops/how-to-clear-logs-of-running-docker-containers/UnderstandingtheProblemDockercollectslogsfromthestandardoutputanderrorstreamsofcontainerforegroundprocesses.......
  • windows 安装postgresql 14
    开源数据库PostgreSQL是1980年以加利福尼亚大学为中心开发出来的DBMS,与MySQL一样,都是世界上广泛应用的开源数据库(DB)。本文将会介绍使用64位版的Windows安装程序(Winx86-64)在WindowsServer2019(64位)系统中安装PostgreSQL的步骤,请大家结合自身实际下载相应的安装......
  • P1425 小鱼的游泳时间
    小鱼的游泳时间题目描述伦敦奥运会要到了,小鱼在拼命练习游泳准备参加游泳比赛,可怜的小鱼并不知道鱼类是不能参加人类的奥运会的。这一天,小鱼给自己的游泳时间做了精确的计时(本题中的计时都按小时制计算),它发现自己从时分一直游泳到当天的时分,请你帮小鱼计算一下,它这天一共......
  • Jenkins + Docker 一键自动化部署 Spring Boot 项目,步骤齐全,少走坑路!
    本文章实现最简单全面的Jenkins+docker+springboot一键自动部署项目,步骤齐全,少走坑路。环境:centos7+git(gitee)简述实现步骤:在docker安装jenkins,配置jenkins基本信息,利用Dockerfile和shell脚本实现项目自动拉取打包并运行。推荐一个开源免费的SpringBoot实战项目:https://......
  • Luogu P2375 [NOI2014] 动物园
    [NOI2014]动物园题目描述近日,园长发现动物园中好吃懒做的动物越来越多了。例如企鹅,只会卖萌向游客要吃的。为了整治动物园的不良风气,让动物们凭自己的真才实学向游客要吃的,园长决定开设算法班,让动物们学习算法。某天,园长给动物们讲解KMP算法。园长:“对于一个字符串\(S\),它......
  • Docker runc容器逃逸漏洞(CVE-2021-30465)
    --原文件的名称并授权cd/tmpmvrunc.amd64runc&&chmod+xrunc--查看runc的位置whichrunc--将备份runc文件cd/usr/bincpruncrunc.bak--复制新的runc到usr/bincp/tmp/runc/usr/bin/systemctlstopdockersystemctlstartdocker......