8

Linuxの非同期IOと呼ばれる知らなかった新しいパラダイムを見始めました。

私の目標は、非同期IOターゲティングソケットを使用して、高性能で効率的なサーバーを作成することです。その理由は、私のアプリケーションがIOバウンドであるためです。

より多くの情報を探している間、私は次の2つの紹介に出くわしました。

  1. Posix AIO

  2. LinuxAIOインターフェース

非同期フレームワークでは、アプリケーションを強制終了するため、非同期で処理する必要がある通知ごとに新しいスレッドを作成することを避けたい状況です。

私の質問は次のとおりです。

  1. これら2つのフレームワークの舞台裏は、この問題に対処していますか?

  2. はいの場合、ソケットを念頭に置いて何を提案しますか?

よろしく

AFG

4

2 に答える 2

8

これらのどれも実際にはソケットを対象としていません。

POSIX AIOインターフェースは、通常のブロッキングIOを使用するスレッドを作成します。それらはバッファキャッシュで動作し、原則としてソケットでも動作するはずです(私は確かに試していませんが)。

LinuxカーネルのAIOインターフェースは、要求を処理するためのスレッドを作成しません。これは、「バッファリングなし」モードでのみ機能します。状況によってはリクエストを送信する際のブロックなど、予測も防止もできない(プログラムが「奇妙な」動作をすること以外は知らない)などの非自明な動作に注意してください。

必要なのは、非ブロッキングソケット(非ブロッキングソケットは「一種の非同期」)でありepoll、準備通知のオーバーヘッドを最小限に抑え、(ほとんど存在しないドキュメントを把握できる場合spliceは) vmspliceIOを削減することです。オーバーヘッド。splice/を使用vmspliceすると、ディスクからカーネルバッファに直接DMAを実行し、そこからネットワークスタックにプッシュできます。または、アプリケーションのアドレス空間からカーネルにページを直接移動して、ネットワークにプッシュすることもできます。
欠点は、ドキュメントがまばらであり(控えめに言っても)、特にTCPの場合、メモリを再利用しても安全な場合など、いくつかの質問が未解決のままであるということです。

于 2012-07-08T19:58:59.657 に答える
1

ネットワークプログラミングの目的で、 select(2)呼び出しを使用して(最も基本的な形式で)実装され、 poll( ) 、 epoll( kpoll()などを使用する一部のシステムに実装されたイベントベースのI/Oが必要になります。

POSIX AIO(Linux AIOが実装されている)は、必ずしもソケットで機能するとは限りません(Linux 2.5コードベースのある時点で機能しましたが、それでも可能かどうかはわかりません)。

Unixでの高性能ソケットI/Oは、代わりにイベントベースの方法で実行され、着信イベントをループで処理します。イベントには、「ソケットに書き込みの準備ができました」、「ソケットに新しいデータがあります」などがあり、それらに反応します。

于 2012-07-08T19:58:44.463 に答える