2016-05-13 7 views
1

私はメッセージングライブラリ用のIOコアを作成しており、libuvとLinux上のraw epollとWindows上のIOCP(そして最終的には他のsolarisイベントなど)を考慮しています。 libuv、私はパフォーマンスを見ています。libuvとraw epollまたはIOCP

epollとIOCPによって、複数のスレッドがIOイベントを直接待機できるため、カーネルがディスパッチします。私は数字を持っていませんが、ユーザー空間のディスパッチよりも潜在的に効率的です。

libuv(私の読書に基づいて)スレッドのusafeイベントループがありますが、私はリーダーフォロワスレッドプールを実装することができます。それは、あるスレッド(一度に1つのスレッド)がイベントを待っている「リーダー」を意味するということです。リーダーがイベントを受け取ると、フォロワーがリーダーとして引き継ぐべきであることを伝えます。元リーダーはイベントを処理し、フォロワーになります。

libuvが効率的に実装されていると仮定すると、生のマルチスレッドepoll/IOCPとパフォーマンスが近いはずです。私は私自身の測定をしますが、私は経験を持つ人から聞きたいと思います。

答えて

3

免責事項:私はlibuvのメンテナーの一人です。

私はlibuvを使い始めることをお勧めします。もしそれが既にコーナーケースの邪魔をしていて、たくさんの知識が組み込まれているからだけです。あなたが他のプラットフォームをサポートしたい場合は、libuvの改革に終わります:-)

libuvでサーバ​​ープロトタイプを構築し、いくつかのベンチマークを実行し、ボトルネックがどこにあるかを確認します。あなたが書いているサーバのタイプによっては、libuvはマルチスレッドイベントループを必要とするかもしれませんが、libuvは十分にうまくいくでしょう。

+0

サーバーが構築されているので、私はそれをより速くする必要があります。マルチスレッドはオプションではありません。マルチコアマシンを拡張する必要があります。理想的には、接続ごとのアクティビティ(epollのような)をシリアライズできるポータブルマルチスレッドポーラーが好きです。しかし、私は、リーダフォロワスタイルで実行されるシングルスレッドのlibuvイベントループがトリックを行うことができると考えています。非同期の読み込み/書き込みのためのかなり軽量のバッファハンドオーバだけがlibuvを介してシリアル化されます。少なくともそれは私が望んでいるものです:) –

+0

次のアプローチを取ることができます:スレッドごとに1つのループを持ち、着信接続を処理し、ラウンドで 'uv_write2'を使って「ワーカー」スレッドにディスパッチする1つの「メイン」スレッド - ロビンファッション。したがって、各作業者は1/Nの接続を処理します。 – saghul

関連する問題