私は読んでいますLinux Kernel Development
そして、私には完全に明確ではない何かがあります-割り込みがハードウェアによってトリガーされたとき、割り込み処理ロジックを実行するCPUを決定する基準は何ですか?
IOリクエストを発生させたCPUと常に同じである必要があると想像できますが、スレッドは現在すべての目的のためにスリープしているため、実際にはそれほど重要ではありません。
一方、発生する必要のある(たとえば、スケジューラの)タイミング割り込みがある場合があります。 SMPシステムでは、それらは常に同じコア(たとえば、#0)で発生しますか、それとも常にいずれかのコアでかなり発生しますか?
実際にはどのように機能しますか?
ありがとう
マルチプロセッサ/マルチコアシステムでは、 irqbalance
という名前のデーモンプロセスが見つかる場合があります。その仕事は、プロセッサ間のハードウェア割り込みの分布を調整することです。
ブート時に、ファームウェアがシステムの制御をカーネルに渡すとき、最初は1つのCPUコアだけが実行されています。最初のコア(通常はコア#0、「モナークCPU /コア」とも呼ばれます)は、システムを初期化して他のCPUコアを起動する前に、最初にファームウェアからすべての割り込み処理の責任を引き継ぎます。したがって、負荷を分散するために何も行われなかった場合、システムを最初に起動したコアは、すべての割り込み処理の義務を負います。
https://www.kernel.org/doc/Documentation/IRQ-affinity.txt は、最新のカーネルでは、すべてのCPUコアがデフォルトでIRQを同等に処理できることを示唆しています。しかし、これは、たとえば、頻繁なIRQソースを持つCPUキャッシュラインの非効率的な使用。それを修正するのがirqbalance
の仕事です。
irqbalance
はカーネルプロセスではありません。これはスタンドアロンバイナリ/usr/sbin/irqbalance
であり、ワンショットモード(つまり、ブートプロセスの一部として一度割り込みの分布を調整して終了)または次のいずれかで実行できます。デーモン。異なるLinuxディストリビューションでは、異なる方法で使用するか、まったく使用しないかを選択できます。ユーザー空間のバイナリを更新するだけで、プロセッサにIRQを割り当てるための任意の複雑な戦略を簡単にテストおよび実装できます。
IRQごとの/proc/irq/%i/smp_affinity
ファイルを使用して、各CPUが処理できるIRQを制御します。詳細に興味がある場合は、 irqbalance
のソースコードを確認してください。IRQ設定の実際の割り当ては activate.c
で行われます 。