CPUを横断するのに、なぜブロックI / Oの完了には時間がかかるのでしょうか?
-
19-09-2019 - |
質問
私は、ハイエンド・ストレージ・デバイス用のLinuxブロックドライバのうち、最もパフォーマンスを圧迫しようとしています。私は現時点では困惑ビットを持っている一つの問題はこれです:ユーザー・タスクが一つのCPU上(読み取りまたは書き込み)I / O動作を開始し、デバイスの割り込みは別のCPU上で発生した場合、私は前の遅延の約80マイクロ秒を招きますタスクが実行を再開します。
私は生のブロックデバイスに対して、この使用O_DIRECTを見ることができるので、これはページキャッシュまたはfilesystem-関連ではありません。それは要求キューを持っていないし、(あなたは私を信頼する必要があります、それは道より速く、この方法です)任意のカーネルI / Oスケジューラを利用しないので、ドライバーは、オペレーションを受け取るためにmake_request
を使用します。
私はこの問題は、一つのCPUと他のCPUに再スケジュールされたタスクにbio_endio
を呼び出しの間で発生したことを自分自身に証明することができます。タスクが同じCPU上にある場合、それは非常に迅速に開始し、タスクが別の物理CPU上にある場合、それは多くの時間がかかります - 通常は約80マイクロ秒より長く私の現在のテストシステムでインテル5520 [NUMA]チップセットに(x86_64版を)。
私は即座に、同じ物理CPUにプロセスを設定し、IRQのCPUアフィニティで私のパフォーマンスを倍増させることができますが、それは私はむしろ良好なパフォーマンスに関係なく、私を取得することができるだろうsolution--良好な長期ではありません/ Oが発生します。そして、私は唯一のIRQはので、私は、一度に1つのCPUにそれを操縦することはできませんしている - は良い多くのスレッドが多くのCPU上で実行されている場合は、
。私はCentOSに5.4の2.6.18メインライン2.6.32へのカーネルでは、この問題を見ることができます。
そこで質問です:私は別のCPUからbio_endio
を呼び出した場合、なぜそれが、再開するユーザプロセスのために長い時間がかかるのでしょうか?これは、スケジューラの問題ですか?そして、遅延を排除または低減する方法はありますか?
解決 4
が見える:キャッシュミスに関連すると思わ。割り込みを処理CPUは、I / Oを開始し、CPUはなかったとき、CPUが100%の使用率を打つことができ、その後、すべてがCPU間の通信に長い遅延があるような印象を与えて、遅くなります。
自分の考えのためのみんなに感謝します。
他のヒント
は、そのプロセッサは、新しいスレッド上で作業を開始するために、すぐに自由ですスレッドを使用すると、I / Oに仕上がっ1である可能性が高いです。
あなたが別のプロセッサ上で仕上げる場合は、一方、I / Oを要求したスレッドは、すぐに実行し得ることはありません - それが何であれ、現在実行されるまで待つ必要があり、その量子を終了またはその他のCPUを放棄<。 / P>
私の知る限り理解しています。
idle=poll
で起動してみてください、これをテストする - ちょうど、タスクがスケジュールされますCPUへのバイオを完了し、CPUからのIPIを発行することに固有の待ち時間である可能性があります。