第9章 RHEL for Real Time での CPU アフィニティーの設定

システム内のすべてのスレッドと割り込みソースには、プロセッサーアフィニティープロパティーがあります。オペレーティングシステムスケジューラーは、この情報を使用して、CPU で実行するスレッドと割り込みを決定します。プロセッサーアフィニティーを効果的なポリシーおよび優先度設定とともに設定することで、パフォーマンスを最大限に高めることができます。アプリケーションは、特に CPU 時間などのリソースに対して、他のプロセスと常に競合します。アプリケーションによっては、関連するスレッドが同じコアで実行されることがよくあります。1 つのアプリケーションスレッドを 1 つのコアに割り当てることができます。

マルチタスクを実行するシステムは、一般的に非決定論の傾向にあります。優先度の高いアプリケーションであっても、優先度の低いアプリケーションがコードの重要なセクションにある場合は、アプリケーションの実行が遅延する可能性があります。優先度の低いアプリケーションが重要なセクションを終了すると、カーネルは優先度の低いアプリケーションのプリエンプションを安全に実行し、プロセッサーで高い優先順位のアプリケーションをスケジュールします。また、キャッシュの無効化により、ある CPU から別の CPU への移行の負荷が'大きくなることがあります。RHEL for Real Time には、これらの問題の一部に対処し、レイテンシーをより適切に制御できるようにするツールが含まれています。

アフィニティーはビットマスクで表され、マスクの各ビットが CPU コアを表します。ビットが 1 に設定されている場合は、スレッドまたは割り込みがそのコアで実行されます。0 を指定すると、スレッドまたは割り込みがコア上の実行から除外されます。アフィニティービットマスクのデフォルト値はすべて 1 です。つまり、スレッドまたは割り込みがシステムの任意のコアで実行できます。

デフォルトでは、プロセスは任意の CPU で実行できます。ただし、プロセスのアフィニティーを変更することにより、所定の CPU セットで実行するプロセスを定義できます。子プロセスは、そのロールの CPU アフィニティーを継承します。

次の一般的なアフィニティー設定を設定すると、最大限のパフォーマンスを実現できます。

  • すべてのシステムプロセスに単一の CPU コアを使用し、残りのコアで実行するようにアプリケーションを設定する。
  • 同じ CPU 上でスレッドアプリケーションと特定のカーネルスレッド (ネットワーク softirq やドライバースレッドなど) を設定する。
  • 各 CPU でプロデューサーとコンシューマーのスレッドをペアリングする。プロデューサーとコンシューマーは 2 つのクラスのスレッドであり、プロデューサーはデータをバッファーに挿入し、コンシューマーはデータをバッファーから削除します。

リアルタイムシステムでアフィニティーを調整するための通常のグッドプラクティスは、アプリケーションの実行に必要なコアの数を決定してから、それらのコアを分離することです。これは、Tuna ツールまたはシェルスクリプトを使用して、taskset コマンドなどのビットマスク値を変更することで実現できます。taskset コマンドはプロセスのアフィニティーを変更し、/proc/ ファイルシステムエントリーを変更すると割り込みのアフィニティーが変更されます。

9.1. taskset コマンドを使用したプロセッサーアフィニティーの調整

リアルタイムでは、taskset コマンドは、実行中のプロセスの CPU アフィニティーを設定または取得するのに役立ちます。taskset コマンドは、-p オプションおよび -c オプションを取ります。-p オプションまたは --pid オプションは既存のプロセスを機能させ、新しいタスクを開始しません。-c または --cpu-list は、bitmask の代わりにプロセッサーの数値リストを指定します。リストには、コンマで区切られた複数の項目、およびプロセッサーの範囲を含めることができます。たとえば、0,5,7,9-11 です。

前提条件

  • システムの root 権限がある。

手順

  • 特定のプロセスのプロセスアフィニティーを確認するには、次の手順を実行します。

    # taskset -p -c 1000
       pid 1000’s current affinity list: 0,1

    このコマンドは、プロセスのアフィニティーを PID 1000 で出力します。プロセスは、CPU 0 または CPU 1 を使用するように設定されています。

    • (オプション) プロセスをバインドするように特定の CPU を設定するには、以下を実行します。

      # taskset -p -c 1 1000
      pid 1000’s current affinity list: 0,1
      pid 1000’s new affinity list: 1
    • (オプション) 複数の CPU アフィニティーを定義するには、以下を実行します。

      # taskset -p -c 0,1 1000
      pid 1000’s current affinity list: 1
      pid 1000’s new affinity list: 0,1
    • (オプション) 特定の CPU で優先度レベルとポリシーを設定するには、以下を実行します。

      # taskset -c 5 chrt -f 78 /bin/my-app

      さらに細かく設定するために、優先度とポリシーを指定することもできます。この例では、コマンドは SCHED_FIFO ポリシーと優先度値 78 を使用して CPU 5 で /bin/my-app アプリケーションを実行します。