8.7. SR-IOV での DPDK の使用
Data Plane Development Kit (DPDK) は、高速パケット処理用のライブラリーとドライバーのセットを提供するものです。
SR-IOV ネットワーク上で DPDK ワークロードを実行するようにクラスターと仮想マシンを設定できます。
8.7.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=""
spec.machineConfigSelector
オブジェクトにworker-dpdk
ラベルを含む新しいMachineConfigPool
マニフェストを作成します。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-launcher
Pod のデフォルトのコンテナーランタイムクラスとして設定します。$ oc patch hyperconverged kubevirt-hyperconverged -n openshift-cnv \ --type='json' -p='[{"op": "add", "path": "/spec/defaultRuntimeClass", "value":"<runtimeclass-name>"}]'
注記HyperConverged
CR を編集すると、変更の適用後に作成されるすべての仮想マシンに影響するグローバル設定が変更されます。DPDK 対応コンピュートノードが同時マルチスレッド (SMT) を使用している場合は、
HyperConverged
CR を編集して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"
8.7.1.1. 高可用性クラスターのカスタムマシン設定プールを削除する
高可用性クラスター用に以前に作成したカスタムマシン設定プールを削除できます。
前提条件
-
cluster-admin
権限を持つユーザーとしてクラスターにアクセスできる。 -
OpenShift CLI (
oc
) がインストールされている。 -
コンピュートノードのサブセットにカスタムロールのラベルを付け、そのラベルを使用して
MachineConfigPool
マニフェストを作成することで、カスタムマシン設定プールを作成した。
手順
次のコマンドを実行して、コンピュートノードから
worker-dpdk
ラベルを削除します。$ oc label node <node_name> node-role.kubernetes.io/worker-dpdk-
次のコマンドを入力して、
worker-dpdk
ラベルを含むMachineConfigPool
マニフェストを削除します。$ oc delete mcp worker-dpdk
8.7.2. DPDK ワークロード用のプロジェクト設定
SR-IOV ハードウェアで DPDK ワークロードを実行するプロジェクトを設定できます。
前提条件
- DPDK ワークロードを実行するようにクラスターが設定されている。
手順
DPDK アプリケーションの namespace を作成します。
$ oc create ns dpdk-checkup-ns
SriovNetworkNodePolicy
オブジェクトを参照するSriovNetwork
オブジェクトを作成します。SriovNetwork
オブジェクトの作成時に、SR-IOV Network Operator はNetworkAttachmentDefinition
オブジェクトを自動的に作成します。SriovNetwork
マニフェストの例apiVersion: sriovnetwork.openshift.io/v1 kind: SriovNetwork metadata: name: dpdk-sriovnetwork namespace: openshift-sriov-network-operator spec: ipam: | { "type": "host-local", "subnet": "10.56.217.0/24", "rangeStart": "10.56.217.171", "rangeEnd": "10.56.217.181", "routes": [{ "dst": "0.0.0.0/0" }], "gateway": "10.56.217.1" } networkNamespace: dpdk-checkup-ns 1 resourceName: intel_nics_dpdk 2 spoofChk: "off" trust: "on" vlan: 1019
- オプション: 仮想マシンレイテンシーチェックアップを実行して、ネットワークが適切に設定されていることを確認します。
- オプション: DPDK チェックアップを実行して、namespace が DPDK ワークロード用に準備できているか確認します。
8.7.3. DPDK ワークロード用の仮想マシン設定
仮想マシン (VM) 上で Data Packet Development Kit (DPDK) ワークロードを実行すると、レイテンシーの短縮とスループットが向上し、ユーザー空間でのパケット処理を高速化できます。DPDK は、ハードウェアベースの I/O 共有に SR-IOV ネットワークを使用します。
前提条件
- DPDK ワークロードを実行するようにクラスターが設定されている。
- 仮想マシンを実行するプロジェクトを作成し、設定している。
手順
VirtualMachine
マニフェストを編集して、SR-IOV ネットワークインターフェイス、CPU トポロジー、CRI-O アノテーション、Huge Page に関する情報を格納します。VirtualMachine
マニフェストの例apiVersion: kubevirt.io/v1 kind: VirtualMachine metadata: name: rhel-dpdk-vm spec: running: true template: metadata: annotations: cpu-load-balancing.crio.io: disable 1 cpu-quota.crio.io: disable 2 irq-load-balancing.crio.io: disable 3 spec: domain: cpu: sockets: 1 4 cores: 5 5 threads: 2 dedicatedCpuPlacement: true isolateEmulatorThread: true interfaces: - masquerade: {} name: default - model: virtio name: nic-east pciAddress: '0000:07:00.0' sriov: {} networkInterfaceMultiqueue: true rng: {} memory: hugepages: pageSize: 1Gi 6 guest: 8Gi networks: - name: default pod: {} - multus: networkName: dpdk-net 7 name: nic-east # ...
- 1
- このアノテーションは、コンテナーが使用する CPU に対するロードバランシングが無効であることを示します。
- 2
- このアノテーションは、コンテナーが使用する CPU に対する CPU クォータが無効であることを示します。
- 3
- このアノテーションは、コンテナーが使用する CPU に対する Interrupt Request (IRQ) のロードバランシングが無効であることを示します。
- 4
- 仮想マシン内のソケットの数。同じ Non-Uniform Memory Access (NUMA) ノードから CPU をスケジュールするには、このフィールドを
1
に設定する必要があります。 - 5
- 仮想マシン内のコアの数。値は
1
以上とします。この例では、仮想マシンは 5 個のハイパースレッドか 10 個の CPU でスケジュールされています。 - 6
- Huge Page のサイズ。x86-64 アーキテクチャーの有効な値は 1Gi と 2Mi です。この例は、サイズが 1Gi の 8 個の Huge Page に対する要求です。
- 7
- SR-IOV
NetworkAttachmentDefinition
オブジェクトの名前。
- エディターを保存し、終了します。
VirtualMachine
マニフェストを適用します。$ oc apply -f <file_name>.yaml
ゲストオペレーティングシステムを設定します。次の例は、RHEL 9 オペレーティングシステムの設定手順を示しています。
GRUB ブートローダーコマンドラインインターフェイスを使用して、Huge Page を設定します。次の例では、1G の Huge Page を 8 個指定しています。
$ grubby --update-kernel=ALL --args="default_hugepagesz=1GB hugepagesz=1G hugepages=8"
TuneD アプリケーションで
cpu-partitioning
プロファイルを使用して低レイテンシーチューニングを実現するには、次のコマンドを実行します。$ dnf install -y tuned-profiles-cpu-partitioning
$ echo isolated_cores=2-9 > /etc/tuned/cpu-partitioning-variables.conf
最初の 2 つの CPU (0 と 1) はハウスキーピングタスク用に確保され、残りは DPDK アプリケーション用に分離されます。
$ tuned-adm profile cpu-partitioning
driverctl
デバイスドライバー制御ユーティリティーを使用して、SR-IOV NIC ドライバーをオーバーライドします。$ dnf install -y driverctl
$ driverctl set-override 0000:07:00.0 vfio-pci
- 仮想マシンを再起動して変更を適用します。