PowerEdge: Enumeración incorrecta de funciones virtuales de puertos con varios adaptadores Intel X520 o X540 en VMware ESXi SR-IOV
Resumen: Configuración SR-IOV de VMware ESXi Intel X520/X540 max_vfs
Síntomas
El uso de varias tarjetas de red Intel X520 o Intel X540 en un único servidor PowerEdge puede generar un mensaje de VMware ESXi SR-IOV.
VMware informa que hay una enumeración incorrecta de funciones virtuales de puertos.
El problema se puede experimentar cuando se intenta configurar SR-IOV según la documentación técnica de Intel en
http://www.intel.com/content/dam/www/public/us/en/documents/technology-briefs/converged-network-adapter-sr-iov-on-esxi-5-1-brief.pdf
http://www.intel.com/content/dam/www/public/us/en/documents/reference-guides/sr-iov-guide-ethernet-can-x710-xl710-vmware-vsphere-6-brief.pdf
Cuando se observa el problema, después de habilitar las funciones virtuales desde la utilidad de línea de comandos (CLI) con el parámetro max_vfs, la enumeración de la función virtual del puerto parece incoherente con la asignación que se intentó. La visualización de la interfaz de usuario web también puede mostrar una enumeración de funciones virtuales de puerto incoherente después de habilitar las funciones virtuales desde la CLI de esta manera.
Causa
Sin causa
Resolución
VMware está al tanto de este problema y se está investigando una corrección. La documentación de VMware recomienda que los usuarios activen las funciones virtuales SR-IOV mediante vSphere Web Client.
Cuando utilice la CLI para configurar SR-IOV, asegúrese de que los controladores y el cliente web más recientes estén implementados; a continuación, se recomienda utilizar el método de cliente web para habilitar las funciones virtuales.
Solución alternativa de CLI avanzada
Esta solución alternativa de la CLI se proporciona a los usuarios avanzados.
El kernel de ESXi escanea y ordena los dispositivos PCI de tres maneras diferentes según el comando utilizado.
Segmento: Autobús: Dispositivo: Función (Segmento = Dominio en términos de Linux, es 0)
- Orden de escaneo de árbol PCI que es orden conectado al dispositivo
- El VMkernel escanea desde el puente raíz y todos los nodos secundarios leen desde el espacio de configuración y de la manera recursiva de "búsqueda de profundidad primero".
No hay documentación, pero es similar a http://wiki.osdev.org/PCI#Recursive_Scan_With_Bus_Configuration.
- Nombre de Vmnic: Es decir, vmnic1, vmnic1x,... vmnic2, vmnic2x,...,vmnic3
Luego, las diversas herramientas para enumerar dispositivos pueden seguir cualquiera de estos tres métodos:
-
Lspcise ordena por S,B,D,F esxcfg-nics-l' se ordena por vmnicX name.- El cliente web se ordena por S,B,D,F.
Esxcfg-module -s max_vsf=se ordena por escaneo de árbol PCIorderDmesgmuestra los dispositivos PCI ordenados según el orden de escaneo del árbol de PCI.
Para configurar/habilitar SR-IOV correctamente (configure max_vfs mediante la línea de comandos), el usuario debe habilitar un dispositivo PCI según el orden de escaneo del árbol de PCI, que se puede lograr de la siguiente manera:
-corriente dmesg para obtener la información y analizarla con la información del dispositivo PCI, luego configure el max_vfs Según el orden indicado en el dmesg salida.
-ejecutar lspci.py script (a continuación) y establecer el comando max_vfs según el orden indicado por el script.
Este script consulta el PCI y ordena por orden de escaneo de árbol de PCI.
Por ejemplo, el script es solo y es posible que no se ejecute en todas las versiones del kernel de ESXi.
Se probó con ESXi 6.0U3.
Guarde el siguiente script en un archivo separado con la extensión .py (lspci.py, por ejemplo).
#!/usr/bin/env python
import vmware
import vmware.vsi as vsi
VSI_HW_PCI_DEVICES = '/hardware/pci/devices'
VSI_HW_PCI_ROOT = '/hardware/pci'
VSI_SYS_MOD_ROOT = '/system/modules'
modInfo = {}
for m in vsi.list(VSI_SYS_MOD_ROOT):
general = vsi.get("%s/%s/general" % (VSI_SYS_MOD_ROOT, m))
id = int(general['moduleId'])
modInfo[id] = m
for ptr in vsi.list(VSI_HW_PCI_DEVICES):
dev = vsi.get("%s/%s/info" % (VSI_HW_PCI_DEVICES, ptr.strip()))
s, b, d, f = dev['seg'], dev['bus'], dev['dev'], dev['func']
nodePath = "%s/seg/%d/bus/%d/slot/%d/func/%d" % (VSI_HW_PCI_ROOT, s, b, d, f)
cfg = vsi.get("%s/seg/%d/bus/%d/slot/%d/func/%d/pciConfigHeader" % (VSI_HW_PCI_ROOT, s, b, d, f))
modName = modInfo[cfg['moduleID']] if cfg['moduleID'] != 0xffffffff else " " * 8
print("%04d:%02d:%02d:%d\t%-16s\t%s" % (s, b, d, f, modName, cfg['name']))