Que tal gente el día de hoy les quiero platicar sobre una nueva “capacidad” (yo creo que se trata mas de un método de abstracción y manejo de recursos que una capacidad per-se…) que fue introducida a vSphere 7 y nos permite presentar dispositivos de hardware directamente a las VMs… Yo se que ahorita deben de estar pensando en SR-IOV o VMDirectPath I/O y pues no están muy lejos…
Me gustaría primero exponer algunas de las ventajas y desventajas al presentar dispositivos de hardware directamente a una VM con las tecnologías disponibles antes de que apareciera Assignable hardware:
Ventajas:
- Mejor rendimiento y una latencia menor para ciertos casos de uso. Por ejemplo HPC, NFV, etc. (con SR-IOV)
- Uso de dispositivos que puedan no ser compatibles con el hipervisor en cuestión (con VMDirectPath I/O)
- Uso de FPGAs con SR-IOV
- Offloading de carga del CPU hacia dispositivos PCIe, existen muchos casos de uso y/o tecnologías que se benefician con esto. Un ejemplo claro sería el uso de GPUs en aplicaciones con un alto grado de paralelismo.
Desventajas:
- Al tener un dispositivo físico (ya sea en su totalidad o un VF en caso de SR-IOV) asignado a una VM perdemos muchas capacidades como lo pueden ser vMotion, DRS, etc.
- En el caso de VMDirectPath I/O no podemos compartir el dispositivo PCIe con otras VMs o el host.
VMDirectPath I/O y SR-IOV
Me gustaría describir rápidamente las opciones con las que contábamos dentro de vSphere para poder hacer IOV (I/O virtualization):

- SR-IOV – Single Root I/O virtualization permite “virtualizar” un dispositivo PCIe en múltiples dispositivos lógicos del mismo tipo. Por ejemplo, Podemos hablar de una tarjeta de red Intel de 10Gbps con 4 puertos, esta tarjeta tiene un PCIe especifico, SR-IOV sería un buen candidato si estuviéramos hablando de un caso de uso que pueda requerir una baja latencia con muchos paquetes por segundo (pps), por ejemplo tecnologías Telco (que claramente tienen otras consideraciones y requerimientos como DPDK) . Tomando dicha tarjeta de 4 puertos podríamos “virtualizar” o crear múltiples instancias lógicas de la misma tarjeta, pudiendo asignar una de estas instancias (VF) a una VM de manera directa, la cantidad de instancias lógicas que podemos crear dependerá de la implementación de SR-IOV en cuestión, pero tomando como referencia dicha tarjeta de 4 puertos a 10Gbps que vSphere detectaría como 4 puertos individuales y asumiendo que la implementación de SR-IOV permite hasta 4 VFs estaríamos hablando de 16 puertos individuales que podemos asignar directamente a una VM.

- VMDirecthPath I/O – Mucha gente confunde SR-IOV con VMDirectPath I/O pero la diferencia es sustancial, en el caso de VMDirectPath I/O se presenta todo un dispositivo PCIe directamente a una VM sin pasar por el hipervisor. Para lograr esto se requiere de contar con tecnologías como lo son Intel VT-d o AMD-Vi que permiten tener un MMU (Memory Management Unit) para dispositivos de I/O logrando traducir las regiones de memoria de GPA (Guest Physical Addresses, asignadas por el VMM) a HPA (Host Physical Addresses), todo esto es necesario ya que al hacer una asignación completa y directa de un dispositivo PCIe hacia una VM se necesita siempre estar seguros que quien esta accediendo dicho dispositivo y controlando funciones como lo pueden ser los interrupts del dispositivo, también permite que los buffers de memoria del Guest OS sean utilizados en vez de los del host. Lo interesante en este caso es que al hacer un bypass del hipervisor el Guest OS controlara en su totalidad dicho dispositivo PCIe, incluso requiriendo el driver especifico para dicho OS.
¿Que es Assignable Hardware?
SR-IOV y VMDirectPath I/O usan los identificadores físicos o de hardware para hacer la asignación del dispositivo físico o una VF (virtual function, un instancia lógica del dispositivo) Assignable hardware tiene un enfoque mucho mas flexible, lo logra mediante la identificación de los atributos de estos dispositivos de hardware, sin incluir un identificador de hardware como tal. Esto permite crear una capa de abstracción extra.
Hoy en día tenemos dos consumidores de Assignable hardware, estos nos ayudaran a entender de manera mas sencilla:

- NVIDIA vGPU – Desde vSphere 6.7 U3 podemos asignar vGPUs a VMs que no son de Horizon View. Lo interesante de los vGPUs es que necesitamos asignar un perfil, este perfil hace las veces de “descriptor” (logrando una abstracción del identificador físico del PCIe) de las capacidades y modelo requerido para la VM en cuestión, permitiendo asignar recursos de un dispositivo PCIe que cumple con dicho perfil.
- Dynamic VMDirectPath I/O – Desde vSphere 7 Dynamic VMDirectPath I/O apoya identificando las capacidades y descripción del dispositivo a ser asignado a una VM, se basa en un modelo de Key-Pair, lo cual permite crear una serie de capacidades a ser cumplidas lo cual no significa necesariamente dar el mismo dispositivo PCIe sino alguno que cumpla con dichos valores. Aquí lo interesante es que DRS y HA trabajan de la mano con Dynamic VMDirectPath I/O para saber donde colocar e iniciar la VM en cuestión, entonces ya no estamos atados al 100% con el host físico. Aquí tenemos un ejemplo conceptual de como se describiría:

¿Como impacta en nuestros diseños?
Uno de los grandes problemas con SR-IOV y VMDirectPath I/O (no Dynamic) es la poca escalabilidad que nos ofrecen. En el caso de SR-IOV estamos limitados a la cantidad de VFs que puede presentar una tarjeta PCIe que soporte SR-IOV y la cantidad de ranuras PCIe por servidor, para VMDirectPath I/O es aún peor ya que la relación es 1:1 entre PCIe y VM por lo que nuestra escalabilidad se veía seriamente afectada.
Con la llegada de Assignable hardware logramos tener una mejor escalabilidad, flexibilidad y también disponibilidad de nuestros servicios, tomando Dynamic VMDirectPath I/O como ejemplo podemos notar que logramos separar la VM del servidor físico a través de estos perfiles y/o descripciones de lo que se debe asignar, por lo que si un servidor ESXi en cuestión ya no cuenta con recursos que cumplen con los requerimientos de la VM DRS analizara la disponibilidad en otros servidores ESXi al igual que en un evento de HA, claramente al tratarse de un elemento de hardware siempre estaremos limitados a la cantidad de ranuras PCIe y a la cantidad de VFs en el caso de SR-IOV, pero ahora podremos aprovechar nuestros recursos de manera efectiva a nivel del cluster.