在对智驾软件系统资源进行分析时,发现一个进程虚存占用过高,超过200G
top查看内存占用
有一个node应用占用了200G的虚拟内存
pmap查看该进程内存情况
pmap -x -p 8496
结果显示有两个异常点,刚好和虚存使用总量吻合
一个50G和一个170G的堆内存占用(anon指的是匿名映射,一般是通过malloc或者mmap分配的堆内存)
采集堆内存状态
使用valgrind Massif堆内存分析工具获取进程的定期堆内存状态
# 先安装valgrind工具:apt-get install valgrind
# 然后通过valgrind启动app
valgrind --tool=massif --time-unit=B ./bin/app_node --flagfile=./config/gflags.conf
按ctrl+c采集结束后会生成一个采集文件
文件以massif.out开头
分析数据
方式一:命令行下查看数据
ms_print massif.out.4025
方式二:使用massif-visualizer可视化界面更直观查看
安装massif-visualizer
# 安装可视化工具
sudo apt-get install massif-visualizer
打开massif-visualizer
导入采集文件
通过 Massif Data一栏中的调用关系可以定位到分配大量内存的函数
上面的图显示了函数每层分配的内存总量
下面的图展示了内存对时间的变化
至此,已经找到问题点
总结
-
一次性分配大块内存的,可通过gdb单步骤执行快速确认具体位置
-
持续小内存分配逐渐增长的,借助工具采集数据分析
关注非科班程序员,一起学习,一起进步