Configurar una instancia de NetScaler VPX en KVM para usar interfaces de host basadas en OVS DPDK
Puede configurar una instancia de NetScaler VPX que se ejecute en KVM (Fedora y RHOS) para usar Open vSwitch (OVS) con Data Plane Development Kit (DPDK) para un mejor rendimiento de la red. Este documento describe cómo configurar la instancia de NetScaler VPX para que funcione en los puertos vhost-user expuestos por OVS-DPDK en el host KVM.
OVS es un conmutador virtual multicapa con licencia de código abierto Apache 2.0. DPDK es un conjunto de bibliotecas y controladores para el procesamiento rápido de paquetes.
Las siguientes versiones de Fedora, RHOS, OVS y DPDK están cualificadas para configurar una instancia de 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 |
Requisitos previos
Antes de instalar DPDK, asegúrese de que el host tenga páginas enormes de 1 GB.
Para obtener más información, consulte esta documentación de requisitos del sistema de DPDK. A continuación, se presenta un resumen de los pasos necesarios para configurar una instancia de NetScaler VPX en KVM para usar interfaces de host basadas en OVS DPDK:
- Instalar DPDK.
- Compilar e instalar OVS.
- Crear un puente OVS.
- Conectar una interfaz física al puente OVS.
- Conectar puertos
vhost-usera la ruta de datos de OVS. - Aprovisionar un KVM-VPX con puertos
vhost-userbasados en OVS-DPDK.
Instalar DPDK
Para instalar DPDK, siga las instrucciones proporcionadas en este documento Open vSwitch con DPDK.
Compilar e instalar OVS
Descargue OVS desde la página de descarga de OVS. A continuación, compile e instale OVS utilizando una ruta de datos DPDK. Siga las instrucciones proporcionadas en el documento Installing Open vSwitch.
Para obtener información más detallada, consulte la Guía de introducción a DPDK para Linux.
Crear un puente OVS
Según sus necesidades, escriba el comando de Fedora o RHOS para crear un puente OVS:
Comando de Fedora:
> $OVS_DIR/utilities/ovs-vsctl add-br ovs-br0 -- set bridge ovs-br0 datapath_type=netdev
<!--NeedCopy-->
Comando de RHOS:
ovs-vsctl add-br ovs-br0 -- set bridge ovs-br0 datapath_type=netdev
<!--NeedCopy-->
Conectar la interfaz física al puente OVS
Vincule los puertos a DPDK y luego conéctelos al puente OVS escribiendo los siguientes comandos de Fedora o RHOS:
Comando de 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-->
Comando de 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-->
El dpdk-devargs que se muestra como parte de las opciones especifica el BDF PCI de la NIC física correspondiente.
Conectar puertos vhost-user a la ruta de datos de OVS
Escriba los siguientes comandos de Fedora o RHOS para conectar puertos vhost-user a la ruta de datos de OVS:
Comando de 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-->
Comando de 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-->
Aprovisionar una KVM-VPX con puertos vhost-user basados en OVS-DPDK
Puede aprovisionar una instancia VPX en Fedora KVM con puertos vhost-user basados en OVS-DPDK solo desde la CLI mediante los siguientes comandos QEMU:
Comando de 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-->
Para RHOS, utilice el siguiente archivo XML de ejemplo para aprovisionar la instancia de NetScaler VPX, utilizando virsh.
<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-->
Puntos a tener en cuenta
En el archivo XML, el tamaño de hugepage debe ser de 1 GB, como se muestra en el archivo de ejemplo.
<memoryBacking>
<hugepages>
<page size='1048576' unit='KiB'/>
</hugepages>
<!--NeedCopy-->
Además, en el archivo de ejemplo, vhost-user1 es el puerto de usuario vhost enlazado a ovs-br0.
<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-->
Para iniciar la instancia de NetScaler VPX, comience a usar el comando virsh.