0

ハイエンドストレージデバイス用のLinuxブロックドライバーから最大限のパフォーマンスを引き出しようとしています。現時点で少し困惑している問題の1つは、ユーザータスクが1つのCPUでI / O操作(読み取りまたは書き込み)を開始し、デバイスの割り込みが別のCPUで発生した場合、その前に約80マイクロ秒の遅延が発生することです。タスクは実行を再開します。

これは、rawブロックデバイスに対してO_DIRECTを使用して確認できるため、ページキャッシュやファイルシステムに関連していません。ドライバーはmake_request操作の受信に使用するため、要求キューがなく、カーネルI / Oスケジューラーを使用しません(私を信頼する必要があります。この方法の方がはるかに高速です)。

bio_endioあるCPUでの呼び出しと、別のCPUでのタスクの再スケジュールの間に問題が発生することを自分自身に示すことができます。タスクが同じCPU上にある場合、タスクは非常に迅速に開始され、タスクが別の物理CPU上にある場合は、はるかに長い時間がかかります。通常、現在のテストシステム(Intel 5520 [NUMA]チップセットのx86_64)では約80マイクロ秒長くなります。 )。

プロセスとIRQcpuアフィニティを同じ物理CPUに設定することで、パフォーマンスを即座に2倍にすることができますが、これは長期的な解決策としては適切ではありません。I/ Oの発生元に関係なく、優れたパフォーマンスを得ることができます。また、IRQは1つしかないため、一度に1つのCPUにしか操作できません。多くのスレッドが多くのCPUで実行されている場合は、適切ではありません。

この問題は、Centos5.4の2.6.18からメインライン2.6.32までのカーネルで見られます。

bio_endioしたがって、問題は、別のCPUから呼び出した場合、ユーザープロセスの再開に時間がかかるのはなぜですか?これはスケジューラの問題ですか?そして、遅延をなくす、または下げる方法はありますか?

4

4 に答える 4

1

このパッチはLKMLに投稿されたばかりQUEUE_FLAG_SAME_CPUで、ブロックデバイスレイヤーに実装されています。これは次のように説明されています。

フラグを追加して、リクエストが送信されたCPUでリクエストを完了させます。フラグはを意味しQUEUE_FLAG_SAME_COMPます。デフォルトではオフになっています。

それはあなたが必要としているものかもしれないように聞こえます...

于 2009-12-21T04:28:12.233 に答える
1

特定のCPUでI/Oを終了すると、そのプロセッサはすぐに新しいスレッドでの作業を開始できます。要求されたスレッドと同じプロセッサでI / Oを終了すると、次のスレッドが発生する可能性があります。 I/Oを終了したものになります。

一方、別のプロセッサで終了した場合、i / Oを要求したスレッドはすぐには実行されません。現在実行中のスレッドがクォンタムを終了するか、CPUを放棄するまで待機する必要があります。

私が理解する限りでは。

于 2009-12-10T21:45:08.363 に答える
1

これは、バイオを完了したCPUからタスクがスケジュールされるCPUにIPIを発行することに固有の遅延である可能性があります。これをテストするには、で起動してみてくださいidle=poll

于 2009-12-11T00:09:29.887 に答える
0

問題を少し誤解したようです。キャッシュミスに関連しているようです。CPU処理割り込みがI/Oを開始したCPUではなかった場合、CPUは100%の使用率に達する可能性があり、その後すべてが遅くなり、CPU間の通信に長い遅延があるという印象を与えます。

みんなのアイデアに感謝します。

于 2009-12-17T14:04:04.110 に答える