我希望有人能给我一个线索在哪里调查...
我正在运行来自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二进制文件:我使用脚本来模拟30个tcp客户端,每个线程的行为基本上都是:
所以我怀疑是:
此致
答案 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)
显示内存增加:
细分表明这是由于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的队列深度,但确实更改内存配置文件<强> 显着 强>:
显然,使用deque作为一个双端队列o.O这是非常令人惊讶的。我将尝试使用libc ++:
有趣的是,使用std::deque
和缩小到适合的libc ++显示了一个不同的 - 仍然是坏曲线。另请注意,它报告了不断增长的std::deque<>
队列深度。不知何故,它表现得与众不同...... o.O
¹即使客户也立即开始咯咯叫,队列深度也不会超过100 - 所以吞吐量仍然很好。