第9章 RHEL for Real Time のアフィニティー
リアルタイムでは、システムの各スレッドおよび割り込みソースには、プロセッサーアフィニティープロパティーがあります。オペレーティングシステムスケジューラーは、この情報を使用して、どの CPU で、どのスレッドおと割り込みを実行するのかを決めます。
リアルタイムのアフィニティーは、ビットマスクで表され、マスクの各ビットが CPU コアを表します。ビットが 1 に設定されている場合は、スレッドまたは割り込みがそのコアで実行されます。0 を指定すると、スレッドまたは割り込みがコア上の実行から除外されます。アフィニティービットマスクのデフォルト値はすべて 1 です。つまり、スレッドまたは割り込みがシステムの任意のコアで実行できます。
デフォルトでは、プロセスは任意の CPU で実行できます。ただし、プロセスのアフィニティーを変更することで、プロセスが事前定義された CPU の選択で実行されるように指示できます。子プロセスは、親プロセスの CPU アフィニティーを継承します。
より一般的なアフィニティー設定には、以下が含まれます。
- すべてのシステムプロセス用に CPU コアを 1 つ予約し、残りのコアでアプリケーションを実行できるようにします。
-
同じ CPU でスレッドアプリケーションと指定のカーネルスレッド (ネットワーク
softirqやドライバースレッドなど) を許可します。 - 各 CPU のペアプロデューサーおよびコンシューマースレッド。
アフィニティーの設定は、期待される良い動作のために、プログラムと連動して設計する必要があります。
9.1. プロセッサーのアフィニティー リンクのコピーリンクがクリップボードにコピーされました!
リアルタイムでは、プロセスはデフォルトで任意の CPU で実行できます。ただし、プロセスのアフィニティーを変更することにより、事前に選択した CPU で実行するようにプロセスを設定できます。子プロセスは、親プロセスの CPU アフィニティーを継承します。
システム上でアフィニティーをチューニングするためのリアルタイムプラクティスは、アプリケーションの実行に必要なコア数を決定してから、それらのコアを分離することです。これは、Tuna ツール、またはビットマスク値を変更するシェルスクリプトを使用して実現できます。
この taskset コマンドは、プロセスのアフィニティーを変更するのに使用でき、/proc/ ファイルシステムエントリーを変更すると割り込みのアフィニティーが変更されます。-p オプションまたは --pid オプション、およびそのプロセスのプロセス識別子 (PID) を指定して taskset コマンドを使用すると、プロセスのアフィニティーをチェックします。
-c オプションまたは --cpu-list オプションは、ビットマスクとしてではなく、コアの数値リストを表示します。アフィニティーは、特定のプロセスをバインドする CPU の数を指定することで設定できます。たとえば、以前に CPU 0 または CPU 1 のいずれかを使用していたプロセスの場合は、CPU 1 でのみ実行できるようにアフィニティーを変更できます。taskset コマンドに加えて、sched_setaffinity() システムコールを使用してプロセッサーアフィニティーを設定することもできます。