1

送信されたパケットを読み取り、それらを処理するUDPネットワークアプリケーションがあります(同じスレッド)。読み取りは非ブロッキングであるため、ポーリングまたは選択を使用していません。

受信したパケットはセッションごとにグループ化されます。

作業は、進行中のセッションがあるかどうかによって管理されます。実行する作業がない場合、つまりセッションがない場合、または処理するパケットがない場合は、スピンする必要があります。

私はここにあるハイブリッドアルゴリズムを見てきました: http ://www.1024cores.net/home/lock-free-algorithms/tricks/spinning

それで遊んでいます。忙しい待ち時間の方が多いと言われています。不要な処理や不必要に高いCPU使用率を防ぐために、どのような方法を使用していますか?

編集:

すべての回答とコメントをありがとう。私は今、次のことをしています。ネットワークからの読み取りに関しては、他にやるべきことがあるかどうかを確認します。ある場合は、タイムアウトをゼロにしてpollを呼び出します。次に、できるだけ多くのパケットを読み取り、処理のためにメモリキューに入れます。他に作業がない場合は、無期限にポーリングします(つまり、-1)。うまく機能しているようです。CPUはビジー状態のときにのみハイになり、それ以外の場合はゼロになります。

4

3 に答える 3

3

何もすることがない場合は、ブロックする必要があります-ソケット自体ではない場合(つまり、複数のネットワークソケットまたはイベントタイプを処理するイベントループの場合)、何かが発生したときに信号が送信されるゲート(設計OSが非同期I/Oを実行する方法によって異なります)。

スピニングは、非常に短い時間(通常はカーネルモードでのみ)待機しているときにのみ実行する必要があることです。

于 2011-04-13T06:07:50.820 に答える
1

ソケットから読み取る必要があるため、ブロッキング読み取りを実行できます。パケットがなければ、実行する理由はありませんよね?

複数のソケットがある場合、ブロッキング読み取りは機能しないため、複数の記述子を監視するにはpselect()が必要です。

明らかな何かが欠けていますか?

データグラムを受け取った後、長期的な処理が必要になる場合がありますノンブロッキングI/Oを使用する理由が、セッションでの作業中に着信トラフィックを無視しないようにするためである場合、その場合、当然のことはセッションをfork()することです。(うーん、それでも私は何かが欠けているに違いないと思います...)

于 2011-04-13T05:53:36.313 に答える
1

1秒あたり何パケットを処理していますか?これらのパケットの処理にはどのくらい時間がかかりますか?ブロッキングスレッドを使用する場合、取得する平均CPU使用率はどれくらいですか?

ブロッキング待機が100%の使用率に近く、ブロッキング自体から数ビットのパフォーマンスを削減することが役立つ場合を除いて、スピニングはパフォーマンスを向上させるのではなく、悪化させます。スピンすることで、他のコードを実行するために使用できない1つのコアをロックします(おそらく、作業を提供するコードを含みます:つまり、ネットワークを読み取り、アプリにパケットを渡すカーネルコード)、作業を実行せずにリソースを消費しますまったく...

非ブロッキングスピンウェイトよりもブロッキングコードを書くのが難しいと記事に書かれている場合、作成者はブロッキングバージョンがシステムに実装されている操作について話しているのではなく、スレッド上で条件を待機する必要がある状況について話していることに注意してください他のスレッドによってトリガーされます(共有変数の値が制限を上回ったり下回ったりすると、フラグが変更されます...)。

また、条件をチェックするコストが高い場合、ループの反復ごとにそのコストがスピンで発生します。これは、一度チェックして高額な待機を実行するコストをはるかに超える可能性があります。

スピニングはアクティブ待機であることに注意してください。アクティブ待機アプローチはプロセッサ時間を消費することを意味するため、プロセッサを消費せずにアクティブに待機する方法を尋ねるのは意味がありません。不必要なCPU使用率を回避するために何ができますか?ブロッキング呼び出しを使用して、次のパケットを取得します。UDPパケットを読み取る特定のケースでは、非ブロッキング読み取りへの2回の呼び出しは、ブロッキング読み取り操作への1回の呼び出しよりも処理時間のコストが高くないことを疑っています。

最初の質問についてもう一度考えてみてください。これは次のように要約できます。ブロッキングがボトルネックであることが証明されていますか?*これはアクティブな待機が実際に役立つシナリオですか?*

于 2011-04-13T07:37:52.430 に答える