2
0

More than 3 years have passed since last update.

Boost.Asioでサーバを実装する際のパフォーマンス改善

Last updated at Posted at 2020-06-19

内容

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));
    }
2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0