首页主机资讯Ubuntu日志中内存泄漏如何排查

Ubuntu日志中内存泄漏如何排查

时间2025-12-04 12:49:03发布访客分类主机资讯浏览1185
导读:Ubuntu日志中内存泄漏排查实战 一 从系统日志确认是否发生 OOM 查看内核日志,确认是否有进程被 OOM Killer 终止:grep -i ‘killed process’ /var/log/syslog;若系统启用持久化日志,也...

Ubuntu日志中内存泄漏排查实战

一 从系统日志确认是否发生 OOM

  • 查看内核日志,确认是否有进程被 OOM Killer 终止:grep -i ‘killed process’ /var/log/syslog;若系统启用持久化日志,也检查 /var/log/kern.log。出现 “Out of memory: Kill process …” 基本可判定存在内存压力或泄漏。
  • 复核内存与交换分区使用趋势:sar -r(需安装 sysstat),关注 %memused 长时间接近或超过 90% 的情况;同时留意 kswapd0 进程 CPU 持续接近 100%,这通常意味着内存不足导致频繁换页。
  • 结合应用日志与时间点,将 OOM 发生时间与业务高峰、部署变更、定时任务等事件对齐,缩小嫌疑范围。

二 定位可疑进程与内存增长

  • 实时观察进程内存:top/htop 按 RESRSS 排序,关注持续增长且不回落的进程。
  • 查看进程详细内存映射与统计:pmap -x ;cat /proc//status | grep -i vm;cat /proc//maps。关注 VmRSS、VmSize、VmData 的持续增长,以及内存映射段(尤其是匿名映射)是否不断增多。
  • 若需保留现场,可先采集上述信息再重启服务,避免证据丢失。

三 按语言与运行时选择精准工具

  • C/C++ 本地程序
    • 开发/测试环境首选 Valgrind Memcheck:sudo apt-get install valgrind;示例:valgrind --leak-check=full --show-leak-kinds=all --track-origins=yes ./your_app。可精确定位未释放内存及调用栈。
    • 持续集成/预发可用 AddressSanitizer(ASan):编译时加入 -fsanitize=address -g -O1,运行期直接报告泄漏与越界等错误。
    • 生产近似实时排查可用 eBPF memleak(需内核 4.9+):sudo apt-get install bpfcc-tools;示例:sudo /usr/share/bcc/tools/memleak -p $(pidof your_app),输出未释放分配的调用栈。
  • Node.js 应用
    • 在日志中定期打印内存指标:使用 process.memoryUsage() 输出 RSS、HeapTotal、HeapUsed、External,观察是否单调增长。
    • 动态抓取堆快照:启动时加 –inspect,安装 heapdump,通过代码或向进程发送 SIGUSR2 触发快照;用 Chrome DevTools 的 Memory 面板对比多份快照定位泄漏对象与保留路径。
    • 运行期监控:使用 pm2 monit 观察内存曲线,必要时设置重启策略以兜底。

四 验证与修复闭环

  • 复现与压测:在测试环境构造接近生产的负载(如 ab、wrk、jmeter),结合上述工具观察内存是否再次持续增长;无法复现时,回放生产流量或延长观察窗口。
  • 代码侧常见根因与修复
    • Node.js:全局变量累积、闭包引用意外持有、事件监听器未移除、缓存无限增长等;对应做法是清理引用、及时 off 监听、引入 WeakMap/WeakSet、对缓存设置 TTL/容量上限
    • C/C++:malloc/free 不匹配、未释放的缓存/对象、容器持有失效指针;使用智能指针、RAII、容器清理与对象生命周期审计。
  • 兜底与优化
    • 设置进程重启阈值(如 pm2 的 max_memory_restart)、优化缓存策略、拆分单体进程、升级依赖版本;必要时调整运行时内存限制(如 Node.js 的 –max-old-space-size)仅为缓解手段,根本仍需修复泄漏。

五 快速命令清单

  • 系统层面:
    • grep -i ‘killed process’ /var/log/syslog
    • sar -r
    • top/htop、pmap -x 、cat /proc//status | grep -i vm
  • C/C++:
    • valgrind --leak-check=full --show-leak-kinds=all --track-origins=yes ./app
    • g++ -fsanitize=address -g -O1 app.cpp -o app & & ./app
    • sudo /usr/share/bcc/tools/memleak -p $(pidof app)
  • Node.js:
    • 定时日志:process.memoryUsage() 输出 RSS/HeapTotal/HeapUsed/External
    • node --inspect app.js + heapdump + Chrome DevTools Memory 对比快照
    • pm2 monit / pm2 restart app --max-memory-restart 500M

声明:本文内容由网友自发贡献,本站不承担相应法律责任。对本内容有异议或投诉,请联系2913721942#qq.com核实处理,我们将尽快回复您,谢谢合作!


若转载请注明出处: Ubuntu日志中内存泄漏如何排查
本文地址: https://pptw.com/jishu/763441.html
Ubuntu日志中的网络问题如何诊断 如何利用Filebeat在Debian上进行系统监控

游客 回复需填写必要信息