内存飙升 - 提升ASIO异步读取性能

5

我编写了一个从客户端读取数据的服务器:

使用boost::array缓冲区

启动服务器后,系统监视器显示1MB的使用率。

1.) 只需执行async_read_some并执行handleRead,在其中再次调用asyncRead函数。

void asyncRead() {
    m_socket->async_read_some(
        boost::asio::buffer(m_readBuffer, READ_BLOCK_SIZE),
        m_strand->wrap(boost::bind(&ConnectionHandler::handleRead,
                                   shared_from_this(),
                                   boost::asio::placeholders::error,
                                   boost::asio::placeholders::bytes_transferred))
    );
}

在 handleRead 方法中,我会验证是否存在任何错误,如果没有错误则直接发出另一个 asyncRead() 请求。
2.) 持续发送大小约为102字节的数据帧。
在测试10000个数据帧后,总发送大小=102*10000,总读取大小=102*10000。
但是,系统监视器中的内存使用量激增至7.8 Mb。
无法确定增加的原因。尝试了以下不同方面: 1.) 所建立连接数量-仅为1。 2.) 已验证连接关闭-是的。 3.) 停止了 ioServic 但仍然没有变化。
在第二次运行客户端时,我发现内存正在增加。可能是怎么回事?我使用的是 boost::array,它是一个堆栈变量,并且只是简单地读取。没有其他地方初始化缓冲区。

3
你尝试过使用内存泄漏分析器,例如valgrind吗? - Sam Miller
问题出在连接处理程序对象的状态重置上,这些对象是在池中创建和维护的。因此,当我们从池中取出旧对象时,会导致某些资源泄漏。 - Raja
1
@Raja:听起来你的问题与你发布的任何代码都无关。也许你应该修改这个问题或者删除它。 - Omnifarious
1个回答

0

Raja,

首先,您是否知道async_read_some不能保证您将读取整个READ_BLOCK_SIZE?如果您需要这种保证,我建议您使用async_read。

现在,回到最初的问题,您的情况非常典型。因此,您需要一个容器(数组),它将保存数据直到发送完成,然后您需要摆脱它。

我强烈建议您切换到boost shared_array。您可以像使用boost array一样使用它,但它具有内置的引用计数器,因此当不再需要对象时,它将被删除。这应该解决您的内存泄漏问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接