破案现场: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 prometheus

CONTAINER 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   63

CONTAINER 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:latest
    ports:
      - "8080:80"
    deploy:
      resources:
        limits:
          cpus: '0.5'
          memory: 256M

查看运行容器的资源限制

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

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

想当老师应该去学什么专业

专业选择是决定未来职业发展的重要步骤,如果你也想成为一名老师,那么这五个专业可能会适合你! 教育学专业 教育学专业是培养教育理论和方法的学科,这些理论知识将帮助你理解教学过程、学生发展、课程设计和评估。该专业将让你全面…

人工智能教程(二):人工智能的历史以及再探矩阵

目录 前言 更多矩阵的知识 Pandas 矩阵的秩 前言 在上一章中,我们讨论了人工智能、机器学习、深度学习、数据科学等领域的关联和区别。我们还就整个系列将使用的编程语言、工具等做出了一些艰难的选择。最后,我们还介绍了一点矩阵的知识。在本文中&am…

机器学习第14天:KNN近邻算法

☁️主页 Nowl 🔥专栏《机器学习实战》 《机器学习》 📑君子坐而论道,少年起而行之 文章目录 介绍 实例 回归任务 缺点 实例 分类任务 如何选择最佳参数 结语 介绍 KNN算法的核心思想是:当我们要判断一个数据为哪一类时…

CMD - ping

文章目录 前言参数 前言 ping 命令主要测试到达指定 IP 或主机的连通性. 参数 -t: ping 指定的计算机直到中断 -a: 将地址解析为主机名 -n count: 要发送的回显请求数

教师编制缩减是为什么

老师们有没有注意到一个趋势?那就是教师编制正在逐步缩减。不知道你们发现没有,我最近在研究教育领域的新闻,发现这两年教师编制缩减的消息越来越多。这是为什么呢?今天就来跟大家聊一聊。 原因一:资金压力 第一个原因…

【华为OD题库-038】支持优先级的对列-java

题目 实现一个支持优先级的队列,高优先级先出队列,同优先级时先进先出。 如果两个输入数据和优先级都相同,则后一个数据不入队列被丢弃。 队列存储的数据内容是一个 整数。 输入描述 一组待存入队列的数据(包含内容和优先级)。 输出描述 队列…

ubuntu 使用webrtc_ros 编译linux webrtc库

ubuntu 使用webrtc_ros 编译linux webrtc库 webrtc_ros 使用WebRTC流式传输ROS图像主题 该节点提供了一个WebRTC对等方,可以将其配置为流ROS图像主题并接收发布到ROS图像主题的流。 该节点托管一个提供简单测试页面的Web服务器,并提供可用于创建和配置W…

基于springboot实现学生成绩管理系统项目【项目源码+论文说明】

基于springboot实现学生成绩管理系统演示 摘要 随着信息技术和网络技术的飞速发展,人类已进入全新信息化时代,传统管理技术已无法高效,便捷地管理信息。为了迎合时代需求,优化管理效率,各种各样的管理系统应运而生&am…

【从浅识到熟知Linux】基本指令之基本权限

🎈归属专栏:从浅学到熟知Linux 🚗个人主页:Jammingpro 🐟每日一句:用博客整理整理之前学过的知识,是个不错的选择。 文章前言:本文介绍Linux中的基本权限及相关指令用法并给出示例和…

互联网+智慧工地系统源码

智慧工地以施工现场风险预知和联动预控为目标,将智能AI、传感技术、人像识别、监控、虚拟现实、物联网、5G、大数据、互联网等新一代科技信息技术植入到建筑、机械、人员穿戴设施、场地进出关口等各类设备中,实现工程管理与工程施工现场的整合&#xff0…

快速压缩:迅速减小PDF文件大小的步骤与技巧

虽然png图片格式是一种无损压缩格式,但是png图片的内存大小也是比较大的,而且兼容性上也没有jpg图片好,许多平台推荐的也都是jpg格式,所以当我们需要把png转jpg格式的时候,就需要用到图片格式转换器,今天推…

JAVA创建线程方式有几种

方式1:继承Thread类 步骤: 创建一个继承于Thread类的子类重写Thread的run()方法创建当前Thread子类的对象通过实例对象调用start()方法,启动线程----》JAVA虚拟机会调用run()方法 实现: public class TestMyThread {public sta…

怎样禁止邮件发送涉密信息

数字化时代,电子邮件已成为人们生活和工作中不可或缺的通讯工具。然而,随着互联网的普及,涉密信息的泄露风险也随之增加。为了保护敏感数据,禁止邮件发送涉密信息显得尤为重要。以下是一些建议,帮助你实现这一目标。 1…

buuctf web [极客大挑战 2019]PHP

提示有备份,dirsearch扫描网站备份 GitHub - maurosoria/dirsearch: Web path scanner下载.zip格式文件 解压到python目录下 在上图位置cmd打开窗口 输入python setup.py install安装dirseach 安装好后输入命令使用dirseach python dirseach.py -u http://44296191-973d-448…

在CentOS 7.9上搭建高性能的FastDFS+Nginx文件服务器集群并实现外部远程访问

文章目录 引言第一部分:FastDFS介绍与安装1.1 FastDFS简介1.2 FastDFS安装1.2.1 安装Tracker Server1.2.2 安装Storage Server 1.3 FastDFS配置1.3.1 配置Tracker Server1.3.2 配置Storage Server1.3.3 启动FastDFS服务 第二部分:Nginx配置2.1 Nginx安装…

【深度学习】因果推断与机器学习的高级实践 | 数学建模

文章目录 因果推断因果推断的前世今生(1)潜在结果框架(Potential Outcome Framework)(2)结构因果模型(Structual Causal Model,SCM) 身处人工智能爆发式增长时代的机器学…

uniapp实现多时间段设置

功能说明&#xff1a; 1 点击新增时间&#xff0c;出现一个默认时间段模板&#xff0c;不能提交 2 点击“新增时间文本”&#xff0c;弹出弹窗&#xff0c;选择时间&#xff0c;不允许开始时间和结束时间同时为00:00&#xff0c; <view class"item_cont"> …

python排序算法_归并排序

什么是归并排序&#xff1a; 归并排序是一种基于分治法的排序算法。它的基本思想是将待排序的序列分成若干个子序列&#xff0c;分别进行排序&#xff0c;然后再将已排序的子序列合并成一个有序的序列。 基本思想&#xff1a; 归并排序是用分治思想&#xff0c;分治模式在每一…

ubuntu22.04 安装 jupyterlab

JupyterLab Install JupyterLab with pip: pip install jupyterlabNote: If you install JupyterLab with conda or mamba, we recommend using the conda-forge channel. Once installed, launch JupyterLab with: jupyter lab

基于人工兔算法优化概率神经网络PNN的分类预测 - 附代码

基于人工兔算法优化概率神经网络PNN的分类预测 - 附代码 文章目录 基于人工兔算法优化概率神经网络PNN的分类预测 - 附代码1.PNN网络概述2.变压器故障诊街系统相关背景2.1 模型建立 3.基于人工兔优化的PNN网络5.测试结果6.参考文献7.Matlab代码 摘要&#xff1a;针对PNN神经网络…