内容
Boost.AsioでHTTPサーバ処理を実装してみたところ、同じ環境にインストールしたnginxと比較して妙に遅い。メモリをキャッシュしてみたりしても遅い。いろいろ試したところ、io_service(io_context)の使い方に問題があった。
解決策
io_service の使い方にあるように、一つのio_service(io_context)を複数スレッドで使い回すと遅い。
実装
最初にlistenしておいて複数のスレッドでacceptする。
auto endpoint = boost::asio::ip::tcp::endpoint(boost::asio::ip::tcp::v6(), port);
acceptor.open(endpoint.protocol());
acceptor.bind(endpoint);
acceptor.listen();
実際に各スレッドでacceptする処理では上記のacceptorからnative_handle()
で取得した値を使えばよい。
boost::asio::io_context io_context;
boost::asio::ip::tcp::acceptor acceptor2(io_context);
acceptor2.assign(boost::asio::ip::tcp::v6(), acceptor.native_handle());
acceptor2.async_accept(...);
boost::asio::io_context
を1スレッドで使うのならstrandを使わなくてもよい。
int thread_count = std::thread::hardware_concurrency();
for (int i = 0; i < thread_count; ++i) {
auto p = std::make_unique<std::thread>([] {
boost::asio::io_context io_context(1);
// acceptする
io_context.run();
return;
});
threads.push_back(std::move(p));
}