ハイエンドストレージデバイス用の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から呼び出した場合、ユーザープロセスの再開に時間がかかるのはなぜですか?これはスケジューラの問題ですか?そして、遅延をなくす、または下げる方法はありますか?