どのCPUがどの割り込みを処理するかを決定するためのLinuxカーネルの戦略は何ですか?

どのCPUがどの割り込みを処理するかを決定するためのLinuxカーネルの戦略は何ですか?

私が読んLinux Kernel Developmentでいるのにはわからないことが1つあります。ハードウェアが割り込みをトリガするときにどのCPUが割り込み処理ロジックを実行するかを決定する基準は何ですか?

IO要求を行うCPUは常に同じでなければならないと想像できますが、現在のスレッドはあらゆる目的のためにスリープモードなので、これは意味がありません。

一方、タイムアウト割り込み(スケジューラなど)を発生させる必要があるかもしれません。 SMPシステムでは、常に同じコア(例:#0)でレイズしますか、または常にランダムコアでレイズしますか?

実際にどのように機能しますか?

ありがとう

答え1

マルチプロセッサ/マルチコアシステムには、次のものがあります。名前付きデーモンirqbalance。その使命は、プロセッサ間のハードウェア割り込みの配布を調整することです。

起動時にファームウェアがシステム制御をコアに渡すと、最初は1つのCPUコアのみが実行されます。最初のコア(通常はコア#0、「モナークCPU /コア」とも呼ばれます)は、最初にファームウェアのすべての割り込み処理を担当し、システムを初期化して別のCPUコアを起動します。したがって、負荷を分散するために何もしないと、最初にシステムを起動するコアはすべての割り込み処理の責任を負います。

https://www.kernel.org/doc/Documentation/IRQ-affinity.txt最新のコアでは、デフォルトですべてのCPUコアがIRQを同じように処理できるようにすることをお勧めします。ただし、これはCPUキャッシュラインを非効率的に使用し、IRQソースを頻繁に使用するため、最善の解決策ではない可能性があります。irqbalanceこの問題を解決することが私たちの使命です。

irqbalance/usr/sbin/irqbalanceカーネルプロセスではありません。使い捨てモード(起動プロセスの一部として割り込み割り当てを調整してから終了)、またはデーモンプロセスとして実行できるスタンドアロンバイナリ。さまざまなLinuxディストリビューションでは、これをさまざまな方法で使用したり、完全に省略したりできます。 IRQをプロセッサに割り当てるためにユーザー空間バイナリを簡単に更新することで、任意の複雑な戦略を簡単にテストして実装できます。

各CPUが処理できるIRQを制御するために、IRQ固有の/proc/irq/%i/smp_affinityファイルを使用して機能します。詳しくは気になる方は、ソースコードの確認irqbalance:IRQ設定の実際の割り当ては次のようになります。activate.c

関連情報