brpc icon indicating copy to clipboard operation
brpc copied to clipboard

brpc http_c++示例代码修改 server端接收后创建clinet发送数据发现可能存在内存泄露

Open ike47 opened this issue 1 year ago • 10 comments

Describe the bug (描述bug) http brpc server端接收后创建client发送数据,内存泄露

To Reproduce (复现方法) 基于Release1.7.0 brpc代码修改brpc http_c++示例代码; 1、在收到客户端访问v1/queue/stats 后开辟线程做一次brpc send(v1/start) image 2、客户端每执行一次,server进程都有20KB左右物理内存增加 ./http_client http://kkuser-virtual-machine:8010/v1/queue/stats image

Expected behavior (期望行为) 内存不会持续增加

Versions (各种版本) OS: Compiler: brpc: V1.7.0 protobuf:3.14.0

Additional context/screenshots (更多上下文/截图) image

ike47 avatar Jan 11 '24 08:01 ike47

这看着和brpc没关系吧,更像是业务代码问题,你用的std的线程,它的生命周期应该是你来维护而不是期望brpc来维护,先看看自己的业务代码有没有什么问题吧,是不是在里面分配了内存

Huixxi avatar Jan 22 '24 02:01 Huixxi

可以用heap profiler确认一下哪里有内存泄漏

chenBright avatar Jan 22 '24 02:01 chenBright

这看着和brpc没关系吧,更像是业务代码问题,你用的std的线程,它的生命周期应该是你来维护而不是期望brpc来维护,先看看自己的业务代码有没有什么问题吧,是不是在里面分配了内存

线程代码也已经贴截图了,线程里面是作为客户端发了一次brpc请求,没有申请内存;

ike47 avatar Jan 26 '24 06:01 ike47

可以用heap profiler确认一下哪里有内存泄漏

好,我试一下,目前观察到随着brpc通讯次数增加有个大约20M左右内存增长,后面就不会增加了。

ike47 avatar Jan 26 '24 06:01 ike47

这看着和brpc没关系吧,更像是业务代码问题,你用的std的线程,它的生命周期应该是你来维护而不是期望brpc来维护,先看看自己的业务代码有没有什么问题吧,是不是在里面分配了内存

线程代码也已经贴截图了,线程里面是作为客户端发了一次brpc请求,没有申请内存;

线程是你的客户端代码吧,内存增长的是server端么?

Huixxi avatar Jan 26 '24 06:01 Huixxi

这看着和brpc没关系吧,更像是业务代码问题,你用的std的线程,它的生命周期应该是你来维护而不是期望brpc来维护,先看看自己的业务代码有没有什么问题吧,是不是在里面分配了内存

线程代码也已经贴截图了,线程里面是作为客户端发了一次brpc请求,没有申请内存;

线程是你的客户端代码吧,内存增长的是server端么?

线程代码是服务端代码,模拟服务端作为客户端发送brpc请求给自己。 是的,服务端内存增长

ike47 avatar Jan 26 '24 07:01 ike47

可以用heap profiler确认一下哪里有内存泄漏 brpcheap.zip 已经导出,帮忙看一下 @chenBright

ike47 avatar Jan 26 '24 08:01 ike47

@ike47 按照文档指引,直接在内置服务看吧。profile不仅需要profile数据,还需要可行性文件。

chenBright avatar Jan 29 '24 02:01 chenBright

heaptxt.zip @chenBright 我在内置服务里导出成txt了

ike47 avatar Jan 29 '24 03:01 ike47

heap看着正常。涨的内存会不会缓存在tcmalloc freelist了?

chenBright avatar Jan 29 '24 06:01 chenBright