4

8コアサーバーで約12スレッドを起動するプログラムがあります。一部のスレッドは重要なデータを待機しています。ループ内でrecvを使用している場合、recvはデータが到着するまでブロックします。ただし、データがある場合は、できるだけ早く処理する必要があります。

私が気づいたことの1つは、接続が静かになるときから、スレッドにはあまりアクティビティがないことです。スレッドがスリープ状態になる可能性があります(疑わしいですか?)。その後、データが着信すると、最初にウェイクアップする必要があるため、時間を無駄にします。スレッドがスリープ状態にならず、後でウェイクアップしないように設定する方法があるかどうか疑問に思っていますか?ありがとう!

4

2 に答える 2

2

スレッドだけでなく、他のスレッドもあります。広い範囲内では、実際にスレッドがいくつあるかは関係ありません。他のスレッドは、スレッドがで待機している間にスケジューラーによって選択される可能性がありますrecv。したがって、recvリターンを許可するデータがある場合、スレッドは実行の準備が整い、実行のためにスケジューラーによって選択される可能性があります。すべてのコアがスレッドよりも優先度の高いスレッドで占められていて、それらのタイムスライスが幸運にも終了しない場合、スレッドはCPUを待機する必要があります。ただし、データを取得した直後にスレッドrecvをスケジュールするには、スレッドの優先度を上げる必要があります。この場合、recvreturnはスレッドを「実行可能」にし、スケジューラーは優先度の低い他のスレッドを考慮する前にスレッドに切り替えます。必要に応じて、スレッドの優先度が低いスレッドも停止します。

于 2013-02-22T15:20:24.970 に答える
2

Martin Jamesが言ったように、ブロッキングは、単純なサーバーでもイベント駆動型サーバーでも、通常どおりに実行recvepollれます。実際に測定可能なレイテンシーの問題を観察していない場合は、心配する必要はありません。あなたは誰もがしていることをしている。

そして、実際に測定可能なレイテンシーの問題とは、明確に定義された目標の違いを意味します(たとえば、特定の負荷パターンでクライアントで測定された1ミリ秒の50%のレイテンシー、100ミリ秒の99.9%のレイテンシー、ブロッキングについて懸念している)と現実。

とは言うものの、プロセッサをビジー状態に保つのに十分な作業がない場合に、カーネルがプロセッサをスリープ状態の深すぎる状態にし、ウェイクアップ時にレイテンシが大きくなりすぎると、レイテンシに焦点を当てた人々が不満を言うのを聞いたことがあります。これは、アプリケーションではなく、カーネルレベルで制御したいものだと思います。レイテンシーの数値は手元にないので、これも測定したいものです。使用する最も深い睡眠状態を制御し、効果を測定する方法を見つけて(または作成して)ください。

于 2013-02-22T19:19:22.650 に答える