私はメッセージングライブラリ用のIOコアを作成しており、libuvとLinux上のraw epollとWindows上のIOCP(そして最終的には他のsolarisイベントなど)を考慮しています。 libuv、私はパフォーマンスを見ています。libuvとraw epollまたはIOCP
epollとIOCPによって、複数のスレッドがIOイベントを直接待機できるため、カーネルがディスパッチします。私は数字を持っていませんが、ユーザー空間のディスパッチよりも潜在的に効率的です。
libuv(私の読書に基づいて)スレッドのusafeイベントループがありますが、私はリーダーフォロワスレッドプールを実装することができます。それは、あるスレッド(一度に1つのスレッド)がイベントを待っている「リーダー」を意味するということです。リーダーがイベントを受け取ると、フォロワーがリーダーとして引き継ぐべきであることを伝えます。元リーダーはイベントを処理し、フォロワーになります。
libuvが効率的に実装されていると仮定すると、生のマルチスレッドepoll/IOCPとパフォーマンスが近いはずです。私は私自身の測定をしますが、私は経験を持つ人から聞きたいと思います。
サーバーが構築されているので、私はそれをより速くする必要があります。マルチスレッドはオプションではありません。マルチコアマシンを拡張する必要があります。理想的には、接続ごとのアクティビティ(epollのような)をシリアライズできるポータブルマルチスレッドポーラーが好きです。しかし、私は、リーダフォロワスタイルで実行されるシングルスレッドのlibuvイベントループがトリックを行うことができると考えています。非同期の読み込み/書き込みのためのかなり軽量のバッファハンドオーバだけがlibuvを介してシリアル化されます。少なくともそれは私が望んでいるものです:) –
次のアプローチを取ることができます:スレッドごとに1つのループを持ち、着信接続を処理し、ラウンドで 'uv_write2'を使って「ワーカー」スレッドにディスパッチする1つの「メイン」スレッド - ロビンファッション。したがって、各作業者は1/Nの接続を処理します。 – saghul