第6章 アフィニティー
システムの各スレッドおよび割り込みソースには、プロセッサーアフィニティープロパティーがあります。オペレーティングシステムスケジューラーは、この情報を使用して、どの CPU で、どのスレッドおと割り込みを実行するのかを決めます。
プロセッサーアフィニティーを、有効なポリシーおよび優先度設定とともに設定すると、パフォーマンスを最大限に高めることができます。アプリケーションは、他のプロセスと、特に CPU 時間などのリソースに対して常に競合する必要があります。アプリケーションによっては、関連するスレッドが同じコアで実行されることがよくあります。1 つのアプリケーションスレッドを 1 つのコアに割り当てることができます。
マルチタスクを実行するシステムは、一般的に非決定論の傾向にあります。優先度の高いアプリケーションであっても、優先度の低いアプリケーションがコードの重要なセクションにある場合は、アプリケーションの実行が遅延する可能性があります。優先度の低いアプリケーションが重要なセクションを終了すると、カーネルは優先度の低いアプリケーションのプリエンプションを安全に実行し、プロセッサーで高い優先順位のアプリケーションをスケジュールする可能性があります。また、キャッシュの無効化により、ある CPU から別の CPU への移行の負荷が’大きくなることがあります。Red Hat Enterprise Linux for Real Time には、これらの問題の一部に対応し、レイテンシーをより適切に制御できるツールが含まれています。
アフィニティーは ビットマスク で表され、マスクの各ビットが CPU コアを表します。ビットが 1 に設定されている場合は、スレッドまたは割り込みがそのコアで実行されます。0 を指定すると、スレッドまたは割り込みがコア上の実行から除外されます。アフィニティービットマスクのデフォルト値はすべてです。つまり、スレッドまたは割り込みがシステムの任意のコアで実行できます。
デフォルトでは、プロセスは任意の CPU で実行できます。ただし、プロセスのアフィニティーを変更することで、プロセスが事前定義された CPU の選択で実行されるように指示できます。子プロセスは、その役割の CPU アフィニティーを継承します。
より一般的なアフィニティー設定には、以下が含まれます。
予想される動作と一致させるには、アフィニティーの設定をプログラムと併用することを推奨します。
- すべてのシステムプロセス用に CPU コアを 1 つ予約し、残りのコアでアプリケーションを実行できるようにします。
- 同じ CPU でスレッドアプリケーションと指定のカーネルスレッド (ネットワーク softirq やドライバースレッドなど) を許可します。
- 各 CPU のペアプロデューサーとコンシューマースレッド。
リアルタイムシステムでアフィニティーを調整する通常のプラクティスは、アプリケーションを実行するために必要なコア数を判断し、それらのコアを分離することです。これは、
Tuna
ツールを使用して実行することも、シェルスクリプトを使用してビットマスクの値を変更することもできます。この taskset
コマンドは、プロセスのアフィニティーを変更するのに使用できますが、/proc
ファイルシステムエントリーを変更すると割り込みのアフィニティーが変更されます。
注記
詳細情報や参照文書は、taskset(1) man ページが、このセクションの情報に関連しています。
6.1. taskset
コマンドを使用したプロセッサーアフィニティーの設定
taskset
コマンドは、特定のプロセスのアフィニティー情報を設定し、確認します。これらのタスクは、Tuna ツールを使用して実行することもできます。
-p
または --pid
オプションと、チェックするプロセスの PID を指定して taskset コマンドを使用します。-c
または --cpu-list
オプションは、情報をビットマスクではなく、コアの数値リストとして表示します。
以下のコマンドは、PID 1000 のプロセスのアフィニティーをチェックします。この場合、PID 1000 は CPU 0 または CPU 1 のいずれかの使用が許可されます。
~]# taskset -p -c 1000
pid 1000's current affinity list: 0,1
アフィニティーを設定するには、プロセスのバインド先の CPU の数を指定します。この例では、PID 1000 を CPU 0 または CPU 1 のいずれかで実行でき、アフィニティーは変更され、CPU 1 でのみ実行できるように変更されています。
~]# taskset -p -c 1 1000
pid 1000's current affinity list: 0,1
pid 1000's new affinity list: 1
複数の CPU アフィニティーを定義するには、コンマで区切って両方の CPU 番号を一覧表示します。
~]# taskset -p -c 0,1 1000
pid 1000's current affinity list: 1
pid 1000's new affinity list: 0,1
この
taskset
コマンドは、特定のアフィニティーで新規プロセスを開始するためにも使用できます。このコマンドは、CPU 4 で /bin/my-app
アプリケーションを実行します。
~]# taskset -c 4 /bin/my-app
さらに細かく設定するために、優先順位とポリシーも設定できます。このコマンドは、
SCHED_FIFO
ポリシーと 78 の優先度で、CPU 4 で /bin/my-app
アプリケーションを実行します。
~]# taskset -c 5 chrt -f 78 /bin/my-app