4

高性能サーバー (HTTP サーバーではない) を設計しており、設計オプションを検討しています。サーバーは、多数の着信接続 (数千単位) をサポートし、Windows と Linux の両方でコンパイルする必要があります。

Windows 側では、今のところストレスを処理しているように見える IO Completion Port サーバーを実装しました。Linux の需要が急増したため、スレッド プールで受け入れ/読み取りイベントを使用する方法を提供するクロスプラットフォーム ライブラリを見つけようとしています。

これまでのところ、libEvent が正しい選択のようです (このリンクの「サンプル コード: エコー サーバー」のようなもの)。しかし、libEvent docs の別のページから引用します。

event_base がロックを使用するように設定されている場合、複数のスレッド間で安全にアクセスできます。ただし、そのループは単一のスレッドでしか実行できません。複数のスレッドで IO をポーリングする場合は、スレッドごとに event_base が必要です。

私の基本的な設計は、イベントの受け入れと読み取りに反応するスレッド プールを用意することです。この引用は、私の理解が正しければ、それはできないと言っています。

誰もが高パフォーマンスの経験を持っていますか? サーバーは libEvent に基づいていますか? 別のライブラリを使用する必要がありますか?

このようなサーバーのコード例は完璧です

4

1 に答える 1

6

libeventクロスプラットフォームを維持したい場合は、これが最適です。

非常に効率的になりたい場合は、IO 完了ポート (Windows で作業している) やLinuxのepollなどのプラットフォーム固有の API をお勧めします。

いずれにせよ、libevent は Linux の内部で epoll を使用することに注意してください。

マルチスレッド設計に関するご質問については、各クライアント接続を処理するために 1 つのスレッドを使用していないことを願っています。そうすると、イベント ドリブン モデルを使用する目的に反することになります。少数のクライアント接続が 1 つのスレッドで処理されるようにコードを設計し、同時接続の数が増えるにつれてスレッドの数を増やす必要があります。

また、データを受信するIOを実行しているスレッドプールでクライアントが送信するデータに対して、負荷の高い計算作業を行うこともありません。ネットワーク集約型の IO を実行するタスクと、CPU 集約型の計算を実行するタスクを 2 つの別個のスレッドプールに分けます。

于 2013-03-20T16:29:48.597 に答える