从BEAST.1.0.0-B66到BOOST.1.67.0.BEAST的端口上的性能下降
Performance drop on port from Beast.1.0.0-b66 to Boost.1.67.0.Beast
我已经观察到从野兽迁移的1.0.0-b66(使用boost.1.64.0(迁移到boost.1.67时,性能急剧下降(以及CPU消耗的急剧增加(。0.野兽(即野兽整合到增强中(。毫无疑问,我做错了什么,但我无法想象。
什么是:
typedef beast::http::request<beast::http::string_body> BeastHttpRequest;
现在是:
namespace http = boost::beast::http;
typedef http::request<http::string_body> BeastHttpRequest;
是什么:
beast::http::prepare(req);
beast::http::write(stream, req);
现在是:
req.prepare_payload();
http::write(stream, req);
当然,我还必须进行许多API更改。例如:
req.fields.replace(hdrName, hdrValue);
现在是:
req.set(hdrName, hdrValue);
该应用程序正常工作 - 包括SSL的握手和代理谈判 - 但我必须在CPU消耗中修复尖峰和性能下降。我想知道是否有人知道我已经忽略了一些明显的东西。
编辑:我应该提到我正在为SSL流使用Flat_Buffer。
我有机会介绍"端口"answers"端口后"性能数据。这是"端口"(即良好性能(呼叫链:
- 34.61% HttpRequest::send
- 32.02% beast::http::write<boost::asio::ssl::stream<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::stream_socket_service<boost::asio::ip::tcp> >&>, true, beast::http::string_body,
- 31.90% beast::http::write<boost::asio::ssl::stream<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::stream_socket_service<boost::asio::ip::tcp> >&>, true, beast::http::string_bo
- 20.77% beast::http::detail::write_preparation<true, beast::http::string_body, beast::http::basic_fields<std::allocator<char> > >::init
- 18.25% beast::http::detail::write_fields<beast::basic_streambuf<std::allocator<char> >, beast::http::basic_fields<std::allocator<char> > >
- 10.38% beast::write<beast::basic_streambuf<std::allocator<char> >, boost::basic_string_ref<char, std::char_traits<char> > >
- 10.20% beast::detail::write_dynabuf<beast::basic_streambuf<std::allocator<char> >, boost::basic_string_ref<char, std::char_traits<char> > >
+ 3.66% beast::basic_streambuf<std::allocator<char> >::prepare
+ 2.90% beast::basic_streambuf<std::allocator<char> >::commit
+ 1.81% boost::lexical_cast<std::string, boost::basic_string_ref<char, std::char_traits<char> > >
+ 1.47% boost::asio::buffer_copy<beast::basic_streambuf<std::allocator<char> >::mutable_buffers_type>
- 7.51% beast::write<beast::basic_streambuf<std::allocator<char> >, char [3]>
- 7.47% beast::detail::write_dynabuf<beast::basic_streambuf<std::allocator<char> >, 3ul>
+ 3.14% beast::basic_streambuf<std::allocator<char> >::prepare
+ 2.84% beast::basic_streambuf<std::allocator<char> >::commit
+ 1.32% boost::asio::buffer_copy<beast::basic_streambuf<std::allocator<char> >::mutable_buffers_type>
+ 2.04% beast::http::detail::write_start_line<beast::basic_streambuf<std::allocator<char> >, beast::http::basic_fields<std::allocator<char> > >
- 9.60% beast::http::string_body::writer::write<beast::http::detail::writef0_lambda<boost::asio::ssl::stream<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::stream_socket_serv
- 9.57% beast::http::detail::writef0_lambda<boost::asio::ssl::stream<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::stream_socket_service<boost::asio::ip::tcp> >&>, beast:
- 9.54% boost::asio::write<boost::asio::ssl::stream<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::stream_socket_service<boost::asio::ip::tcp> >&>, beast::detail::buffe
- 9.48% boost::asio::write<boost::asio::ssl::stream<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::stream_socket_service<boost::asio::ip::tcp> >&>, beast::detail::bu
- 8.55% boost::asio::ssl::stream<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::stream_socket_service<boost::asio::ip::tcp> >&>::write_some<boost::asio::detail::c
- 7.56% boost::asio::ssl::detail::io<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::stream_socket_service<boost::asio::ip::tcp> >, boost::asio::ssl::detail::wr
- 6.98% boost::asio::write<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::stream_socket_service<boost::asio::ip::tcp> >, boost::asio::mutable_buffers_1>
- 6.93% boost::asio::write<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::stream_socket_service<boost::asio::ip::tcp> >, boost::asio::mutable_buffers_1,
- 6.69% boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::stream_socket_service<boost::asio::ip::tcp> >::write_some<boost::asio::detail::consuming_buffer
- 6.69% boost::asio::stream_socket_service<boost::asio::ip::tcp>::send<boost::asio::detail::consuming_buffers<boost::asio::const_buffer, boost::asio::mutable_buffers_1>
- 6.67% boost::asio::detail::reactive_socket_service_base::send<boost::asio::detail::consuming_buffers<boost::asio::const_buffer, boost::asio::mutable_buffers_1> >
- 6.51% boost::asio::detail::socket_ops::sync_send
- 6.32% 0xec6d
- 6.08% system_call_fastpath
- 6.07% sys_sendmsg
- 6.06% __sys_sendmsg
- 5.94% ___sys_sendmsg
+ 5.84% sock_send
这是"端口"(即性能差(呼叫链:
- 53.77% HttpRequest::send
- 53.32% boost::beast::http::write<boost::asio::ssl::stream<boost::asio::basic_stream_socket<boost::asio::ip::tcp>&>, true, boost::beast::http::basic_string_body<char, std::char_traits<char>, std::allo
- 53.30% boost::beast::http::write<boost::asio::ssl::stream<boost::asio::basic_stream_socket<boost::asio::ip::tcp>&>, true, boost::beast::http::basic_string_body<char, std::char_traits<char>, std::a
- 53.14% boost::beast::http::write<boost::asio::ssl::stream<boost::asio::basic_stream_socket<boost::asio::ip::tcp>&>, true, boost::beast::http::basic_string_body<char, std::char_traits<char>, std
- 53.03% boost::beast::http::write_some<boost::asio::ssl::stream<boost::asio::basic_stream_socket<boost::asio::ip::tcp>&>, true, boost::beast::http::basic_string_body<char, std::char_traits<ch
- 52.95% boost::beast::http::detail::write_some_impl<boost::asio::ssl::stream<boost::asio::basic_stream_socket<boost::asio::ip::tcp>&>, true, boost::beast::http::basic_string_body<char, std
- 36.58% boost::beast::http::serializer<true, boost::beast::http::basic_string_body<char, std::char_traits<char>, std::allocator<char> >, boost::beast::http::basic_fields<std::allocator<
- 35.28% boost::beast::http::serializer<true, boost::beast::http::basic_string_body<char, std::char_traits<char>, std::allocator<char> >, boost::beast::http::basic_fields<std::allocat
- 25.93% boost::beast::http::detail::write_some_lambda<boost::asio::ssl::stream<boost::asio::basic_stream_socket<boost::asio::ip::tcp>&> >::operator()<boost::beast::detail::buffers
- 25.82% boost::asio::ssl::stream<boost::asio::basic_stream_socket<boost::asio::ip::tcp>&>::write_some<boost::beast::detail::buffers_ref<boost::beast::buffers_prefix_view<boost:
- 25.69% boost::asio::ssl::detail::io<boost::asio::basic_stream_socket<boost::asio::ip::tcp>, boost::asio::ssl::detail::write_op<boost::beast::detail::buffers_ref<boost::beas
- 22.20% boost::asio::write<boost::asio::basic_stream_socket<boost::asio::ip::tcp>, boost::asio::mutable_buffer>
- 22.13% boost::asio::write<boost::asio::basic_stream_socket<boost::asio::ip::tcp>, boost::asio::mutable_buffer, boost::asio::detail::transfer_all_t>
- 21.96% boost::asio::detail::write_buffer_sequence<boost::asio::basic_stream_socket<boost::asio::ip::tcp>, boost::asio::mutable_buffer, boost::asio::mutable_buffer
- 21.47% boost::asio::basic_stream_socket<boost::asio::ip::tcp>::write_some<boost::asio::const_buffers_1>
- 21.34% boost::asio::detail::reactive_socket_service_base::send<boost::asio::const_buffers_1>
- 21.17% boost::asio::detail::socket_ops::sync_send
- 20.45% 0xec6d
- 19.63% system_call_fastpath
- 19.57% sys_sendmsg
- 19.52% __sys_sendmsg
- 19.16% ___sys_sendmsg
+ 18.90% sock_sendmsg
应该更快,而不是较慢,因为对HTTP算法进行了优化。我想我知道发生了什么。如果您可以在使用常规插座而不是SSL时比较两个版本的性能,那将是有帮助的。boost::asio::ssl::stream
有一个缺点,即在编写大于一个的缓冲序列时,它会写入序列中每个缓冲区的插座,而不是将这些加密的缓冲区合并为单个写入。这可能会产生重大的性能影响。
这确实需要在boost.asio中固定,但是解决方法是,您可以编写自己的流包装器,其写入算法(当使用长度大于一个的buffer sequences(时,可以通过使用一个长度的序列来创建一个新的长度序列。memcpy
和动态分配。我还将在这里打开一个问题:https://github.com/boostorg/asio/issues
为什么两个版本的野兽差异?在序列化过程中,旧版本的野兽分配了内存,以保存消息的线性版本。当前版本使用的算法根本不需要内存分配。在正常情况下它的速度更快,但是正如您在使用ssl::stream
类型时发现的那样,它的速度可能会慢。
请参阅https://github.com/boostorg/beast/issues/1108
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- OpenMP阵列性能较差
- 递归列出所有目录中的C++与Python与Ruby的性能
- 如何在boost beast http请求中设置http头
- 大小相等但成员数量不同的结构之间的性能差异
- 为什么constexpr的性能比正常表达式差
- 在类中使用随机生成器时出现性能问题
- 在main()之外初始化std::vector会导致性能下降(多线程)
- 将附加参数传递给使用 beast::bind_front_handler 调用的函数
- 海湾合作委员会 ARM 性能下降
- GCC 和 Clang 代码性能的巨大差异
- 在容量内调整矢量大小时的性能影响
- 了解算法的性能差异(如果以不同的编程语言实现)
- 未达到的情况会影响开关外壳性能
- QStringList vs list<shared_ptr<QString>> 性能比较C++
- 是否总是可以将使用递归编写的程序重写为不使用递归的程序C++,性能观点是什么?
- 哪种方法更好,性能明智
- C++ 特征库:引用的性能开销<>
- 与多个 for 循环与单个 for 循环 wrt 相关的性能从多映射获取数据
- 从BEAST.1.0.0-B66到BOOST.1.67.0.BEAST的端口上的性能下降