質問

私が読んで経験した

すべて(トルネードベースのアプリケーションは)がepollは特にツイストで、選択し、ポーリングベースのネットワーキングのための自然な代替であると信じて私をリードしています。これは、私は被害妄想になり、より良い技術や方法論のためにそのかなり稀ではない価格で来ています。

ファイルディスクリプタと選択肢の間のカップルダースの比較を読むことが幻想である直線的にスケール特にことを、ファイルディスクリプタは明らかにスピードとスケーラビリティのためのチャンピオンであることを示しています。これは、プロセッサとメモリの使用率については、ファイルディスクリプタはまだチャンピオンである何、言った?

役に立ちましたか?

解決

ソケットの非常に少数のために(もちろん、お使いのハードウェアによって異なりますが、私たちは10個以下の順序で何か話をしている)、メモリ使用量およびランタイムスピードでのepollを打つことができる選択。もちろん、ソケットのような小さな数字のために、両方のメカニズムは、あなたが本当に大多数のケースでは、この違いを気にしないように高速です。

一つの明確化、しかし。どちらも、直線的に選択して、ファイルディスクリプタスケール。大きな違いは、しかし、ユーザ空間に面したAPIは異なるものに基づいている複雑さを持っているということです。 select呼び出しのコストは、あなたがそれを渡す最も大きい番号のファイルディスクリプタの値と大体行きます。あなたは、単一のFDに選択した場合、100は、それが約2倍、単一のFDに選択するなどの高価なように、50が最高の下に多くのFDSを追加するのはとても自由ではないですので、実際にはこれよりも少し複雑だが、このほとんどの実装のために良い最初の近似である。

のepollのコストは、実際にそれらのイベントを持っているファイル記述子の数に近いです。あなたは200個のファイルディスクリプタを監視しているが、唯一の100それらのは、それらのイベントを持っている場合は、のみ100のアクティブなファイル記述子のために支払う(非常に大まか)です。ファイルディスクリプタは選択上の主要な利点の一つを提供する傾向があるところです。あなたがほとんどアイドル状態になっている数千のクライアントを持っている場合は、使用するときに、あなたはまだそれらのすべての千のために払っているを選択します。ただし、ファイルディスクリプタと、それはあなたがわずか数持っているようだ - 。あなたが唯一の任意の時点でアクティブになっているもののために払っているが、

これはすべてのepollは、ほとんどのワークロードの少ないCPU使用率につながることを意味します。限りメモリ使用量が行くように、それはトスアップのビットです。 selectは非常にコンパクトに必要なすべての情報を表すために管理しない(ファイル記述子毎に1ビット)。そして、FD_SETSIZE(通常は1024)あなたはselectで使用することができますどのように多くのファイル記述子の制限は(例外、書き込み、読み取り)あなたはselectで使用できる3つのFDのセットごとに128バイト以上を費やすことは決してないだろうことを意味します。これらの384バイトの最大と比較すると、ファイルディスクリプタは、豚の一種です。各ファイルディスクリプタは、マルチバイトの構造によって表されます。しかし、絶対的に、まだ多くのメモリを使用するつもりはありません。あなたは数十キロバイト(約20K 1000年あたりのファイルディスクリプタ、私は思う)でファイルディスクリプタの膨大な数を表すことができます。そして、あなたはまた、あなたが唯一のファイルディスクリプタを監視する場合selectとそれらのバイトのすべての384を過ごすために持っていますが、その値は1024であることを起こる、wherasのepollであなただけの20のバイトを費やすだろうという事実に投げることができます。それでも、すべてのこれらの数字はかなり小さいですので、あまり違いはありません。

そして、それはFD_SETSIZEファイルディスクリプタに限定されないことが、おそらくあなたは既にの認識しているファイルディスクリプタの他の利点は、もあります。あなたが持っている限り多くのファイルディスクリプタを監視するためにそれを使用することができます。あなたが唯一のファイルディスクリプタを持っていますが、その値はFD_SETSIZEよりも大きい場合や、ファイルディスクリプタは、あまりにもそれに動作しますが、selectません。

ランダムに、私も最近epollまたはselectと比較してpollする一つのわずかな欠点を発見しました。これらの3つのAPIのいずれも通常のファイル(ファイルシステム上、すなわち、ファイル)をサポートしていませんが、selectpollは常に読みやすく、常に書き込み可能のような記述子を報告するように、支持の欠如を提示します。これは、非ブロックファイルシステムI / Oのいずれかの意味の種類のためにそれらを不適当selectまたはpollを使用し、ファイルシステムからファイル記述子に遭遇することが起こるのプログラムは、少なくとも動作を継続します(または、それが失敗した場合、それはしません最高のパフォーマンスで、おそらくそれにもかかわらず、理由selectまたはpoll)でないこと。

一方、epollは、ERで速い失敗します。そのようなファイルディスクリプタを監視するように求められROR(EPERM、明らかに)。厳密に言えば、これはほとんど間違っています。これは、単に明示的な方法で支援の欠如を知らせるています。通常、単に潜在的に低下した性能で動作1のではなく、完全に壊れたアプリケーションでは、私は明示的な障害状態に拍手を送るだろうが、この1つは文書化されていないです(私の知る限り)、結果ます。

標準入出力と対話するときに

実際には、私はこれが出てくる見てきた唯一の場所です。ユーザーは、通常のファイルへ/からSTDINまたは標準出力をリダイレクトすることがあります。うまくファイルディスクリプタでサポートされている - - それは、アプリケーションを破り、通常のファイルとファイルディスクリプタが大声で失敗となります。

。以前stdinとstdoutがパイプだっただろう一方

他のヒント

私の会社でのテストでは、ファイルディスクリプタ()との1つの問題は、このように、単一のコストを選択するために比較して、思い付います。

、タイムアウト付きネットワークから読み取ろうとepoll_fdを(代わりFD_SETの)作成、及びepoll_fdにFDを追加する場合、はるかに高価な(簡単のmallocである)FD_SETを作成するよりも

前の回答を1として、プロセス内のFDの数が多くなるにつれて、選択のコストは()さえ万の中にFDの値で、高くなるが、私たちのテストでは、選択はまだ勝者でした。スレッドが待機し、単にブロッキングスレッドモデルを使用する場合にタイムアウトしない、ネットワークが読み込まという事実、およびネットワーク書き込みを克服しようとしている唯一のFDがある場合、これらは例です。もちろん、ブロッキングスレッドモデルは、非ブロッキング反応器システムと比較して低性能であるが、特定のレガシーコードベースと統合することが必要とされる、機会があります。

原子炉のモデルは新しいepoll_fdを毎回作成する必要はありませんので、

ユースケースのこの種は、高性能アプリケーションでは稀です。はっきり任意の高性能サーバ設計のために好ましいepoll_fdは、長寿命であるモデル--- ---についてのepollは、あらゆる方法で明確な勝者です。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top