9.4. NUMA 対応ワークロードのスケジューリング
通常、遅延の影響を受けやすいワークロードを実行するクラスターは、ワークロードの遅延を最小限に抑え、パフォーマンスを最適化するのに役立つパフォーマンスプロファイルを備えています。NUMA 対応スケジューラーは、使用可能なノードの NUMA リソースと、ノードに適用されるパフォーマンスプロファイル設定に基づいき、ワークロードをデプロイします。NUMA 対応デプロイメントとワークロードのパフォーマンスプロファイルを組み合わせることで、パフォーマンスを最大化するようにワークロードがスケジュールされます。
NUMA Resources Operator を完全に動作させるには、NUMAResourcesOperator
カスタムリソースと NUMA 対応のセカンダリー Pod スケジューラーをデプロイする必要があります。
9.4.1. NUMAResourcesOperator カスタムリソースの作成
NUMA Resources Operator をインストールしたら、NUMAResourcesOperator
カスタムリソース (CR) を作成します。この CR は、デーモンセットや API など、NUMA 対応スケジューラーをサポートするために必要なすべてのクラスターインフラストラクチャーをインストールするように NUMA Resources Operator に指示します。
前提条件
-
OpenShift CLI (
oc
) がインストールされている。 -
cluster-admin
権限を持つユーザーとしてログインしている。 - NUMA Resources Operator をインストールしている。
手順
NUMAResourcesOperator
カスタムリソースを作成します。次の最小限必要な YAML ファイルの例を
nrop.yaml
として保存します。apiVersion: nodetopology.openshift.io/v1 kind: NUMAResourcesOperator metadata: name: numaresourcesoperator spec: nodeGroups: - machineConfigPoolSelector: matchLabels: pools.operator.machineconfiguration.openshift.io/worker: "" 1
- 1
- これは、NUMA Resources Operator を設定する
MachineConfigPool
リソースと一致する必要があります。たとえば、通信ワークロードを実行することが予想されるノードのセットを指定するworker-cnf
という名前のMachineConfigPool
リソースを作成したとします。各NodeGroup
は 1 つのMachineConfigPool
に完全に一致する必要があります。NodeGroup
が複数のMachineConfigPool
に一致する設定はサポートされていません。
以下のコマンドを実行して、
NUMAResourcesOperator
CR を作成します。$ oc create -f nrop.yaml
注記NUMAResourcesOperator
を作成すると、対応するマシン設定プールと、関連するノードの再起動がトリガーされます。
オプション: 複数のマシン設定プール (MCP) に対して NUMA 対応スケジューリングを有効にするには、プールごとに個別の
NodeGroup
を定義します。たとえば、次の例に示すように、NUMAResourcesOperator
CR で、worker-cnf
、worker-ht
、およびworker-other
の 3 つのNodeGroup
を定義します。複数の
NodeGroups
を含むNUMAResourcesOperator
CR の YAML 定義の例apiVersion: nodetopology.openshift.io/v1 kind: NUMAResourcesOperator metadata: name: numaresourcesoperator spec: logLevel: Normal nodeGroups: - machineConfigPoolSelector: matchLabels: machineconfiguration.openshift.io/role: worker-ht - machineConfigPoolSelector: matchLabels: machineconfiguration.openshift.io/role: worker-cnf - machineConfigPoolSelector: matchLabels: machineconfiguration.openshift.io/role: worker-other
検証
以下のコマンドを実行して、NUMA Resources Operator が正常にデプロイされたことを確認します。
$ oc get numaresourcesoperators.nodetopology.openshift.io
出力例
NAME AGE numaresourcesoperator 27s
数分後、次のコマンドを実行して、必要なリソースが正常にデプロイされたことを確認します。
$ oc get all -n openshift-numaresources
出力例
NAME READY STATUS RESTARTS AGE pod/numaresources-controller-manager-7d9d84c58d-qk2mr 1/1 Running 0 12m pod/numaresourcesoperator-worker-7d96r 2/2 Running 0 97s pod/numaresourcesoperator-worker-crsht 2/2 Running 0 97s pod/numaresourcesoperator-worker-jp9mw 2/2 Running 0 97s
9.4.2. NUMA 対応のセカンダリー Pod スケジューラーのデプロイ
NUMA Resources Operator のインストール後に、NUMA 対応のセカンダリー Pod スケジューラーをデプロイして Pod の配置を最適化し、NUMA ベースのシステムのパフォーマンスを向上させ、レイテンシーを短縮します。
手順
NUMA 対応のカスタム Pod スケジューラーをデプロイする
NUMAResourcesScheduler
カスタムリソースを作成します。次の最小限必要な YAML を
nro-scheduler.yaml
ファイルに保存します。apiVersion: nodetopology.openshift.io/v1 kind: NUMAResourcesScheduler metadata: name: numaresourcesscheduler spec: imageSpec: "registry.redhat.io/openshift4/noderesourcetopology-scheduler-rhel9:v4.16" 1
- 1
- 非接続環境では、次のいずれかのアクションを実行してこのイメージの解決を設定してください。
-
ImageTagMirrorSet
カスタムリソース (CR) を作成する。詳細は、「関連情報」セクションの「イメージレジストリーのリポジトリーミラーリングの設定」を参照してください。 - 切断されたレジストリーへの URL を設定する。
-
次のコマンドを実行して、
NUMAResourcesScheduler
CR を作成します。$ oc create -f nro-scheduler.yaml
数秒後、次のコマンドを実行して、必要なリソースのデプロイメントが成功したことを確認します。
$ oc get all -n openshift-numaresources
出力例
NAME READY STATUS RESTARTS AGE pod/numaresources-controller-manager-7d9d84c58d-qk2mr 1/1 Running 0 12m pod/numaresourcesoperator-worker-7d96r 2/2 Running 0 97s pod/numaresourcesoperator-worker-crsht 2/2 Running 0 97s pod/numaresourcesoperator-worker-jp9mw 2/2 Running 0 97s pod/secondary-scheduler-847cb74f84-9whlm 1/1 Running 0 10m NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE daemonset.apps/numaresourcesoperator-worker 3 3 3 3 3 node-role.kubernetes.io/worker= 98s NAME READY UP-TO-DATE AVAILABLE AGE deployment.apps/numaresources-controller-manager 1/1 1 1 12m deployment.apps/secondary-scheduler 1/1 1 1 10m NAME DESIRED CURRENT READY AGE replicaset.apps/numaresources-controller-manager-7d9d84c58d 1 1 1 12m replicaset.apps/secondary-scheduler-847cb74f84 1 1 1 10m
9.4.3. 単一の NUMA ノードポリシーの設定
NUMA Resources Operator では、クラスター上に単一の NUMA ノードポリシーを設定する必要があります。この設定を行うには、パフォーマンスプロファイルを作成して適用するか、KubeletConfig を設定するという 2 つの方法があります。
単一の NUMA ノードポリシーの設定方法としては、パフォーマンスプロファイルを適用する方法が推奨されます。パフォーマンスプロファイルの作成には、Performance Profile Creator (PPC) ツールを使用できます。クラスター上にパフォーマンスプロファイルを作成すると、KubeletConfig
や tuned
プロファイルなどの他のチューニングコンポーネントが自動的に作成されます。
パフォーマンスプロファイルの作成の詳細は、「関連情報」セクションの「Performance Profile Creator の概要」を参照してください。
9.4.4. パフォーマンスプロファイルの例
この YAML の例は、Performance Profile Creator (PPC) ツールを使用して作成されたパフォーマンスプロファイルを示しています。
apiVersion: performance.openshift.io/v2 kind: PerformanceProfile metadata: name: performance spec: cpu: isolated: "3" reserved: 0-2 machineConfigPoolSelector: pools.operator.machineconfiguration.openshift.io/worker: "" 1 nodeSelector: node-role.kubernetes.io/worker: "" numa: topologyPolicy: single-numa-node 2 realTimeKernel: enabled: true workloadHints: highPowerConsumption: true perPodPowerManagement: false realTime: true
9.4.5. KubeletConfig CR の作成
単一の NUMA ノードポリシーの設定方法としては、パフォーマンスプロファイルを適用する方法が推奨されます。もう 1 つの方法は、次の手順に示すように、KubeletConfig
カスタムリソース (CR) を作成して適用することです。
手順
マシンプロファイルの Pod アドミタンスポリシーを設定する
KubeletConfig
カスタムリソース (CR) を作成します。以下の YAML を
nro-kubeletconfig.yaml
ファイルに保存します。apiVersion: machineconfiguration.openshift.io/v1 kind: KubeletConfig metadata: name: worker-tuning spec: machineConfigPoolSelector: matchLabels: pools.operator.machineconfiguration.openshift.io/worker: "" 1 kubeletConfig: cpuManagerPolicy: "static" 2 cpuManagerReconcilePeriod: "5s" reservedSystemCPUs: "0,1" 3 memoryManagerPolicy: "Static" 4 evictionHard: memory.available: "100Mi" kubeReserved: memory: "512Mi" reservedMemory: - numaNode: 0 limits: memory: "1124Mi" systemReserved: memory: "512Mi" topologyManagerPolicy: "single-numa-node" 5
以下のコマンドを実行して
KubeletConfig
CR を作成します。$ oc create -f nro-kubeletconfig.yaml
注記パフォーマンスプロファイルまたは
KubeletConfig
を適用すると、ノードの再起動が自動的にトリガーされます。再起動がトリガーされない場合は、ノードグループに対応するKubeletConfig
のラベルを確認して、問題のトラブルシューティングを実施できます。
9.4.6. NUMA 対応スケジューラーを使用したワークロードのスケジューリング
topo-aware-scheduler
をインストールし、NUMAResourcesOperator
および NUMAResourcesScheduler
CR を適用し、クラスターが一致するパフォーマンスプロファイルまたは kubeletconfig
を含むようになったので、ワークロードを処理する必要最小限のリソースを指定するデプロイメント CR を使用して、NUMA 対応スケジューラーでワークロードをスケジュールできます。
次のデプロイメント例では、サンプルワークロードに NUMA 対応のスケジューリングを使用します。
前提条件
-
OpenShift CLI (
oc
) がインストールされている。 -
cluster-admin
権限を持つユーザーとしてログインしている。
手順
次のコマンドを実行して、クラスターにデプロイされている NUMA 対応スケジューラーの名前を取得します。
$ oc get numaresourcesschedulers.nodetopology.openshift.io numaresourcesscheduler -o json | jq '.status.schedulerName'
出力例
"topo-aware-scheduler"
topo-aware-scheduler
という名前のスケジューラーを使用するDeployment
CR を作成します。次に例を示します。以下の YAML を
nro-deployment.yaml
ファイルに保存します。apiVersion: apps/v1 kind: Deployment metadata: name: numa-deployment-1 namespace: openshift-numaresources spec: replicas: 1 selector: matchLabels: app: test template: metadata: labels: app: test spec: schedulerName: topo-aware-scheduler 1 containers: - name: ctnr image: quay.io/openshifttest/hello-openshift:openshift imagePullPolicy: IfNotPresent resources: limits: memory: "100Mi" cpu: "10" requests: memory: "100Mi" cpu: "10" - name: ctnr2 image: registry.access.redhat.com/rhel:latest imagePullPolicy: IfNotPresent command: ["/bin/sh", "-c"] args: [ "while true; do sleep 1h; done;" ] resources: limits: memory: "100Mi" cpu: "8" requests: memory: "100Mi" cpu: "8"
- 1
schedulerName
は、クラスターにデプロイされている NUMA 対応のスケジューラーの名前 (topo-aware-scheduler
など) と一致する必要があります。
次のコマンドを実行して、
Deployment
CR を作成します。$ oc create -f nro-deployment.yaml
検証
デプロイメントが正常に行われたことを確認します。
$ oc get pods -n openshift-numaresources
出力例
NAME READY STATUS RESTARTS AGE numa-deployment-1-6c4f5bdb84-wgn6g 2/2 Running 0 5m2s numaresources-controller-manager-7d9d84c58d-4v65j 1/1 Running 0 18m numaresourcesoperator-worker-7d96r 2/2 Running 4 43m numaresourcesoperator-worker-crsht 2/2 Running 2 43m numaresourcesoperator-worker-jp9mw 2/2 Running 2 43m secondary-scheduler-847cb74f84-fpncj 1/1 Running 0 18m
次のコマンドを実行して、
topo-aware-scheduler
がデプロイされた Pod をスケジュールしていることを確認します。$ oc describe pod numa-deployment-1-6c4f5bdb84-wgn6g -n openshift-numaresources
出力例
Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal Scheduled 4m45s topo-aware-scheduler Successfully assigned openshift-numaresources/numa-deployment-1-6c4f5bdb84-wgn6g to worker-1
注記スケジューリングに使用可能なリソースよりも多くのリソースを要求するデプロイメントは、
MinimumReplicasUnavailable
エラーで失敗します。必要なリソースが利用可能になると、デプロイメントは成功します。Pod は、必要なリソースが利用可能になるまでPending
状態のままになります。ノードに割り当てられる予定のリソースが一覧表示されていることを確認します。
次のコマンドを実行して、デプロイメント Pod を実行しているノードを特定します。
$ oc get pods -n openshift-numaresources -o wide
出力例
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES numa-deployment-1-6c4f5bdb84-wgn6g 0/2 Running 0 82m 10.128.2.50 worker-1 <none> <none>
次のコマンドを実行します。このとき、デプロイメント Pod を実行しているノードの名前を指定します。
$ oc describe noderesourcetopologies.topology.node.k8s.io worker-1
出力例
... Zones: Costs: Name: node-0 Value: 10 Name: node-1 Value: 21 Name: node-0 Resources: Allocatable: 39 Available: 21 1 Capacity: 40 Name: cpu Allocatable: 6442450944 Available: 6442450944 Capacity: 6442450944 Name: hugepages-1Gi Allocatable: 134217728 Available: 134217728 Capacity: 134217728 Name: hugepages-2Mi Allocatable: 262415904768 Available: 262206189568 Capacity: 270146007040 Name: memory Type: Node
- 1
- 保証された Pod に割り当てられたリソースが原因で、
Available
な容量が減少しています。
保証された Pod によって消費されるリソースは、
noderesourcetopologies.topology.node.k8s.io
にリスト表示されている使用可能なノードリソースから差し引かれます。
Best-effort
またはBurstable
のサービス品質 (qosClass
) を持つ Pod のリソース割り当てが、noderesourcetopologies.topology.node.k8s.io
の NUMA ノードリソースに反映されていません。Pod の消費リソースがノードリソースの計算に反映されない場合は、Pod のqosClass
がGuaranteed
で、CPU 要求が 10 進値ではなく整数値であることを確認してください。次のコマンドを実行すると、Pod のqosClass
がGuaranteed
であることを確認できます。$ oc get pod numa-deployment-1-6c4f5bdb84-wgn6g -n openshift-numaresources -o jsonpath="{ .status.qosClass }"
出力例
Guaranteed