3.13. tuned-profiles-realtime を使用した CPU の分離
アプリケーションスレッドに可能な限り長い実行時間を割り当てるには、CPU を分離します。つまり、CPU からできるだけ多くの余分なタスクを削除することになります。通常、CPU の分離には、以下が関係します。
- ユーザー空間スレッドをすべて削除
- バインドされていないカーネルスレッドの削除 (バインドされたカーネルスレッドは特定の CPU に関連付けられ、移動できない)
- システム内の各割り込み要求(IRQ)番号 N の
/proc/irq/N/smp_affinity
プロパティーを変更して割り込みを削除します。
本セクションでは、tuned-profiles-realtime パッケージの
isolated_cores=cpulist
設定オプションを使用して、これらの操作を自動化する方法を説明します。
分離する CPU の選択
分離する CPU を選択するには、システムの CPU トポロジーを慎重に検討する必要があります。ユースケースによっては、異なる設定が必要になる場合があります。
- スレッドがキャッシュを共有して相互に通信する必要があるマルチスレッドアプリケーションがある場合、同じ NUMA ノードまたは物理ソケットでスレッドを保持する必要がある場合があります。
- 関連のない複数の real-time アプリケーションを実行すると、NUMA ノードまたはソケットごとに CPU を分離することができます。
hwloc パッケージは、
lstopo-no-graphics
や numactl
を含む CPU に関する情報を取得するのに役立つコマンドを提供します。
- 物理パッケージで利用可能な CPU のレイアウトを表示するには、以下の
lstopo-no-graphics --no-io --no-legend --of txt
コマンドを使用します。図3.1
lstopo-no-graphics
を使用した CPU のレイアウトの表示上記のコマンドは、利用可能なコアとソケットの数と NUMA ノードの論理距離を表示するため、マルチスレッドアプリケーションに役立ちます。また、この hwloc-gui パッケージは、グラフィカル出力を生成するlstopo
コマンドを提供します。 - ノード間の距離など、CPU の詳細は、以下の
numactl --hardware
コマンドを使用します。~]#
numactl --hardware
available: 2 nodes (0-1) node 0 cpus: 0 1 2 3 node 0 size: 16159 MB node 0 free: 6323 MB node 1 cpus: 4 5 6 7 node 1 size: 16384 MB node 1 free: 10289 MB node distances: node 0 1 0: 10 21 1: 21 10
hwloc パッケージが提供するユーティリティーの詳細は、
hwloc(7)
のman ページを参照してください。
tuned の isolated_cores
オプションを使用した CPU の分離
CPU を分離する最初のメカニズムは、カーネルブートコマンドライン
isolcpus=cpulist
で boot パラメーターを指定することです。RedHat EnterpriseLinux for Real Time に推奨される方法は、tuned
デーモンとその tuned-profiles-realtime パッケージを使用することです。
isolcpus
ブートパラメーターを指定するには、以下の手順に従います。
- tuned パッケージと tuned-profiles-realtime パッケージをインストールします。
~]#
yum install tuned tuned-profiles-realtime
- ファイル
/etc/tuned/realtime-variables.conf
で、isolated_cores=cpulist
の設定オプションを設定します。ここで、cpulist は分離する CPU の一覧になります。この一覧はコンマで区切られ、CPU 番号または範囲を 1 つ含めることができます。以下に例を示します。isolated_cores=0-3,5,7
上記の行では、CPU 0、1、1、2、3、5、および 7 を分離します。例3.3 通信スレッドでの CPU の分離
8 コアを持つ 2 つのソケットシステムでは、NUMA ノードのゼロにはコア 0-3 と NUMA ノード 1 のコア 4-8 があり、マルチスレッドアプリケーション用に 2 つのコアを割り当てる場合は、以下の行を追加します。isolated_cores=4,5
tuned-profiles-realtime
プロファイルを有効にすると、isolcpus=4,5
パラメーターがブートコマンドラインに追加されます。これにより、ユーザー空間スレッドが CPU 4 および 5 に割り当てられなくなります。例3.4 通信していないスレッドでの CPU の分離
関係のないアプリケーションの別の NUMA ノードから CPU を選択する場合は、以下を指定できます。isolated_cores=0,4
これにより、ユーザー空間スレッドが CPU 0 および 4 に割り当てられるのを防ぎます。 tuned-adm
ユーティリティーを使用してtuned
プロファイルをアクティベートしてから再起動します。~]# tuned-adm profile realtime ~]# reboot
- リブート時に、ブートコマンドラインで
isolcpus
パラメーターを検索して、選択した CPU が分離されていることを確認します。~]$
cat /proc/cmdline | grep isolcpus
BOOT_IMAGE=/vmlinuz-3.10.0-394.rt56.276.el7.x86_64 root=/dev/mapper/rhel_foo-root ro crashkernel=auto rd.lvm.lv=rhel_foo/root rd.lvm.lv=rhel_foo/swap console=ttyS0,115200n81 isolcpus=0,4
nohz
および nohz_full
パラメーターを使用した CPU の分離
カーネルブートパラメーター
nohz
および nohz_full
カーネルブートパラメーターを有効にするには、realtime-virtual-host
、realtime-virtual-guest
または cpu-partitioning
のいずれかのプロファイルを使用する必要があります。
- nohz=on
- 特定の CPU セットのタイマーアクティビティーを減らすために使用できます。この
nohz
パラメーターは、主にアイドル状態の CPU におけるタイマー割り込みを減らすために使用されます。これにより、アイドル状態の CPU を低電力モードで実行させることにより、バッテリーのライフサイクルが容易になります。リアルタイムの応答時間には直接有効ではありませんが、nohz
パラメーターは直接リアルタイムの応答時間を下回るのではなく、リアルタイムパフォーマンスに悪影響を及ぼす次のパラメーターをアクティブにする必要があります。 - nohz_full=cpulist
- この
nohz_full
パラメーターは、タイマーティックに関して CPU の一覧を異なる方法で処理するために使用されます。CPU が nohz_full CPU として一覧表示され、CPU に実行可能なタスクが 1 つしかない場合、カーネルはその CPU へのタイマーティックの送信を停止するため、アプリケーションの実行に費やす時間が少なくなり、割り込みとコンテキストの切り替えに費やされた時間が短縮されます。
これらのパラメーターの詳細は、Configuring kernel tick time を参照してください。