10.9. SR-IOV での DPDK の使用
Data Plane Development Kit (DPDK) は、高速パケット処理用のライブラリーとドライバーのセットを提供するものです。SR-IOV ハードウェアと DPDK ドライバーを使用することで、クラスターや仮想マシン (VM) を設定し、超低遅延のパケット処理ワークロードを実行できます。
10.9.1. DPDK ワークロード用のクラスター設定 リンクのコピーリンクがクリップボードにコピーされました!
ネットワークパフォーマンスを向上させるために、Data Plane Development Kit (DPDK) ワークロードを実行するように OpenShift Container Platform クラスターを設定できます。
前提条件
-
cluster-admin権限を持つユーザーとしてクラスターにアクセスできる。 -
OpenShift CLI (
oc) がインストールされている。 - SR-IOV Network Operator がインストールされている。
- Node Tuning Operator がインストールされている。
手順
- コンピュートノードトポロジーのマッピングを実行し、DPDK アプリケーション用に分離する Non-Uniform Memory Access (NUMA) CPU と、オペレーティングシステム (OS) 用に予約する NUMA CPU を決定します。
OpenShift Container Platform クラスターが高可用性のために個別のコントロールプレーンとコンピュートノードを使用する場合:
コンピュートノードのサブセットにカスタムロール (例:
worker-dpdk) のラベルを追加します。$ oc label node <node_name> node-role.kubernetes.io/worker-dpdk=""新しい
MachineConfigPoolマニフェストを作成します。spec.machineConfigSelectorオブジェクト内にworker-dpdkラベルを含めます。MachineConfigPoolマニフェストの例:apiVersion: machineconfiguration.openshift.io/v1 kind: MachineConfigPool metadata: name: worker-dpdk labels: machineconfiguration.openshift.io/role: worker-dpdk spec: machineConfigSelector: matchExpressions: - key: machineconfiguration.openshift.io/role operator: In values: - worker - worker-dpdk nodeSelector: matchLabels: node-role.kubernetes.io/worker-dpdk: ""
前の手順で作成したラベル付きノードとマシン設定プールに適用する
PerformanceProfileマニフェストを作成します。パフォーマンスプロファイルは、DPDK アプリケーション用に分離された CPU とハウスキーピング用に予約された CPU を指定します。PerformanceProfileマニフェストの例:apiVersion: performance.openshift.io/v2 kind: PerformanceProfile metadata: name: profile-1 spec: cpu: isolated: 4-39,44-79 reserved: 0-3,40-43 globallyDisableIrqLoadBalancing: true hugepages: defaultHugepagesSize: 1G pages: - count: 8 node: 0 size: 1G net: userLevelNetworking: true nodeSelector: node-role.kubernetes.io/worker-dpdk: "" numa: topologyPolicy: single-numa-node注記MachineConfigPoolマニフェストとPerformanceProfileマニフェストを適用すると、コンピュートノードが自動的に再起動します。PerformanceProfileオブジェクトのstatus.runtimeClassフィールドから、生成されたRuntimeClassリソースの名前を取得します。$ oc get performanceprofiles.performance.openshift.io profile-1 -o=jsonpath='{.status.runtimeClass}{"\n"}'HyperConvergedカスタムリソース (CR) を編集して、以前に取得したRuntimeClass名をvirt-launcherPod のデフォルトのコンテナーランタイムクラスとして設定します。$ oc patch hyperconverged kubevirt-hyperconverged -n openshift-cnv \ --type='json' -p='[{"op": "add", "path": "/spec/defaultRuntimeClass", "value":"<runtimeclass-name>"}]'注記HyperConvergedCR を編集すると、変更の適用後に作成されるすべての仮想マシンに影響するグローバル設定が変更されます。DPDK 対応コンピュートノードが同時マルチスレッド (SMT) を使用している場合は、
HyperConvergedCR を編集してAlignCPUsイネーブラーを有効にします。$ oc patch hyperconverged kubevirt-hyperconverged -n openshift-cnv \ --type='json' -p='[{"op": "replace", "path": "/spec/featureGates/alignCPUs", "value": true}]'注記AlignCPUsを有効にすると、OpenShift Virtualization は、エミュレーターのスレッド分離を使用する場合に CPU 総数を偶数パリティーにするために、追加で最大 2 つの専用 CPU を要求できるようになります。spec.deviceTypeフィールドをvfio-pciに設定して、SriovNetworkNodePolicyオブジェクトを作成します。SriovNetworkNodePolicyマニフェストの例:apiVersion: sriovnetwork.openshift.io/v1 kind: SriovNetworkNodePolicy metadata: name: policy-1 namespace: openshift-sriov-network-operator spec: resourceName: intel_nics_dpdk deviceType: vfio-pci mtu: 9000 numVfs: 4 priority: 99 nicSelector: vendor: "8086" deviceID: "1572" pfNames: - eno3 rootDevices: - "0000:19:00.2" nodeSelector: feature.node.kubernetes.io/network-sriov.capable: "true"