内存泄漏排查
[TOC]
一、问题确认
如何排查内存泄漏问题
- 可检查system_info_monitor.log日志中各进程的内存占用
典型内存泄漏情况
- 内存OOM(out of memory)
- 从syslog日志可观察到Out of memory
- 从syslog日志可观察到Out of memory
- aubo_control内存崩溃
- 从aubo_scope日志可观察到卡顿助手记录并aubo_control内存占用异常
- 从aubo_scope日志可观察到卡顿助手记录并aubo_control内存占用异常
二、如何检查内存或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状态的基本流程
- top 指令查找对应内存明显存在异常的进程
- 某进程占用 CPU 105% MEM 90%以上
- aubo_control/aubo_scope 单臂连接 CPU/MEM 20%以上
- top -Hp
pgrep <目标进程名>
指令进一步判断进程内线程对应的资源占用情况 - watch -n 1 "vmstat" 监控vmstat报告
- watch -n 1 "free -h"监控内存使用情况
- 在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: 线程名称
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
如果 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。
4. htop 查看 aubo_control 资源占用
htop 是一个开源工具,是 top 的增强版,linux系统不自带,可能需要手动安装
apt install htop
htop -p `pgrep aubo_control`
默认不显示线程名称,可以通过 F2 -> Display options -> 选中 Show custom thread names,按下回车,F10 退出。
然后就可显示线程名称了
5. htop 查看某个线程的系统调用
htop -p `pgrep aubo_control`
选中某个线程后,按下键盘 s
键,可以看到此刻此线程的系统调用,按下 ESC 返回
比如选中 Script Runtime 线程
按下 s
键