C++内存泄漏排查

内存泄漏排查

Posted by Liangjf on April 26, 2020

内存泄漏排查

问题背景:内存泄漏, 90分钟100M

项目是c++写的,出现内存泄漏,肯定马上检查内存相关的系统调用是否合理。

查找new delete,malloc new暂未发现异常调用(非成对使用)

底层内存管理使用jemalloc,监控页面显示还是一直内存泄漏,暂时通过每天凌晨重启来解决

查看日志,有个地方比较奇怪,写本地日志文件,但是写失败。追踪发现日志文件的目录没有创建,所以一直写日志失败。通过分析是,写本地日志文件,然后通过logtail收集日志,发送到阿里云日志系统。并且日志是异步写队列,没有做长度限制(一个坑,使用队列时要做长度限制,无界队列是非常恐怖的,会一直吃内存和一直堆积影响队列的性能)。

ps -p 1 -o lstart查看,1小时基本增长100M,所以之前写本地文件日志失败,异步写队列,又没做长度限制,造成了数据一直堆积,没有被消费,进而造成内存一直递增没有释放,进而内存泄漏。

1、通过创建日志文件的目录就解决了,释放了消息队列占用的内存 2、把日志写入kafka,然后发送到阿里云日志服务,避免写本地日志文件

通过这次排查内存泄漏问题。有几个收获:

  • 1、使用队列必须设置队列最大长度,最大消息量,无界队列在消费端有问题或者生产者和消费者速度不一致时,会造成严重的堆积,并且无限增长,直至消耗光内存,触发被系统kill掉
  • 2、善于借助工具来解决问题,提高效率