3.8. NUMA 対応スケジューリングのための SR-IOV ネットワークトポロジーの除外
SR-IOV ネットワークリソースの Non-Uniform Memory Access (NUMA) ノードを Topology Manager にアドバタイズする場合を除外するには、SriovNetworkNodePolicy カスタムリソースで excludeTopology 仕様を設定できます。NUMA 対応 Pod のスケジューリングでより柔軟な SR-IOV ネットワークデプロイメントを行うには、この設定を使用します。
前提条件
-
OpenShift CLI (
oc) がインストールされている。 -
CPU マネージャーのポリシーを
staticに設定している。CPU マネージャーの詳細は、関連情報 セクションを参照してください。 -
Topology Manager ポリシーを
single-numa-nodeに設定している。 - SR-IOV Network Operator がインストールされている。
手順
SriovNetworkNodePolicyCR を作成します。次の YAML を
sriov-network-node-policy.yamlファイルに保存し、環境に合わせて YAML 内の値を置き換えます。apiVersion: sriovnetwork.openshift.io/v1 kind: SriovNetworkNodePolicy metadata: name: <policy_name> namespace: openshift-sriov-network-operator spec: resourceName: sriovnuma01 nodeSelector: kubernetes.io/hostname: <node_name> numVfs: <number_of_Vfs> nicSelector:2 vendor: "<vendor_ID>" deviceID: "<device_ID>" deviceType: netdevice excludeTopology: true3 - 1 1
- SR-IOV ネットワークデバイスプラグインのリソース名。この YAML は、サンプルの
resourceName値を使用します。 - 2
- ネットワークインターフェイスコントローラー (NIC セレクター) を使用して、Operator が設定するデバイスを識別します。
- 3
- SR-IOV ネットワークリソースの NUMA ノードを Topology Manager にアドバタイスする場合を除外するには、値を
trueに設定します。デフォルト値はfalseです。注記多数の
SriovNetworkNodePolicyリソースが同じ SR-IOV ネットワークリソースをターゲットとしている場合、SriovNetworkNodePolicyリソースはexcludeTopology仕様と値が同じである必要があります。そうでない場合、矛盾するポリシーは拒否されます。
次のコマンドを実行して、
SriovNetworkNodePolicyリソースを作成します。成功した出力には、SriovNetworkNodePolicyリソースの名前とcreatedステータスがリスト表示されます。$ oc create -f sriov-network-node-policy.yaml
SriovNetworkCR を作成します。次の YAML を
sriov-network.yamlファイルに保存します。その場合、YAML 内の値は環境に合わせて置き換えます。apiVersion: sriovnetwork.openshift.io/v1 kind: SriovNetwork metadata: name: sriov-numa-0-network1 namespace: openshift-sriov-network-operator spec: resourceName: sriovnuma02 networkNamespace: <namespace>3 ipam: |-4 { "type": "<ipam_type>", }次のコマンドを実行して、
SriovNetworkリソースを作成します。成功した出力には、SriovNetworkリソースの名前とcreatedステータスがリスト表示されます。$ oc create -f sriov-network.yaml
Pod を作成し、前の手順で作成した SR-IOV ネットワークリソースを割り当てます。
次の YAML を
sriov-network-pod.yamlファイルに保存します。その場合、YAML 内の値は環境に合わせて置き換えます。apiVersion: v1 kind: Pod metadata: name: <pod_name> annotations: k8s.v1.cni.cncf.io/networks: |- [ { "name": "sriov-numa-0-network",1 } ] spec: containers: - name: <container_name> image: <image> imagePullPolicy: IfNotPresent command: ["sleep", "infinity"]- 1
- これは、
SriovNetworkNodePolicyリソースを使用するSriovNetworkリソースの名前です。
次のコマンドを実行して、
Podリソースを作成します。予想される出力には、Podリソースの名前とcreatedステータスが表示されます。$ oc create -f sriov-network-pod.yaml
検証
次のコマンドを実行して、Pod のステータスを確認します。その場合、
<pod_name>は Pod の名前に置き換えます。$ oc get pod <pod_name>出力例
NAME READY STATUS RESTARTS AGE test-deployment-sriov-76cbbf4756-k9v72 1/1 Running 0 45hターゲット Pod とのデバッグセッションを開き、SR-IOV ネットワークリソースがメモリーおよび CPU リソースとは異なるノードにデプロイされていることを確認します。
次のコマンドを実行して、Pod とのデバッグセッションを開きます。その場合、<pod_name> はターゲット Pod の名前に置き換えます。
$ oc debug pod/<pod_name>/hostをデバッグシェル内の root ディレクトリーとして設定します。デバッグ Pod は、Pod 内の/hostにホストからのルートファイルシステムをマウントします。ルートディレクトリーを/hostに変更すると、ホストファイルシステムからのバイナリーを実行できます。$ chroot /host次のコマンドを実行して、CPU 割り当てに関する情報を表示します。
$ lscpu | grep NUMA出力例
NUMA node(s): 2 NUMA node0 CPU(s): 0,2,4,6,8,10,12,14,16,18,... NUMA node1 CPU(s): 1,3,5,7,9,11,13,15,17,19,...$ cat /proc/self/status | grep Cpus出力例
Cpus_allowed: ffff Cpus_allowed_list: 1,3,5,7出力には、
NUMA node1などのNUMAノードに割り当てられる CPU (1、3、5、および 7) が表示されるはずです。SR-IOV ネットワークリソースは、NUMA node0などの別のNUMAノードの NIC を使用できます。ffffの 16 進値は、プロセスを実行する CPU コアを表すことに注意してください。$ cat /sys/class/net/net1/device/numa_node出力には、
0などのNUMAノードの番号が表示されるはずです。注記excludeTopology仕様をTrueに設定すると、必要なリソースが同じ NUMA ノード内に存在する可能性があります。