当前位置: 首页 > article >正文

docker容器中的内存占用高的问题分析

文章目录

  • 问题描述
  • 原因分析
    • 分析1
    • 分析2
    • 验证猜想
  • 结论和经验

问题描述

运维新增对某服务的监控后发现:内存不断上涨的现象。进一步确认,是因为有多个导出日志操作导致的内存上涨问题。

进一步的测试得出的结果是:容器刚启动是占用内存约为50M左右,在多次地导出日志操作后,内存能涨到2G以上。

问题:为什么日志导出会导致容器的内存不断上涨?

原因分析

分析1

在宿主机器中,使用docker stats 查看服务,内存占用内存792MB
在这里插入图片描述

在docker 容器中,通过ps aux命令查看容器中使用的总内存=29MB+147MB+139MB=315MB左右
在这里插入图片描述
使用kill命令杀死服务的workerman子进程(父进程不跑业务,并且在容器中杀不死),可以看到:

  • workerman子进程重新拉起后内存24MB+21MB=45MB,重新拉起后的进程内存占用减少239MB
  • doker stats 内存在kill后的内存减少了229MB

猜测:容器中只有wokerman的子进程会在执行导出后占用内存,并且使用ps命令也没有看到其他进程。怀疑:容器本身存在缓存,并且docker stat命令查看的内存值应该包含这部分缓存的内存。
在这里插入图片描述
在这里插入图片描述

分析2

使用docker stat查看容器的内存使用为:666MB
在这里插入图片描述
在容器中,使用htop命令查看容器中各个进程的总内存约为:27MB+118MB+85MB = 230MB左右(包含部分的代码缓存等)
在这里插入图片描述
在 /sys/fs/cgroup/memory/docker//memory.stat 中查看内存情况
在这里插入图片描述

验证猜想

为了验证确实是 cache占用的内存,我们手动清理cache缓存验证一下,如下

运行以下命令可以清理 PageCache:

  • sudo sh -c “echo 1 > /proc/sys/vm/drop_caches” (这将清空 PageCache 中的缓存数据,但不会影响正在使用的程序数据。)
    在这里插入图片描述
    可以看到,docker stats 的内存也从 666.MB降到了182MB,和 /sys/fs/cgroup/memory/docker//memory.stat 中查看内存情况基本一致。
    在这里插入图片描述
    在这里插入图片描述

结论和经验

结论:不是代码中的内存泄露,是cache缓存占用的内存。

经验:

  1. ps aux 查看的RSS只包含了物理内存,不包含 buffer/cache 内存
  2. 使用docker stats 命令查看到的内存数据不是实际上的物理内存,而是包含了cache部分,使用该数据用于监控不一定准确。
  3. /sys/fs/cgroup/memory/docker/<container-id>/memory.stat 可以看到docker容器实际的内存使用情况(很有用!!)
  4. 如有必要,可以使用 sudo sh -c "echo 1 > /proc/sys/vm/drop_caches" 释放cache内存

http://www.kler.cn/a/304906.html

相关文章:

  • vue2或vue3的name属性有什么作用?
  • 安全生产管理的重要性:现状、痛点与改进之路
  • 大数据面试题--kafka夺命连环问(后10问)
  • 基于matlab的CNN食物识别分类系统,matlab深度学习分类,训练+数据集+界面
  • F5全新报告揭示AI时代API安全面临严峻挑战
  • mysql 快速解决死锁方式
  • 集群聊天服务器项目【C++】(四)cmake介绍和简单使用
  • 循环链表(判断双循环链表是否为对称,将两个单循环链表合并成一个循环链表)
  • ​Web3与AI的交汇点:打造未来智能化去中心化应用
  • React学习笔记(1.0)
  • SQLServer事务
  • QT::QComboBox自定义左击事件信号
  • 使用豆包MarsCode编程助手提升开发效率的实战分享!
  • 算法-最少箭引爆气球(贪心+区间)
  • oracle停止当前运行的JOB或kill会话
  • Python图像处理——计算机视觉中常用的图像预处理
  • Conda新建虚拟环境,安装包一直失败:000和404错误
  • RabbitMQ 基础入门
  • 【python爬虫】之scrapy框架介绍
  • yolo自动化项目实例解析(一)日志格式输出、并发异步多线程、websocket、循环截图、yolo推理、3d寻路
  • 一天认识一个硬件之光纤
  • flink中chainWith() 的详解
  • 【Prompt Engineering:自我一致性、生成知识提示、链式提示】
  • Qt之OpenCv 灰度处理、均值滤波、边缘检测学习
  • 端口大全说明,HTTP,TCP,UDP常见端口对照表
  • Go语言现代web开发07 map字典