视频制作网站素材,免费网站收录入口,龙华新区网站建设,应用软件设计过程破案现场#xff1a;Docker容器资源限制导致的oom问题 01 事故现场02 问题定位03 对症下药04 后记 原文来自于微信公众号“运维之美” https://mp.weixin.qq.com/s?__bizMzA5NDY1MTM3MAmid2247484902idx1sn8394aefd884ee09ea546fcd400dd233cchksm904a136… 破案现场Docker容器资源限制导致的oom问题 01 事故现场02 问题定位03 对症下药04 后记 原文来自于微信公众号“运维之美” https://mp.weixin.qq.com/s?__bizMzA5NDY1MTM3MAmid2247484902idx1sn8394aefd884ee09ea546fcd400dd233cchksm904a1363a73d9a759bb525771b3e8ebe17948f1820e2c70121fc1fb49e0f528de75030cd815atoken798793277langzh_CN#rd 01 事故现场
有同事反馈grafana监控大盘无法展示监控数据prometheus界面一直在starting up状态 02 问题定位
从现象上感觉prometheus状态肯定不对查看prometheus容器状态,可以看到prometheus在反复重启验证了我们的猜想
[localhost ~]$ docker ps -a |grep prometheus
e2e973cc7e53 prometheus:v2.42.0 /opt/bitnami/promet… 4 days ago Up 1minutes prometheus通过docker logs prometheus日志看到容器确实不断启动但是没有明显的报错想着看通过messages日志看看能不能找到什么证据
通过journalctl -p err查看系统日志看到promethus出现“out of memory”内存溢出的报错
此时已经接近真相了出现内存溢出一般有2种情况 一种是主机物理内存不够了根据优先级kill掉部分服务 另外一种就是容器有资源限制超出了内存限制后被oom防止影响其它服务
经过查看监控节点物理内存还有空余看看第二种情况可以从下边看到prometheus内存使用在不断增长
[rootlocalhost ~]# docker stats prometheusCONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
7ab16bd57127 prometheus 90.60% 7.507GiB / 8GiB 42.59% 0B / 0B 7.54GB / 82.4GB 63CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
7ab16bd57127 prometheus 96.60% 7.807GiB / 8GiB 42.59% 0B / 0B 7.54GB / 82.4GB 63由于主机节点较多监控指标越来越多,prometheus当初定义的内存已经不够使用了,那么解决方案要么是优化上报的数据另外一个就是增加放宽内存限制
03 对症下药
登录监控节点执行如下命令修改内存为超过top命令或者docker stats观察到的最大值执行如下命令更新内存使用限制
注update命令需要容器状态为up时才能更新成功
docker update --memory15g prometheus可能会出现如下报错
[localhost02-2 ~]$ docker update --memory20G prometheus
Error response from daemon: Cannot update container e2e973cc7e535201e121fcc5bcfe1dc12fa91e24fee9e6a0af1636ffd119f482: Memory limit should be smaller than already set memoryswap limit, update the memoryswap at the same time命令修改为如下即可解决上面报错是由于swap内存限制导致
docker update --memory15g --memory-swap15g prometheus成功破案问题解决真的太棒了后续可以优化业务上报的指标 04 后记
在docker中可以对容器应用程序的资源进行限制通过cgroup来控制容器以确保它们在运行时不会占用过多的系统资源。以下是一些常见的 Docker 资源限制选项 内存限制可以使用 --memory 或 -m 选项来限制容器可以使用的内存。例如–memory1g 表示限制容器使用的内存为 1GB。超出限制的内存使用可能会导致容器被终止或无法正常运行。 CPU 限制可以使用 --cpus 选项来限制容器可以使用的 CPU 核数。例如–cpus0.5 表示限制容器使用的 CPU 核心为 0.5 个。这个值可以是小数表示分配的 CPU 资源的相对权重 CPU 调度策略可以使用 --cpu-shares 选项来为容器分配 CPU 时间片的权重。这个值越高容器获得的 CPU 时间越多。默认情况下所有容器的 CPU 权重相等。 IO 限制你可以使用 --blkio-weight 选项来设置容器对 IO 资源的相对权重。默认情况下所有容器的 IO 权重相等。 网络带宽限制可以使用 --network 选项来限制容器的网络带宽。例如–networknone 表示容器没有网络访问权限–networkhost 表示容器与宿主机共享网络 使用方式
docker run --cpus 0.5 --memory 256M -d node_app可以在启动时指定资源限制
当使用docker-compose的时候通过resources资源标签来定义
version: 3
services:web:image: nginx:latestports:- 8080:80deploy:resources:limits:cpus: 0.5memory: 256M查看运行容器的资源限制
#方式一
docker stats
#方式二
docker inspect nginx | grep -i memory放松时刻
最近我们建立了一个技术交流微信群。有兴趣的同学可以加入和我们一起交流技术在 「运维之美」 公众号直接回复 「加群」 邀请你入群。