【发布时间】:2018-04-25 15:32:32
【问题描述】:
我观察到从 Beast.1.0.0-b66(使用 Boost.1.64.0)迁移到 Boost.1.67.0.Beast(即集成了 Beast)后性能急剧下降(CPU 消耗急剧增加)进入升压)。毫无疑问我做错了什么,但我无法想象是什么。
什么是:
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。
我有机会分析“移植前”和“移植后”的性能数据。这是“端口前”(即良好的性能)调用链:
- 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
【问题讨论】:
-
这里的信息太少了。显然更改命名空间限定不会影响性能。您是否尝试过分析这两个版本并比较瓶颈?
-
我同意——没什么好说的。 Beast 只是一个相当大的应用程序的一小部分。请求被组成和发送,如图所示。读取就像平凡的
http::read(stream, buffer, res)。我将尝试提供一个展示问题的简单示例。 -
我刚刚编辑了原始帖子以包含
beast::http:write<>()和boost::beast::http::write<>()的调用链。 -
这些百分比是多少? (另外,您是否正在分析调试版本?)
-
这些百分比来自
perf。在这两种情况下,我都使用perf record -g运行我的(调试构建)应用程序,这些百分比代表发送 HTTP 请求所花费的相对时间。如您所见(底部),表现不佳者在sock_sendmsg()中花费的时间是表现良好者的三倍。
标签: c++ performance networking boost beast