一次进程虚拟内存占用超过200G问题分析

在对智驾软件系统资源进行分析时,发现一个进程虚存占用过高,超过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一栏中的调用关系可以定位到分配大量内存的函数

上面的图显示了函数每层分配的内存总量

下面的图展示了内存对时间的变化

至此,已经找到问题点

总结

  1. 一次性分配大块内存的,可通过gdb单步骤执行快速确认具体位置

  2. 持续小内存分配逐渐增长的,借助工具采集数据分析

关注非科班程序员,一起学习,一起进步

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值