排查内存泄漏:长期运行 screen 的监控法

排查内存泄漏:用screen构建可靠的长期监控会话

你有没有遇到过这样的场景?某个服务在服务器上跑了几天后,系统越来越慢,最终触发 OOM(Out of Memory)被内核杀掉。重启之后一切正常,但问题总在数小时或数天后重现。这时候,你怀疑是内存泄漏——可偏偏这个进程不能随便停,生产环境又没法跑valgrind这类重型工具。

怎么办?

本文分享一个我在多个嵌入式与边缘计算项目中反复验证过的实战方法:利用screen创建持久化终端会话,结合轻量级系统命令实现对目标进程的长期内存趋势监控。整个过程无需修改代码、不中断服务,还能生成可用于分析的趋势数据。


为什么传统调试手段在这里“失灵”?

开发阶段排查内存泄漏,我们通常依赖:

  • valgrind --leak-check=full:精准但性能开销高达10倍以上,完全不适合生产;
  • gdb动态跟踪:需要附加进程,可能影响实时性,且无法长期运行;
  • heaptrack/massif:功能强大,但需重新编译或安装额外组件,在受限环境中难以部署。

而现实中很多关键服务(比如网关通信模块、工业控制后台、金融交易引擎)都是:

  • 必须7×24小时运行;
  • 部署环境封闭(如嵌入式设备);
  • 没有图形界面和调试工具链支持。

在这种情况下,最有效的策略不是“深入剖析”,而是“持续观察”——通过长时间采样,判断是否存在缓慢增长的内存占用趋势。

这就引出了我们的核心工具组合:

screen+ps+/proc+ CSV日志

这套方案充分利用 Linux 系统自带机制,做到低侵入、高稳定、易回溯。


screen:不只是多窗口终端,更是运维的“保险绳”

它到底解决了什么问题?

想象一下你在远程 SSH 到一台服务器,运行了一个while true; do ps ...; sleep 30; done的监控循环。突然网络抖动断开了连接……结果呢?那个 shell 进程也被终止了,你的监控白做了。

这就是痛点:交互式终端的生命期绑定于 SSH 会话

screen的价值就在于打破这种绑定。它是一个终端复用器(terminal multiplexer),可以创建独立于当前登录会话的虚拟终端环境。即使你退出登录,screen内部的程序依然在后台运行。

核心操作三步走

# 1. 创建命名会话(建议带描述) screen -S mem_monitor_app123 # 2. 在里面执行命令(例如启动监控脚本) # 3. 分离会话:按 Ctrl+A,再按 D [detached from 12345.mem_monitor_app123]

之后你可以安全关闭终端。想回来查看?只要重新登录,执行:

screen -r mem_monitor_app123

就能无缝接续之前的会话,看到所有输出内容。

更进一步:自动记录日志

光看还不够,我们要的是可追溯的数据。好在screen支持内置日志记录:

screen -S mem_leak_trace -L -Logfile /var/log/mem_trace.log
  • -L:开启日志捕获;
  • -Logfile xxx:指定日志路径。

从此,每一行输出都会被保存下来,哪怕你从未 attach 查看过。


如何采集内存数据?别只盯着 RSS

要判断是否内存泄漏,关键是找到可靠的指标。Linux 提供了丰富的进程内存信息源,主要来自/proc/[pid]/目录下的虚拟文件。

常用的命令是:

ps -p $PID -o pid,rss,vsz,%mem,cmd --no-headers

输出示例:

1234 102400 856720 2.1 ./data_agent

各字段含义如下:

字段含义是否适合检测泄漏
RSS常驻内存大小(KB)✅ 强相关,重点关注
VSZ虚拟内存总量(KB)⚠️ 可能因 mmap 扩张而不准
%MEM占系统总内存百分比✅ 辅助参考

但这只是表层。真正要看懂内存行为,得深入/proc文件系统。

/proc/[pid]/status:更详细的内存视图

cat /proc/1234/status | grep -i vmrss

输出:

VmRSS: 102400 kB VmSize: 856720 kB VmData: 65400 kB VmStk: 136 kB VmLib: 18200 kB

这些才是内核真实维护的数据:

  • VmRSS:实际使用的物理内存,是判断泄漏的核心依据;
  • VmData:堆空间使用量,若持续增长基本可判定为 malloc/new 未释放;
  • VmStk:栈空间,一般固定不变;
  • VmLib:共享库映射,不受应用控制。

所以,如果你发现 VmData 和 RSS 同步稳步上升,那几乎可以确定存在堆内存泄漏。


实战脚本:自动化采集并生成结构化数据

下面这段 Bash 脚本是我在线上排查时的标准配置,已用于多个项目。

#!/bin/bash # monitor_mem.sh - 长期内存监控脚本 PID=$1 INTERVAL=${2:-30} # 默认30秒采样一次 LOGFILE="mem_usage.csv" if [ -z "$PID" ] || ! ps -p $PID > /dev/null; then echo "Usage: $0 <pid> [interval]" echo "Error: Process $PID not running." exit 1 fi echo "Monitoring PID: $PID, interval: ${INTERVAL}s" echo "Timestamp,RSS(KB),VSZ(KB),%MEM,VmData(KB)" > $LOGFILE COUNT=0 while true; do if ! ps -p $PID > /dev/null; then echo "$(date): Process exited." >> $LOGFILE break fi # 使用 ps 获取基础信息 MEM_LINE=$(ps -p $PID -o rss,vsz,%mem --no-headers) read RSS VSZ PMEM <<< "$MEM_LINE" # 从 /proc/[pid]/status 提取 VmData VMDATA_LINE=$(grep VmData /proc/$PID/status 2>/dev/null) VMDATA=$(echo $VMDATA_LINE | awk '{print $2}') TIMESTAMP=$(date '+%Y-%m-%d %H:%M:%S') echo "$TIMESTAMP,$RSS,$VSZ,$PMEM,$VMDATA" | tee -a $LOGFILE sleep $INTERVAL COUNT=$((COUNT + 1)) done

使用方式

# 给予执行权限 chmod +x monitor_mem.sh # 启动 screen 会话 screen -S leak_debug -L -Logfile /var/log/monitor.log # 在 screen 中运行脚本(假设目标进程 PID 为 9876) ./monitor_mem.sh 9876 60 # 每60秒采样一次

然后按下Ctrl+A, D脱离会话,让它在后台默默运行。


数据怎么用?画图才是真相大白的时候

脚本运行一天后,你会得到一个mem_usage.csv文件,格式如下:

Timestamp,RSS(KB),VSZ(KB),%MEM,VmData(KB) 2025-04-05 08:00:00,102400,856720,2.1,65400 2025-04-05 08:01:00,102800,856720,2.1,65800 ...

把这个文件下载到本地,用 Python 快速绘图:

import pandas as pd import matplotlib.pyplot as plt df = pd.read_csv('mem_usage.csv') df['Timestamp'] = pd.to_datetime(df['Timestamp']) plt.figure(figsize=(12, 6)) plt.plot(df['Timestamp'], df['RSS(KB)']/1024, label='RSS (MB)', color='tab:blue') plt.plot(df['Timestamp'], df['VmData(KB)']/1024, label='Heap (MB)', color='tab:orange', linestyle='--') plt.title('Memory Usage Trend Over Time') plt.xlabel('Time') plt.ylabel('Memory (MB)') plt.legend() plt.grid(True, alpha=0.3) plt.xticks(rotation=45) plt.tight_layout() plt.show()

一旦看到一条近乎直线向上的曲线,尤其是RSS 和 VmData 同步增长,就可以拍板:“这货确实在漏!”


常见坑点与调试秘籍

❌ 误判缓存预热为泄漏

某些程序启动初期会加载大量缓存(如数据库连接池、图像资源),表现为前几小时 RSS 上升,随后趋于平稳。这种情况不算泄漏。

应对策略:至少观察一个完整业务周期(如24小时),确认增长是否持续。

❌ 忽略共享内存和 mmap 映射

有些程序使用大块 mmap 映射文件或共享内存,会导致 VSZ 很高,但不影响 RSS。此时仅看 VSZ 会误判。

应对策略:重点关注RSS 和 VmData,忽略 VSZ。

❌ 日志文件无限膨胀

screen -L默认不会轮转日志,长期运行可能导致单个日志达数 GB。

应对策略
- 定期手动 rename 并发送SIGUSR1触发 log flush;
- 或改用外部日志管理(如logger+logrotate);
- 或在脚本中加入splitlogrotate调用。

❌ 权限不足读取 /proc

普通用户只能查看自己拥有的进程。监控 root 或其他用户的进程需提权。

应对策略
- 使用相同用户身份运行screen
- 或使用sudo启动监控脚本(注意环境变量继承问题)。


实际案例:某边缘网关的“每日重启”之谜

一台部署在工厂现场的边缘计算网关,每天凌晨自动重启。日志显示是 OOM Killer 干的,但每次重启后又恢复正常。

我们用上述方法部署监控:

screen -S oom_debug -L -Logfile /tmp/oom.log ./monitor_mem.sh $(pgrep comms_daemon) 300 # 每5分钟采样一次

三天后拉取数据,绘图发现:

  • RSS 从初始 80MB 缓慢爬升至第3天的 920MB;
  • 增长速率约为每小时 +12MB;
  • 应用逻辑中有一处 socket 接收缓冲区动态分配,但异常处理路径未释放。

修复后重新上线,RSS 稳定在 100MB 左右,问题根除。


总结:简单工具也能解决复杂问题

内存泄漏排查不必总是追求“高科技”。在生产环境中,可观测性 > 精准定位。你能持续看到趋势,就已经赢了一半。

本文的方法之所以有效,是因为它满足了四个关键条件:

  1. 持久运行screen解决断连问题
  2. 非侵入式→ 不干扰原进程,无需重启
  3. 数据可回溯→ CSV 输出支持后期分析
  4. 工具普适性强→ 几乎所有 Linux 系统都具备所需组件

与其等待下一次崩溃,不如提前布防。下次当你面对一个“好像有点慢”的服务时,不妨花十分钟搭个screen监控会话——也许你就能抓住那只藏在暗处的内存幽灵。

如果你觉得这套方法有用,欢迎收藏转发。也可以在评论区分享你的内存泄漏排查经历,我们一起交流实战经验。

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

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

相关文章

Qwen2.5-7B图像描述:多模态应用探索

Qwen2.5-7B图像描述&#xff1a;多模态应用探索 1. 引言&#xff1a;Qwen2.5-7B与多模态应用的融合前景 1.1 大模型时代的多模态演进 随着大语言模型&#xff08;LLM&#xff09;在自然语言理解与生成能力上的持续突破&#xff0c;AI系统正从单一文本处理向多模态智能体演进。…

【系统】Linux内核和发行版的关系

理解内核和发行版的关系&#xff0c;能帮你更清晰地选择适合 YOLO 部署的系统。 核心结论&#xff1a;Linux 内核是所有 Linux 发行版的「底层核心引擎」&#xff0c;发行版是基于内核、搭配完整软件生态和配置工具的「开箱即用操作系统」。一个内核可以支撑多个发行版&#xf…

$R = \alpha \times T + \beta \times I + \gamma \times D$ 其中T为口味匹配度,I为食材匹配度

实现AI美食推荐功能功能概述基于用户口味偏好和现有食材推荐菜谱支持健康饮食参数设置具备学习用户偏好的能力核心代码结构import pandas as pd from sklearn.metrics.pairwise import cosine_similarity from sklearn.feature_extraction.text import TfidfVectorizerclass Fo…

26.1.3 快速幂+容斥 树上dp+快速幂 带前缀和的快速幂 正序转倒序 子序列自动机 线段树维护滑窗

F. Fancy Arrays 快速幂 容斥 数列个数&#xff0c;看起来像快速幂&#xff0c;问题是没有最大值可能很大&#xff0c;直接快速幂的话矩阵太大。 考虑容斥转化成一个矩阵大小O(x)O(x)O(x)的快速幂问题&#xff1a;至少有一个元素在[x,xk−1][x,xk-1][x,xk−1]&#xff0c;等…

详解JDK自带工具jmap:Java堆内存分析与问题排查

目录一、前言二、jmap核心用途三、常用选项详细说明核心常用选项专属dump-options&#xff08;配合-dump使用&#xff09;特殊选项&#xff1a;-F四、实操命令与输出结果解读实操1&#xff1a;查看Java堆配置与使用情况&#xff08;jmap -heap <pid>&#xff09;执行命令…

Qwen2.5-7B多模态:图文联合处理实战案例

Qwen2.5-7B多模态&#xff1a;图文联合处理实战案例 随着大模型技术的演进&#xff0c;多模态能力已成为衡量语言模型智能水平的重要维度。Qwen2.5-7B作为阿里云最新发布的开源大语言模型&#xff0c;在保持高效推理性能的同时&#xff0c;进一步增强了对图像与文本联合理解的…

计算机毕业设计springboot“红色长征”宣传网站的设计与实现 基于SpringBoot的红色长征精神传播平台的设计与实现 SpringBoot+Vue红色长征记忆展馆网站建设

计算机毕业设计springboot“红色长征”宣传网站的设计与实现&#xff08;配套有源码 程序 mysql数据库 论文&#xff09; 本套源码可以在文本联xi,先看具体系统功能演示视频领取&#xff0c;可分享源码参考。1934-1936 年的万里长征&#xff0c;是中华民族精神的高光刻度。把这…

从流量到留量:全域众链的实体商家全链路 AI 经营方案

当下&#xff0c;实体商家的经营竞争早已从 “单点获客” 升级为 “全链路经营” 的较量 —— 仅靠单次营销吸引客流已难以为继&#xff0c;如何实现 “获客 - 留存 - 复购 - 裂变” 的闭环增长&#xff0c;成为决定商家生存与发展的关键。全域众链精准把握这一核心需求&#x…

Qwen2.5-7B案例解析:新闻摘要生成系统实现方案

Qwen2.5-7B案例解析&#xff1a;新闻摘要生成系统实现方案 1. 引言&#xff1a;为何选择Qwen2.5-7B构建新闻摘要系统&#xff1f; 1.1 行业背景与技术挑战 在信息爆炸的时代&#xff0c;新闻内容每天以TB级增长&#xff0c;传统人工阅读和摘要方式已无法满足实时性与效率需求…

Qwen2.5-7B模型架构解析:Transformer改进点剖析

Qwen2.5-7B模型架构解析&#xff1a;Transformer改进点剖析 1. 技术背景与核心价值 近年来&#xff0c;大语言模型&#xff08;LLM&#xff09;在自然语言理解、代码生成、多轮对话等任务中展现出惊人能力。阿里云推出的 Qwen2.5 系列 是继 Qwen 和 Qwen2 之后的又一次重要迭代…

Qwen2.5-7B创业机会:基于模型的商业创意

Qwen2.5-7B创业机会&#xff1a;基于模型的商业创意 1. 技术背景与商业潜力 1.1 Qwen2.5-7B&#xff1a;新一代开源大模型的技术跃迁 Qwen2.5 是阿里云最新发布的大型语言模型系列&#xff0c;覆盖从 0.5B 到 720B 参数的多个版本。其中 Qwen2.5-7B 作为中等规模模型&#x…

计算机毕业设计springboot“互动小课堂”小程序的安全开发和实现 基于SpringBoot的“互动微课堂”教育小程序的设计与实现 SpringBoot+Vue“即时互动学堂”小程序的安全构建

计算机毕业设计springboot“互动小课堂”小程序的安全开发和实现&#xff08;配套有源码 程序 mysql数据库 论文&#xff09; 本套源码可以在文本联xi,先看具体系统功能演示视频领取&#xff0c;可分享源码参考。疫情把课堂搬到云端&#xff0c;也让“互动”成为线上教学的生命…

Qwen2.5-7B用户画像:对话数据挖掘与分析

Qwen2.5-7B用户画像&#xff1a;对话数据挖掘与分析 1. 技术背景与研究动机 随着大语言模型&#xff08;LLM&#xff09;在自然语言理解、生成和交互能力上的持续突破&#xff0c;如何精准刻画其用户行为特征与使用模式&#xff0c;已成为优化模型服务、提升用户体验的关键环节…

基于Qwen2.5-7B与vLLM的CPU推理实战详解

基于Qwen2.5-7B与vLLM的CPU推理实战详解 在大语言模型&#xff08;LLM&#xff09;日益普及的今天&#xff0c;如何在资源受限的环境中高效部署和运行模型成为工程落地的关键挑战。GPU虽为首选硬件&#xff0c;但其高昂成本限制了部分场景的应用。相比之下&#xff0c;CPU推理…

Qwen2.5-7B表格问答:Excel数据查询系统

Qwen2.5-7B表格问答&#xff1a;Excel数据查询系统 1. 引言&#xff1a;为何需要基于大模型的表格问答系统&#xff1f; 在企业日常运营中&#xff0c;Excel 和 CSV 等结构化数据文件无处不在。然而&#xff0c;非技术人员面对复杂表格时常常难以快速提取关键信息&#xff0c…

Elasticsearch网络配置一文说清

Elasticsearch 网络配置&#xff1a;从原理到生产实践&#xff0c;一文讲透你有没有遇到过这样的场景&#xff1f;刚部署完一个三节点的 Elasticsearch 集群&#xff0c;信心满满地启动第一个节点&#xff0c;却发现其他两个节点怎么也连不上&#xff1f;日志里反复出现failed …

零基础学电子电路基础:最易懂的电流与电压讲解

从零开始搞懂电子电路&#xff1a;电流与电压&#xff0c;到底是什么&#xff1f;你有没有想过&#xff0c;为什么一按开关&#xff0c;灯就亮了&#xff1f;手机是怎么把电池的“电”变成屏幕上的画面和声音的&#xff1f;这些看似神奇的现象背后&#xff0c;其实都离不开两个…

图解入门:串联与并联电路在电路图中的表达方式

图解入门&#xff1a;串联与并联电路在电路图中的表达方式从一个灯不亮说起你有没有遇到过这样的情况&#xff1f;家里一盏灯坏了&#xff0c;其他灯却照样亮着——这其实是并联电路的典型表现。而如果你玩过老式圣诞灯串&#xff0c;可能经历过“一个灯泡烧了&#xff0c;整串…

Jstat 垃圾回收统计实用指南

目录Jstat 垃圾回收统计实用指南一、基础使用说明1. 核心语法格式2. 快速示例3. 单位说明二、常用命令详解1. -gc&#xff1a;显示 GC 次数、时间及堆内存各区域大小/使用量2. -gcutil&#xff1a;以百分比形式统计 GC 核心信息3. -gccapacity&#xff1a;堆内存与方法区容量边…

USB主机驱动程序枚举过程:完整指南设备识别阶段

USB主机驱动程序如何“看懂”你的设备&#xff1f;——深度解析设备识别全过程你有没有想过&#xff0c;当你把一个U盘插入电脑时&#xff0c;系统是怎么知道它是个存储设备而不是鼠标或键盘的&#xff1f;为什么不需要手动配置端口、中断或地址&#xff0c;操作系统就能自动加…