NetScaler VPX

在 KVM 上配置 NetScaler VPX 实例以使用基于 OVS DPDK 的主机接口

您可以将在 KVM(Fedora 和 RHOS)上运行的 NetScaler VPX 实例配置为使用带有数据平面开发套件 (DPDK) 的 Open vSwitch (OVS) 以提高网络性能。 本文档介绍如何配置 NetScaler VPX 实例,使其在 OVS-DPDK 在 KVM 主机上公开的 vhost-user 端口上运行。

OVS 是根据开源 Apache 2.0 许可证许可的多层虚拟交换机。 DPDK 是一组用于快速数据包处理的库和驱动程序。

以下 Fedora、RHOS、OVS 和 DPDK 版本符合配置 NetScaler VPX 实例的资格:

Fedora RHOS
Fedora 25 RHOS 7.4
OVS 2.7.0 OVS 2.6.1
DPDK 16.11.12 DPDK 16.11.12

必备条件

在安装 DPDK 之前,请确保主机具有 1 GB 大页。

有关更多信息,请参阅此 DPDK 系统要求文档。 以下是在 KVM 上配置 NetScaler VPX 实例以使用基于 OVS DPDK 的主机接口所需的步骤摘要:

  • 安装 DPDK。
  • 构建和安装 OVS。
  • 创建 OVS 桥接。
  • 将物理接口附加到 OVS 桥接。
  • vhost-user 端口连接到 OVS 数据路径。
  • 为 KVM-VPX 置备基于 OVS-DPDK 的 vhost-user 端口。

安装 DPDK

要安装 DPDK,请按照此 打开 vSwitch 与 DPDK 文档中的说明进行操作。

构建和安装 OVS

从 OVS 下载 页面下载OVS。 然后,使用 DPDK 数据路径构建和安装 OVS。 按照安 装打开 vSwitch 文档中的说明进行操作。

有关更多详细信息,请参阅《 Linux 版 DPDK 入门指南》

创建 OVS 桥接

根据您的需要,键入 Fedora 或 RHOS 命令以创建 OVS 桥接:

Fedora 命令

  > $OVS_DIR/utilities/ovs-vsctl add-br ovs-br0 -- set bridge ovs-br0 datapath_type=netdev
<!--NeedCopy-->

RHOS 命令

  ovs-vsctl add-br ovs-br0 -- set bridge ovs-br0 datapath_type=netdev
<!--NeedCopy-->

将物理接口附加到 OVS 桥接

键入以下 Fedora 或 RHOS 命令将端口绑定到 DPDK ,然后将其附加到 OVS 桥接:

Fedora 命令


  > $OVS_DIR/utilities/ovs-vsctl add-port ovs-br0 dpdk0 -- set Interface dpdk0 type=dpdk  options:dpdk-devargs=0000:03:00.0

  > $OVS_DIR/utilities/ovs-vsctl add-port ovs-br0 dpdk1 -- set Interface dpdk1 type=dpdk  options:dpdk-devargs=0000:03:00.1
<!--NeedCopy-->

RHOS 命令

  ovs-vsctl add-port ovs-br0 dpdk0 -- set Interface dpdk0 type=dpdk  options:dpdk-devargs=0000:03:00.0


  ovs-vsctl add-port ovs-br0 dpdk1 -- set Interface dpdk1 type=dpdk  options:dpdk-devargs=0000:03:00.1
<!--NeedCopy-->

作为选项的一部分显示的 dpdk-devargs 指定各个物理 NIC 的 PCI BDF。

vhost-user 端口连接到 OVS 数据路径

键入以下 Fedora 或 RHOS 命令将 vhost-user 端口附加到 OVS 数据路径:

Fedora 命令

  > $OVS_DIR/utilities/ovs-vsctl add-port ovs-br0 vhost-user1 -- set Interface vhost-user1 type=dpdkvhostuser -- set Interface vhost-user1  mtu_request=9000

  > $OVS_DIR/utilities/ovs-vsctl add-port ovs-br0 vhost-user2 -- set Interface vhost-user2 type=dpdkvhostuser -- set Interface vhost-user2  mtu_request=9000

  chmod g+w  /usr/local/var/run/openvswitch/vhost*
<!--NeedCopy-->

RHOS 命令

  ovs-vsctl add-port ovs-br0 vhost-user1 -- set Interface vhost-user1 type=dpdkvhostuser -- set Interface vhost-user1  mtu_request=9000

  ovs-vsctl add-port ovs-br0 vhost-user2 -- set Interface vhost-user2 type=dpdkvhostuser -- set Interface vhost-user2  mtu_request=9000

  chmod g+w /var/run/openvswitch/vhost*
<!--NeedCopy-->

为 KVM-VPX 预配基于 OVS-DPDK 的 vhost-user 端口

您可以使用以下 QEMU 命令从 CLI 在 Fedora KVM 上使用基于 OVS-DPDK 的 vhost-user 端口配置 VPX 实例: Fedora 命令

  qemu-system-x86_64 -name KVM-VPX -cpu host -enable-kvm -m 4096M \

  -object memory-backend-file,id=mem,size=4096M,mem-path=/dev/hugepages,share=on -numa node,memdev=mem \

  -mem-prealloc -smp sockets=1,cores=2 -drive file=<absolute-path-to-disc-image-file>,if=none,id=drive-ide0-0-0,format=<disc-image-format> \

  -device ide-drive,bus=ide.0,unit=0,drive=drive-ide0-0-0,id=ide0-0-0,bootindex=1 \

  -netdev type=tap,id=hostnet0,script=no,downscript=no,vhost=on \

  -device virtio-net-pci,netdev=hostnet0,id=net0,mac=52:54:00:3c:d1:ae,bus=pci.0,addr=0x3 \

  -chardev socket,id=char0,path=</usr/local/var/run/openvswitch/vhost-user1> \

  -netdev type=vhost-user,id=mynet1,chardev=char0,vhostforce -device virtio-net-pci,mac=00:00:00:00:00:01,netdev=mynet1,mrg_rxbuf=on \

  -chardev socket,id=char1,path=</usr/local/var/run/openvswitch/vhost-user2> \

  -netdev type=vhost-user,id=mynet2,chardev=char1,vhostforce -device virtio-net

  pci,mac=00:00:00:00:00:02,netdev=mynet2,mrg_rxbuf=on \

  --nographic
<!--NeedCopy-->

对于 RHOS,使用以下 XML 示例文件通过使用 virsh 来配置 NetScaler VPX 实例。

  <domain type='kvm'>

    <name>dpdk-vpx1</name>

    <uuid>aedb844b-f6bc-48e6-a4c6-36577f2d68d6</uuid>

    <memory unit='KiB'>16777216</memory>

    <currentMemory unit='KiB'>16777216</currentMemory>

    <memoryBacking>

      <hugepages>

        <page size='1048576' unit='KiB'/>

      </hugepages>

    </memoryBacking>

    <vcpu placement='static'>6</vcpu>

    <cputune>

      <shares>4096</shares>

      <vcpupin vcpu='0' cpuset='0'/>

      <vcpupin vcpu='1' cpuset='2'/>

      <vcpupin vcpu='2' cpuset='4'/>

      <vcpupin vcpu='3' cpuset='6'/>

      <emulatorpin cpuset='0,2,4,6'/>

    </cputune>

    <numatune>

      <memory mode='strict' nodeset='0'/>

    </numatune>

    <resource>

      <partition>/machine</partition>

    </resource>

    <os>

      <type arch='x86\_64' machine='pc-i440fx-rhel7.0.0'>hvm</type>

      <boot dev='hd'/>

    </os>

    <features>

      <acpi/>

      <apic/>

    </features>

    <cpu mode='custom' match='minimum' check='full'>

      <model fallback='allow'>Haswell-noTSX</model>

      <vendor>Intel</vendor>

      <topology sockets='1' cores='6' threads='1'/>

      <feature policy='require' name='ss'/>

      <feature policy='require' name='pcid'/>

      <feature policy='require' name='hypervisor'/>

      <feature policy='require' name='arat'/>

  <domain type='kvm'>

    <name>dpdk-vpx1</name>

    <uuid>aedb844b-f6bc-48e6-a4c6-36577f2d68d6</uuid>

    <memory unit='KiB'>16777216</memory>

    <currentMemory unit='KiB'>16777216</currentMemory>

    <memoryBacking>

      <hugepages>

        <page size='1048576' unit='KiB'/>

      </hugepages>

    </memoryBacking>

    <vcpu placement='static'>6</vcpu>

    <cputune>

      <shares>4096</shares>

      <vcpupin vcpu='0' cpuset='0'/>

      <vcpupin vcpu='1' cpuset='2'/>

      <vcpupin vcpu='2' cpuset='4'/>

      <vcpupin vcpu='3' cpuset='6'/>

      <emulatorpin cpuset='0,2,4,6'/>

    </cputune>

    <numatune>

      <memory mode='strict' nodeset='0'/>

    </numatune>

    <resource>

      <partition>/machine</partition>

    </resource>

    <os>

      <type arch='x86\_64' machine='pc-i440fx-rhel7.0.0'>hvm</type>

      <boot dev='hd'/>

    </os>

    <features>

      <acpi/>

      <apic/>

    </features>

    <cpu mode='custom' match='minimum' check='full'>

      <model fallback='allow'>Haswell-noTSX</model>

      <vendor>Intel</vendor>

      <topology sockets='1' cores='6' threads='1'/>

      <feature policy='require' name='ss'/>

      <feature policy='require' name='pcid'/>

      <feature policy='require' name='hypervisor'/>

      <feature policy='require' name='arat'/>

      <feature policy='require' name='tsc\_adjust'/>

      <feature policy='require' name='xsaveopt'/>

      <feature policy='require' name='pdpe1gb'/>

      <numa>

        <cell id='0' cpus='0-5' memory='16777216' unit='KiB' memAccess='shared'/>

      </numa>

    </cpu>

    <clock offset='utc'/>

    <on\_poweroff>destroy</on\_poweroff>

    <on\_reboot>restart</on\_reboot>

    <on\_crash>destroy</on\_crash>

    <devices>

      <emulator>/usr/libexec/qemu-kvm</emulator>

      <disk type='file' device='disk'>

        <driver name='qemu' type='qcow2' cache='none'/>

        <source file='/home/NSVPX-KVM-12.0-52.18\_nc.qcow2'/>

        <target dev='vda' bus='virtio'/>

        <address type='pci' domain='0x0000' bus='0x00' slot='0x07' function='0x0'/>

      </disk>

      <controller type='ide' index='0'>

        <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x1'/>

      </controller>

      <controller type='usb' index='0' model='piix3-uhci'>

        <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x2'/>

      </controller>

      <controller type='pci' index='0' model='pci-root'/>

      <interface type='direct'>

        <mac address='52:54:00:bb:ac:05'/>

        <source dev='enp129s0f0' mode='bridge'/>

        <model type='virtio'/>

        <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>

      </interface>

      <interface type='vhostuser'>

        <mac address='52:54:00:55:55:56'/>

        <source type='unix' path='/var/run/openvswitch/vhost-user1' mode='client'/>

        <model type='virtio'/>

        <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0'/>

      </interface>

      <interface type='vhostuser'>

        <mac address='52:54:00:2a:32:64'/>

        <source type='unix' path='/var/run/openvswitch/vhost-user2' mode='client'/>

        <model type='virtio'/>

        <address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x0'/>

      </interface>

      <interface type='vhostuser'>

        <mac address='52:54:00:2a:32:74'/>

        <source type='unix' path='/var/run/openvswitch/vhost-user3' mode='client'/>

        <model type='virtio'/>

        <address type='pci' domain='0x0000' bus='0x00' slot='0x06' function='0x0'/>

      </interface>

      <interface type='vhostuser'>

        <mac address='52:54:00:2a:32:84'/>

        <source type='unix' path='/var/run/openvswitch/vhost-user4' mode='client'/>

       <model type='virtio'/>

        <address type='pci' domain='0x0000' bus='0x00' slot='0x09' function='0x0'/>

      </interface>

      <serial type='pty'>

        <target port='0'/>

      </serial>

      <console type='pty'>

        <target type='serial' port='0'/>

      </console>

      <input type='mouse' bus='ps2'/>

      <input type='keyboard' bus='ps2'/>

      <graphics type='vnc' port='-1' autoport='yes'>

        <listen type='address'/>

      </graphics>

      <video>

        <model type='cirrus' vram='16384' heads='1' primary='yes'/>

        <address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0'/>

      </video>

      <memballoon model='virtio'>

        <address type='pci' domain='0x0000' bus='0x00' slot='0x08' function='0x0'/>

      </memballoon>

    </devices>

  </domain
<!--NeedCopy-->

注意事项

在 XML 文件中,hugepage 大小必须为 1 GB,如示例文件所示。

  <memoryBacking>

      <hugepages>

        <page size='1048576' unit='KiB'/>

      </hugepages>
<!--NeedCopy-->

此外,在示例文件中,vhost-user1 为绑定到 ovs-br0 的 vhost 用户端口。

  <interface type='vhostuser'>

        <mac address='52:54:00:55:55:56'/>

        <source type='unix' path='/var/run/openvswitch/vhost-user1' mode='client'/>

        <model type='virtio'/>

        <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0'/>

      </interface>
<!--NeedCopy-->

要启动 NetScaler VPX 实例,请开始使用命令。 virsh

在 KVM 上配置 NetScaler VPX 实例以使用基于 OVS DPDK 的主机接口