内存泄漏排查

[TOC]

一、问题确认

如何排查内存泄漏问题

  • 可检查system_info_monitor.log日志中各进程的内存占用

alt text

典型内存泄漏情况

  • 内存OOM(out of memory)
    • 从syslog日志可观察到Out of memory alt text
  • aubo_control内存崩溃
    • 从aubo_scope日志可观察到卡顿助手记录并aubo_control内存占用异常 alt text

二、如何检查内存或CPU使用状态

1. 前期准备

  • 键盘

2. 打开终端

WIN(COMMAND) + T # 可用于创建多个终端

Ctrl + Alt + F1

登录账号:root 密码:bestcobot

Ctrl + Alt + F7 # 用于退出linux终端模式

3. 内存或CPU状态监控常用指令

top
top -Hp `pgrep aubo_control` # aubo_control 可替换其他进程名或pid
watch -n 1 "vmstat"
watch -n 1 "free -h"

4. 判断内存及CPU状态的基本流程

  1. top 指令查找对应内存明显存在异常的进程
    • 某进程占用 CPU 105% MEM 90%以上
    • aubo_control/aubo_scope 单臂连接 CPU/MEM 20%以上
  2. top -Hp pgrep <目标进程名>指令进一步判断进程内线程对应的资源占用情况
  3. watch -n 1 "vmstat" 监控vmstat报告
  4. watch -n 1 "free -h"监控内存使用情况
  5. 在1、2步骤下发现明显占用异常,收集3、4的信息及日志提交至TR

三、aubo_control 内存分析示例

当通过 top 等命令发现 aubo_cotrol 进程的内存异常后,可以进一步排查异常原因,一些可能用到的方法:

1. 通过 top 命令查看 aubo_control 的线程

top -Hp `pgrep aubo_control`
  • PID: 线程id (重启或者重新运行工程,线程id会发生变化)
  • RES: aubo_control 占用内存(KB)
  • %CPU: 线程占用的 cpu 资源百分比
  • %MEM: aubo_control 占用的内存资源百分比
  • COMMAND: 线程名称

img

2. 监控某个线程的内存操作系统调用

strace -e trace=mmap,munmap,brk -p <线程id> -k
  • -e trace= 参数: 仅跟踪指定的系统调用(过滤无关信息)
  • -k 选项: 显示系统调用的内核参数和返回值(辅助调试),某些旧版本系统可能不支持

比如想要监控 Script Runtime 线程,先通过 top -Hp 得知 Script Runtime 线程的 id 为 1690917,输入命令

strace -e trace=mmap,munmap,brk -p 1690917 -k

img

如果 Script Runtime 线程有 mmap、munmap 或者 brk 调用,则在终端可以看到

3. 查看 aubo_control 进程资源情况

pidstat -r 1 -p `pgrep aubo_control`
  • minflt/s: 每秒发生的次要(不涉及磁盘 I/O)页面错误数。
  • majflt/s: 每秒发生的主要(涉及磁盘 I/O)页面错误数。
  • VSZ: 进程使用的虚拟内存大小,单位为 KB。
  • RSS: 进程使用的常驻内存大小,单位为 KB。

img

4. htop 查看 aubo_control 资源占用

htop 是一个开源工具,是 top 的增强版,linux系统不自带,可能需要手动安装

apt install htop
htop -p `pgrep aubo_control`

img

默认不显示线程名称,可以通过 F2 -> Display options -> 选中 Show custom thread names,按下回车,F10 退出。

img

然后就可显示线程名称了

img

5. htop 查看某个线程的系统调用

htop -p `pgrep aubo_control`

选中某个线程后,按下键盘 s 键,可以看到此刻此线程的系统调用,按下 ESC 返回

比如选中 Script Runtime 线程

img

按下 s

img

results matching ""

    No results matching ""