破案现场:Docker容器资源限制导致的oom问题

破案现场:Docker容器资源限制导致的oom问题

  • 01 事故现场
  • 02 问题定位
  • 03 对症下药
  • 04 后记

原文来自于微信公众号“运维之美”
https://mp.weixin.qq.com/s?__biz=MzA5NDY1MTM3MA==&mid=2247484902&idx=1&sn=8394aefd884ee09ea546fcd400dd233c&chksm=904a1363a73d9a759bb525771b3e8ebe17948f1820e2c70121fc1fb49e0f528de75030cd815a&token=798793277&lang=zh_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内存使用在不断增长

[root@localhost ~]# 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 --memory=15g  prometheus

可能会出现如下报错

[localhost@02-2 ~]$ docker update --memory=20G 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 --memory=15g --memory-swap=15g prometheus

成功破案,问题解决,真的太棒了,后续可以优化业务上报的指标

在这里插入图片描述

04 后记

在docker中可以对容器应用程序的资源进行限制,通过cgroup来控制容器,以确保它们在运行时不会占用过多的系统资源。以下是一些常见的 Docker 资源限制选项

  • 内存限制:可以使用 --memory 或 -m 选项来限制容器可以使用的内存。例如,–memory=1g 表示限制容器使用的内存为
    1GB。超出限制的内存使用可能会导致容器被终止或无法正常运行。

  • CPU 限制:可以使用 --cpus 选项来限制容器可以使用的 CPU 核数。例如,–cpus=0.5 表示限制容器使用的 CPU
    核心为 0.5 个。这个值可以是小数,表示分配的 CPU 资源的相对权重

  • CPU 调度策略:可以使用 --cpu-shares 选项来为容器分配 CPU 时间片的权重。这个值越高,容器获得的 CPU
    时间越多。默认情况下,所有容器的 CPU 权重相等。

  • IO 限制:你可以使用 --blkio-weight 选项来设置容器对 IO 资源的相对权重。默认情况下,所有容器的 IO 权重相等。

  • 网络带宽限制:可以使用 --network 选项来限制容器的网络带宽。例如,–network=none
    表示容器没有网络访问权限,–network=host 表示容器与宿主机共享网络

  • 使用方式

docker run --cpus 0.5 --memory 256M -d node_app

可以在启动时指定资源限制

当使用docker-compose的时候,通过resources资源标签来定义

version: '3'
services:web:image: nginx:latestports:- "8080:80"deploy:resources:limits:cpus: '0.5'memory: 256M

查看运行容器的资源限制

#方式一
docker stats
#方式二
docker inspect nginx | grep -i memory

放松时刻
在这里插入图片描述

最近,我们建立了一个技术交流微信群。有兴趣的同学可以加入和我们一起交流技术,在 「运维之美」 公众号直接回复 「加群」 邀请你入群。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/217202.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Motion Plan之基于采样的路径规划算法笔记

Motion Plan之搜索算法笔记 背景: 基于采样算法是一种在路径规划中广泛应用的有效方法。它通过在图中随机选择点来生成一个简化的搜索图,从而加速搜索过程。这种方法的主要优点包括减少内存使用,避免计算错误,具有动态障碍物对抗…

【小技巧】复制一个模块到你的工程(学习阶段很实用)

问题描述: 当我们学习Springboot时,需要创建大量的模块,而这些模块的许多代码都是重复的,只有模块名等相关的信息不一样,现在就教你如何快速创建一个模块。 应用场景: ①进入项目文件夹: ②复…

C语言中的sqrt函数

目录: 前言: 声明: 搭建环境: 专栏: sqrt函数的参数与返回值: 简单的实践: 问题: 讨论: 改进: 前言: 在日常生活中,我们往往…

LLM之Agent(一):使用GPT-4开启AutoGPT Agent自动化任务完整指南

在ChatGPT引领的大模型时代,要想让大模型按照用户的指令执行,Prompt设计是一门艺术,由此还催生了一个职业”Prompt工程师“。其实,并不是所有人都可以设计出好的Prompt,甚至同样的Prompt应用在不同的大模型上表现的结果…

MySQL表的操作『增删改查』

✨个人主页: 北 海 🎉所属专栏: MySQL 学习 🎃操作环境: CentOS 7.6 阿里云远程服务器 🎁软件版本: MySQL 5.7.44 文章目录 1.创建表1.1.创建时指定属性 2.查看表2.1.查看表结构2.2.查看建表信息…

如何搭建zerotier服务器组网实现内网穿透

小白花了四天的下班时间终于把zerotier网络调通,此刻坐在桌前舒畅地喝口茶~~ 下面来详细记录下这几天踩的坑: 起因就在于一直在iPad上用向日葵连接公司电脑的我觉得向日葵的界面用的实在难受,vs code操作十分不灵光&…

深度学习图像风格迁移 计算机竞赛

文章目录 0 前言1 VGG网络2 风格迁移3 内容损失4 风格损失5 主代码实现6 迁移模型实现7 效果展示8 最后 0 前言 🔥 优质竞赛项目系列,今天要分享的是 🚩 深度学习图像风格迁移 - opencv python 该项目较为新颖,适合作为竞赛课题…

个人硬件测试用例入门设计

📑打牌 : da pai ge的个人主页 🌤️个人专栏 : da pai ge的博客专栏 ☁️宝剑锋从磨砺出,梅花香自苦寒来 🌤️功能测试 进行新增、…

中国信通院王蕴韬:从“好用”到“高效”,AIGC需要被再次颠覆

当下AIGC又有了怎样的颠覆式技术?处于一个怎样的发展阶段?产业应用如何?以及存在哪些风险?针对这些问题,我们与中国信通院云计算与大数据研究所副总工程师王蕴韬进行了一次深度对话,从他哪里找到了这些问题…

基于单片机的智能鱼缸(论文+源码)

1.总体设计 在本次设计中,其系统整个框图如下图2.1所示。其主要的核心控制模块由单片机模块,LCD显示模块,喂食模块,蜂鸣器模块,按键模块,复位电路,抽水电路,加热电路,加…

【报错栏】(Vue) Invalid handler for event “click“: got undefined

Property or method "add" is not defined on the instance but referenced during render. 翻译: 属性或方法“add”未在实例上定义,但在渲染期间引用。 Invalid handler for event "click": got undefined 翻译: …

Acrel-2000电力监控系统在上海大世界保护修缮工程项目中的应用

摘要:安科瑞生产厂家1876150/-6237黄安南 介绍上海大世界电力监控系统,采用智能电力仪表采集配电现场的各种电参量和开关信号。系统采用现场就地组网的方式,组网后通过现场总线通讯并远传至后台,通过Acrel-2000型电力监控系统实现…