提升1.55 asio tcp cpp03 chat_server示例内存泄漏

时间:2016-01-13 17:09:14

标签: c++ sockets boost tcp

我希望有人能给我一个线索在哪里调查...

我正在运行来自boost

的chat_server示例

http://www.boost.org/doc/libs/1_55_0/doc/html/boost_asio/example/cpp03/chat/chat_server.cpp

在Visual Studio 2010上,Windows 10和我从以下网站下载了boost二进制文件:

http://sourceforge.net/projects/boost/files/boost-binaries/1.55.0/boost_1_55_0-msvc-10.0-32.exe/download

我使用脚本来模拟30个tcp客户端,每个线程的行为基本上都是:

  1. 连接到tcp服务器
  2. 开始循环
  3. 向tcp服务器发送消息
  4. 从tcp服务器收到消息
  5. 睡眠
  6. 回到第2步
  7. 奇怪的是,当我使用Windows任务管理器监视内存消耗时。列私人工作集共享工作集中的数字在将近18分钟内保持“稳定”,之后私人工作集的值开始每分钟增加近5 MB。

    所以我怀疑是:

    1. 以前有没有人见过类似的东西?
    2. 可能导致这种情况的原因是什么?
    3. 此致

1 个答案:

答案 0 :(得分:4)

服务器保留聊天记录,但只保留“ringbuffer”中的100条最新消息(实际上是deque<chat_message>)。

确实在大量客户进行大量聊天时进行测试:

(for c in {00..99}; do for a in {001..999}; do sleep .1; echo "Client $c message $a"; done | ./chat_client localhost 6767& done)

显示内存增加:

enter image description here

细分表明这是由于deliver_write_msgs_的分配,也是一个队列。

3.4 GiB: std::deque<chat_message, std::allocator<chat_message> >::_M_push_back_aux(chat_message const&) (new_allocator.h:104)
3.4 GiB: chat_session::deliver(chat_message const&) (stl_deque.h:1526)
但是,它并没有在逻辑上增长,所以看起来会出现一些不幸的行为。

我们来调查一下:

在总测试运行中(如上所示),任何会话的最大写入队列深度为60。

重新启动所有客户端(不重新加载服务器)后,队列深度立即增加到100,原因很明显(所有客户端都可以获得一次交付100件物品的完整历史记录)¹。

添加shrink_to_fit

shrink_to_fit中每次pop_front调用后添加对chat_session的调用都不会使行为更好(除了c ++ 03没有{ {1}}当然)。

使用其他容器

放入shrink_to_fit代替boost::circular_buffer,奇怪地即使在第一次运行时也很容易达到100的队列深度,但确实更改内存配置文件<强> 显着

enter image description here

显然,使用deque作为一个双端队列o.O这是非常令人惊讶的。我将尝试使用libc ++:

使用libc ++

有趣的是,使用std::deque和缩小到适合的libc ++显示了一个不同的 - 仍然是坏曲线。另请注意,它报告了不断增长的std::deque<>队列深度。不知何故,它表现得与众不同...... o.O

enter image description here

¹即使客户也立即开始咯咯叫,队列深度也不会超过100 - 所以吞吐量仍然很好。