9.3. コンテナー配置による CPU パフォーマンスの最適化
リアルタイムプロファイルを使用してホストをチューニングした後、コンテナーを選択的に特定の CPU に配置してコンテナーランタイムの動作を調整することで、パフォーマンスをさらに最適化できます。これらの戦略により、CPU の分離および cgroup 設定がコンテナー化されたワークロードのレイテンシーにどのように影響するかを調べることができます。
9.3.1. すべての CPU での podman の実行 リンクのコピーリンクがクリップボードにコピーされました!
rteval コンテナーで podman を実行するには、チューニングされたリアルタイムプロファイルまたはカスタムシステムチューニングを使用して、システムを調整します。測定するシナリオに CPU 分離が必要かどうかを判別します。特定のシナリオでコンテナーを実行する際にの問題を回避するために、CPU 分離を正しく設定してください。
/proc/cmdline で isolcpus= 引数を確認します。isolcpus が設定されていない場合、システムは CPU を分離せず、すべての CPU でコンテナーを実行できます。
前提条件
-
/proc/cmdlineのisolcpus=引数は、すべての CPU でコンテナーを実行するように設定されていません。 - ホストマシンが Red Hat Enterprise Linux バージョン 9.6 以降で実行されている。
-
podmanサービスが実行している。 -
rtevalコンテナーがインストールされ、実行中である。
手順
podmanレジストリーにログインします。$ podman login registry.redhat.iortevalコンテナーを実行します。次のいずれかの方法を選択して、コンテナーを実行します。単一の NUMA ノードボックス上のすべての CPU で、以下を実行します。
$ podman run -it --rm --privileged --pids-limit=0 registry.redhat.io/rhel10/rteval \ /bin/bash -c 'rteval --duration 2h’マルチ NUMA ノードマシンで以下を行います。
$ podman run -it --rm --privileged --pids-limit=0 registry.redhat.io/rhel10/rteval \ /bin/bash -c 'rteval --duration 2h --loads-cpulist 0,1 --measurement-cpulist 2-47--pids-limit=0kcompileは、コンテナーランタイムのデフォルト制限に到達せずに実行できます。kcompileは、カーネル全体を再ビルドすることなく、現在実行中のカーネルのカーネルモジュールをコンパイルするために使用されるコマンドラインユーティリティーです。--privileged-
コンテナーは、ホストシステム上のすべてのデバイスにアクセスできます。これは、
rtevalが正常に実行されるために必要です。
これらのコマンドは、利用可能なすべてのノードで単一のコンテナーを実行します。tuned サービスはホストのチューニングを管理するため、CPU を 1 つだけ使用する場合にベアメタルのパフォーマンスを評価できます。
検証
新しいターミナルで、
rtevalコンテナーを含むすべてのコンテナーを一覧表示し、正しく実行されていることを確認します。$ podman ps -a
9.3.2. 分割された CPU 割り当てによる podman の実行 リンクのコピーリンクがクリップボードにコピーされました!
負荷の分離や測定をテストするために、異なるコンテナーを異なる CPU セットに割り当てることができます。たとえば、1 つの NUMA ノードのみが存在し、負荷と測定をコンテナーに分割したい場合などに、2 つの異なるコンテナーを実行できます。この場合、両方のコンテナーがすべての CPU で実行され、チューニングにはパーティションは使用されません。
コマンドの例:
コンテナーを読み込み ます。
$ podman run -it --rm --privileged --pids-limit=0 registry.redhat.io/rhel10/rteval \ /bin/bash -c 'rteval --duration 2h --onlyload'コンテナーを測定 します。
$ podman run -it --rm --privileged --pids-limit=0 registry.redhat.io/rhel10/rteval \ /bin/bash -c 'rteval --duration 2h --onlymeasure'
複数の NUMA ノードを持つボックスまたは手動でパーティショニングされたマシンを持つパーティショニングを使用するシナリオでは、コマンド例は次のとおりです。
コンテナーを読み込み ます。
$ podman run -it --rm --privileged --pids-limit=0 --cpuset-cpus 0,1 registry.redhat.io/rhel10/rteval \ /bin/bash -c 'rteval --duration 2h --onlyload --loads-cpulist 0,1'コンテナーを測定 します。
$ podman run -it --rm --privileged --pids-limit=0 --cpuset-cpus 2-47 registry.redhat.io/rhel10/rteval \ /bin/bash -c 'rteval --duration 2h --noload --measurement-cpulist 2-47'
これらのコマンドを実行すると、負荷コンテナーはハウスキーピングコアの負荷を生成し、測定コンテナーは isol_cpu セットで動作します。
パーティショニングが設定されていない場合、あるコンテナーがシステム上のすべての CPU 間で負荷を生成し、別のノードでのレイテンシーを測定します。
どちらのシナリオでも、負荷と測定は 2 つのコンテナー間で正常に分離されます。
9.3.3. リアルタイムプロファイルでの NUMA ごとのハウスキーピングの調整 リンクのコピーリンクがクリップボードにコピーされました!
リアルタイムプロファイルで、NUMA ノードごとにハウスキーピング CPU セットを調整できます。これにより、ハウスキーピングタスクが NUMA ノード全体に均等に分散されるようにすることで、システムのパフォーマンスを最適化します。
これは、競合の削減および全体的なパフォーマンスを向上させるのに役立つため、複数の NUMA ノードを持つシステムに特に役立ちます。
デフォルトのリアルタイム tuned プロファイルは、NUMA ノードごとに 1 つのハウスキーピング CPU を確保します(hk_per_numa=1)。コンテナーワークロードにより多くの CPU が必要な場合は、この動作を変更できます。
前提条件
- ホストマシンが Red Hat Enterprise Linux バージョン 9.6 以降で実行されている。
-
tunedサービスを実行している。 -
rtevalコンテナーがインストールされ、実行中である。 -
podmanサービスが実行している。 -
tuned-profiles-realtimeパッケージがインストールされている。
手順
realtime-variables.confファイルを変更して、NUMA ノードごとにハウスキーピング CPU セットを調整します。テキストエディターで
/etc/tunedにあるrealtime-variables.confファイルを開きます。$ sudo vi /etc/tuned/realtime-variables.confisolated_cores変数を見つけます。デフォルトでは、これは1に設定されています。つまり、NUMA ノードごとに 1 つのコアが分離またはハウスキーピング以外の使用用に予約されます。この値を大きくすることができますが、NUMA ノードあたりの CPU の総数より小さくなければなりません。以下の例では、NUMA ノードごとに 24 コアを持つシステムで、
isolated_coresを3に設定します。isolated_cores=${f:calc_isolated_cores:3}
- 変更を保存してファイルを閉じます。
tunedリアルタイムプロファイルを再適用します。$ sudo tuned-adm profile realtime
これにより、テスト中に合計 6 つの CPU (NUMA ノードあたり 3)が負荷を生成し、システムは残りのコアを isolcpus セット用に予約します。この設定は測定に使用されます。場合によっては、優先度の設定が混在すると、isolcpus セットではなく、カスタムトポロジーにコンテナーがデプロイされる可能性があります。
または、ノードごとの自動数に依存する代わりに、カスタム CPU 範囲を手動で指定することもできます。これにより、分離されたコアを完全に制御できるようになり、不均一のトポロジーまたは特殊な CPU レイアウトを使用するシステムを微調整しやすくなります。
検証
-
realtime-variables.confファイルの変更を確認します。 - システムを再起動して変更を適用します。
/proc/cmdlineファイルを表示して、isolcpus設定を確認します。$ cat /proc/cmdline BOOT_IMAGE=(hd0,gpt2)/vmlinuz-5.XX.X-XX.X.X.el9_6.x86_64+rt root=/dev/mapper/rhel_rt--qe--11-root ro crashkernel=1G-4G:192M,4G-64G:256M,64G-:512M resume=UUID=00cbf36d-ffaa-4285-a381-5c1d868eb3e3 rd.lvm.lv=rhel_rt-qe-11/root rd.lvm.lv=rhel_rt-qe-11/swap console=ttyS0,115200n81 skew_tick=1 tsc=reliable rcupdate.rcu_normal_after_boot=1 isolcpus=managed_irq,domain,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47 intel_pstate=disable nosoftlockup
9.3.4. 分離された CPU 間で複数のコンテナーの分散 リンクのコピーリンクがクリップボードにコピーされました!
分離された CPU 全体で複数のコンテナーを実行するには、the-- cpuset-cpus オプションを使用して各コンテナーが使用する CPU を指定します。これにより、負荷が複数の分離された CPU に分割され、パフォーマンスが向上し、競合が軽減されます。
isolcpus セットを複数のコンテナーに分けて、以下のタスクをシミュレートできます。
- 同時レイテンシーの影響を受けやすいタスク。
- パーティションが分割されたシステムに複数ロードします。
9.3.4.1. 同時レイテンシーの影響を受けやすいタスクのシミュレーション リンクのコピーリンクがクリップボードにコピーされました!
レイテンシーの影響を受けやすいタスクをシミュレートするには、特定の分離された CPU を各コンテナーに割り当てることができます。以下の例は、異なる CPU セット間でコンテナーを設定して実行する方法を示しています。
1 つのコンテナーを CPU 0 - 6 上で、もう 1 つは CPU 7 - 28 で、3 番目のコンテナーを CPU 29-47 で実行します。以下のコマンドを使用します。
$ podman run -it --rm --privileged --pids-limit=0 --cpuset-cpus 0-6 registry.redhat.io/rhel10/rteval \
/bin/bash -c 'rteval --duration 2h --onlyload --loads-cpulist 0-6'
$ podman run -it --rm --privileged --pids-limit=0 --cpuset-cpus 7-28 registry.redhat.io/rhel10/rteval \
/bin/bash -c 'rteval --duration 2h --onlyload --loads-cpulist 7-28'
$ podman run -it --rm --privileged --pids-limit=0 --cpuset-cpus 29-47 registry.redhat.io/rhel10/rteval \
/bin/bash -c 'rteval --duration 2h --onlyload --loads-cpulist 29-47'
9.3.4.2. パーティション化されたシステム全体で複数の負荷のシミュレーション リンクのコピーリンクがクリップボードにコピーされました!
分離されていない CPU セットで rteval ロードジェネレーターを開始します。次に、isolcpus セットの一部で高速データベースコンテナーなどの高スループットのアプリケーションをシミュレートします。この例では、高速データベースコンテナーを表す CPU 7-28 が使用されます。別のターミナルセッションで以下のコマンドを実行して、読み込みを開始します。
$ podman run -it --rm --privileged --pids-limit=0 --cpuset-cpus 0-6 registry.redhat.io/rhel10/rteval \
/bin/bash -c 'rteval --duration 2h --onlyload --loads-cpulist 0-6'
次に、別のターミナルで、分離された CPU のサブセットの一部に負荷を生成します。
$ podman run -it --rm --privileged --pids-limit=0 --cpuset-cpus 20-30 registry.redhat.io/rhel10/rteval \
/bin/bash -c 'rteval --duration 2h --onlyload --loads-cpulist 20-30'
ここで、残りの CPU で測定スレッドを実行するには、2 つのオプションがあります。分離された CPU の残りの 2 つのサブセットをデプロイするか、残りの CPU サブセットの両方を使用する単一の測定コンテナーを実行できます。
オプション 1: 2 つの測定コンテナーをデプロイします。
$ podman run -it --rm --privileged --pids-limit=0 --cpuset-cpus 7-19 registry.redhat.io/rhel10/rteval \ /bin/bash -c 'rteval --duration 2h --noload --measurement-cpulist 7-19'$ podman run -it --rm --privileged --pids-limit=0 --cpuset-cpus 31-47 registry.redhat.io/rhel10/rteval \ /bin/bash -c 'rteval --duration 2h --noload --measurement-cpulist 31-47'オプション 2: 単一の測定コンテナーをデプロイします。
$ podman run -it --rm --privileged --pids-limit=0 --cpuset-cpus 7-19,31-47 registry.redhat.io/rhel10/rteval \ /bin/bash -c 'rteval --duration 2h --noload --measurement-cpulist 7-19,31-47'