2017-05-11 5 views
0

私のアプリケーションは、システム上で動作する他のアプリケーションに対して高性能のサーバとして機能します。開発中、私はコアの約30%がeventfd_write()を呼び出すために消費されたので、単一のシステムコールを使用して複数のevenfdを書き込むためにlibaioを使用しようとしました。 AIOはeventfdではサポートされていないことがわかりました。Linuxを使用してeventfdに書き込むAIO

eventfdにAIOを実装していない、または今のところ誰もこれを必要としていないという明白な障害はありますか?

eventfdにAIOを実装しようとしている既存の作業を知っていますか?

+2

Aは/からのeventfdに読み取り/書き込みRAMに8バイトの整数を読み書きするだけです。私は、AIOを介して同じことをすることは、不均衡なオーバーヘッドを追加すると思います。したがって、AIOを使用することには利点はありません。 – user803422

+0

はい、私はそれを知っていますが、毎秒1Mのeventfd_writesを約30個以上の異なるeventfdに発行すると、すべてのシステムコールがmetterを開始するため、この問題は2つの書き込みを一度に発行することによってシステムコールの数を減らすよう求められます。 – BeginEnd

+1

"1M eventfd_writes per second"←問題があります。本当に1Mのイベントがありますか?それとも、実際に何度も読むのですか? –

答えて

0

eventfdへの書き込みは単なるメモリへの書き込みですが、書き込み自体はシステムコールです。したがって、CPUはコンテキストを切り替えて、カーネルにジャンプし、速い書き込みをしてから、あなたのユーザー空間アプリケーションに戻さなければなりません。

コンテキストスイッチには多くのコストがかかりますが、これは単なる64ビットの書き込みです。

私たちにはどんなオプションがありますか?

  1. eventfdを使用しないでください。共有メモリにアトミックフラグを使用してください。システムコールを削除すると、パフォーマンスが大幅に向上します。

  2. は、各イベントでのeventfdに書き込まないでください:

    • グループにバッチであなたのイベントを考慮し、一度だけバッチあたりの書き込み。
    • イベントのキューが空でない場合はポーリングモードに切り替え、キューが再び空になったらスイッチバックすることを検討してください。
  3. あなたの状況に合った場合、別のスレッドにeventfdの書き込みを移動します。

私はあなたがいくつかのより多くの最適化を思い付くしますので、あなたは、より良いあなたのアプリケーションを知っていると確信しています...そうでない場合は - ちょうどStackOverflowの上で尋ねる;)

関連する問題