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

【BUG调查日记】用于压测的机器人进程内存压不住且脱离分配器的管理

文章目录

    • 前言
    • 分析
      • 查内存泄漏无果
      • 试图观察内存分布
      • 找到根源
    • 总结

前言

做外网服务器压测的时候,发现机器人进程在运行一段时间后,内存会逐步爬升,5个机器人进程在运行几个小时后会把机器的32g内存吃完,然后出现oom。

分析

机器人进程的架构是 C + lua,分配器采用的是jemalloc,当用 luajit 时,jit会自己管理lua内存。
机器人运行时我们采集到三处内存数据,top命令展示的进程实际占用总内存,jemalloc提供的接口输出的分配器持有内存,以及lua的垃圾回收接口输出的lua内存。
按理说,top展示的内存应该跟je输出的内存值相当或者差距不大,但是从日志可以看到top以及oom之后从/var/log/messages 里看到的内存值远大于je输出的值。也就是说,导致机器人进程oom的巨大内存的分配绕过了jemalloc。
在这里插入图片描述

查内存泄漏无果

这样引发了一个猜想:是不是机器人进程编译时链接的第三方库中有接口分配了额外的内存,且产生了内存泄漏?
首先,通过查AI了解到:

  • 如果你的主程序链接了 jemalloc(静态库版本),并且 jemalloc 定义了 malloc、free、calloc、realloc 这些符号,
  • 链接器会用 jemalloc 的实现替换所有未显式绑定的 malloc 调用,无论它来自主程序还是其他静态库。

而 review 了一下我们链接的静态库后,没有发现有自定义分配器的库。
接着我只能怀疑产生了内存泄漏,这个泄漏甚至可能是jemalloc产生的,也许能勉强解释je没有统计到这部分内存。
查内存泄漏就用上了常用的工具,sanitizer。
启动加入了 sanitizer 编译选项的进程后,到进程终止,我得到的sanitizer日志中只看到终止应用程序不规范而泄漏的几百K:
在这里插入图片描述

试图观察内存分布

从sanitizer的分析结果来看,进程并没有明显的内存泄漏。貌似走进了死胡同。内存统计信息明确的告诉我们有内存泄漏,但是权威的工具告诉我们没有。
没有办法的办法,尽量看能不能找到多出来的内存占用的分布情况,查询AI后使用以下命令获得一些信息:

cat /proc/<PID>/smaps
smaps 会详细列出每个内存映射段(堆、栈、shared library)的大小、内存页属性

在这里插入图片描述
看到以上内存信息,尤其是如此多且整齐分布的8192kB,我出于直觉,做了一个小统计:
在这里插入图片描述
由于下班了,查到这里就暂停了。
晚上睡觉前突然想到4000这个敏感的数字,当时我启动机器人的时候,就是5个机器人,每个机器人进程跑4k个号。所以猜想这部分内存是不是 socket 连接产生的。
第二天上班的时候,我再次启动机器人,每个机器人只跑1k的号,最终得到的内存统计,果然刚好是1k多一点的8192kB,佐证了这一猜想,至少这部分内存跟socket连接是有关的。

找到根源

当我确定内存问题跟socket连接有关之后,我第一反应怀疑的肯定不是Linux的套接字系统有什么bug,肯定是开始review我们进程发起连接的代码,在这之前我有查询AI,connect是比accept消耗更多的资源,但是也不可能是这个级别的内存消耗。
我在网络模块的代码里发现了一个非常可疑的调用:
在这里插入图片描述
如果目标host是域名的形式,那么每发起一个socket连接,就会通过该接口创建一个线程来查询目标的IP地址。这就很接近了,之前我写过一个博客,讨论的就是linux上一个线程的内存消耗问题,跟8M的虚拟内存占用匹配上了。
查到这里,我先用最简单的方法验证一下是否就是这里产生了内存泄漏,把服务器的网关地址从动态查询域名修改为了显式的IP地址。再次启动机器人后,内存占用很美妙。

总结

通过查询AI得知,创建的线程,首先,内存分配是内核直接完成的,不会被应用的分配器接管。其次,线程没有按合理的方式销毁,就会产生内存泄漏。该逻辑长期存在而没被发现问题是由于该逻辑在作为服务器的进程中,没有对外发起大量连接的需求,一般只需要连接网关、数据库等服务器。
在这里插入图片描述
在这里插入图片描述

http://www.dtcms.com/a/577932.html

相关文章:

  • wordpress 招聘类网站郑州网站制作工作室
  • php可以做视频网站吗搜索网站怎么做
  • 什么是3D贴纸SDK?
  • Kafka系列之:生产环境替换kafka集群机器详细方案
  • 颠覆知识工作流:谷歌NotebookLM的“疯狂”用法与深度洞察
  • 基于LLM+SearxNG的实时网络搜索agent
  • FPC回流焊治具过炉托盘核心作用及设计要点
  • 移动云网站建设钓鱼网站图片
  • C++笔记——STL list
  • 前端技术方案博客文档汇总
  • 校园跑腿配送系统搭建:从0到1的完整解决方案
  • 蓝牙钥匙 第52次 深入解析安全启动与可信执行环境:从硬件根基到系统安全
  • Docker 自动化管理脚本大全
  • LangFlow 源码分析:Trace 追踪机制核心问题与解决方案
  • SpringBoot+Vue3全栈开发笔记后端部分
  • 网站服务器模式温江 网站建设
  • it人必看的网站网站开发招聘年薪
  • 安卓基础之《(1)—简介》
  • 面试题剖析:android全局触摸事件的前世与今生InputMonitor/SpyWindow
  • 【HarmonyOS-北向开发(软件)】
  • 20251106给荣品RD-RK3588-MID开发板跑Rockchip的原厂Android13系统时禁止锁屏+永不休眠
  • 深入理解 SELinux:架构、概念与基本操作
  • 用vs2010做网站论文深圳市专业制作网站公司
  • 国土资源局加强网站建设wordpress 栏目 伪静态化
  • XMAU7118_VC1:16通道PDM到I²S/TDM音频转换器产品介绍
  • 云手机 轻松畅玩云端游戏
  • 认证空间官方网站附子seo教程
  • 网络层协议 - ICMP
  • DINO系列粗读
  • Java设计模式精讲---03建造者模式