IronsDu / brynet

A Header-Only cross-platform C++ TCP network library . We can use vcpkg(https://github.com/Microsoft/vcpkg/tree/master/ports/brynet) install brynet.
MIT License
1.04k stars 241 forks source link

在一个http session中,循环很多次调用session->send发送文件数据,内存占用会一直涨,需要关闭session之后才能释放 #141

Closed eework closed 12 months ago

eework commented 1 year ago

你好 IronsDu,最近在使用你的大作brynet做http文件传输业务,发现了一个问题,如题,调用HttpSession的send发送数据,内存涨的问题,在tcpConnection.hpp的Flush中,尝试修改:在mSendList.erase(it)之前对其it->data.reset(); 问题依然。 期待你的回复

eework commented 1 year ago

另外还有没有一个可能mSendList这个deque内存空间释放问题,没有管理过程释放?

IronsDu commented 1 year ago

请问有能复现的测试代码么? 或者给一些关键的代码片段/伪代码。

IronsDu commented 1 year ago

可以加QQ群:309800774 进行交流。

eework commented 1 year ago

找到原因了,主要是因为eventloop里面IN事件的接收处理里面的http callback是一种同步方式的处理,我在httpXXXcallback里面去发送文件数据,最终会投递到待发送队列mSendList里面做合并发送,但仅限于发送数据投递,只有在httpXXXcallback处理完成后,才会去调用flush把数据发走。如果这样的话,我在http callback里面如果投递了很多发送数据,内存就会涨起来。

我做了一些修改,加入线程次,把在httpXXXcallback里面把http sesstion投递给线程池去做业务处理,这样httpXXXcallback也能迅速返回去Flush数据出去

IronsDu commented 1 year ago

好的。(对于直接在网络事件的回调里进行网络操作)这种情况我确实没办法找到内置的好的处理方式。

IronsDu commented 1 year ago

有什么问题欢迎提交issue。