ペリフェラルの割り込みを静的にコアに割り付けてみよう!

今回は、Cortex-A53上のLinuxでコアとペリフェラルの関係を見てみましょう。Linuxは基本的にはマルチコアはSMP (Symmetric Multi Processing)で動作するため、動的に空いているコアに処理を割り当てます。ただし、静的に特定の処理を特定のコアへ割り付けることも可能です。その具体的な方法を見てみましょう。

割り込みがどのコアで処理されているかは、下記のコマンドで確認できます。
# cat /proc/interrupts

図

/proc/irq以下にIRQ番号毎にディレクトリーが配置されています。

図

IRQ番号のディレクトリーへ入ると割り込みソース毎に設定するファイルが配置されています。smp_affinityは、割り込みをどのコアで制御するか設定するファイルです。MPSoCは4コアなので4bitを16進数で表現されます。

最下位ビットからコア0、コア1、コア2、コア3で、ビットが立っているとそのコアで割り込みを処理する設定になります。デフォルトは、すべてのコアで割り込みを処理する1111bの16進数であるfです。

コア2でのみ処理するには0100bの4を、コア2と3で処理するには1100bをechoコマンドで書き込みます。# cat smp_affinity_listを実行すれば、どのコアで割り込みを処理する設定か見やすく表示できます。

図

IRQ番号31のEthernetはコア3で、IRQ番号48のUSBはコア2で処理されるように設定して、それぞれのデバイスを動作させると/proc/interruptsは設定した通りに動作することが確認できます。

図

このSMP Affinityをうまく活用すると、例えば、ネットワークの処理をコア3に割り当て、その他の処理をコア0-2に割り当てることで、クリティカルなネットワークの処理に十分なリソースを割り当てるというようなことも可能で、これまでLinuxの導入に踏み切れなかった機器への導入もしやすくなると思います。

ぜひ様々なユースケースで評価してみてください!

前の記事を読む