Optimización del rendimiento de Linux (9) -Kernel Bypass

1. Cuello de botella en el rendimiento de la pila del protocolo del kernel de Linux

En la arquitectura x86, la forma tradicional de recibir paquetes de datos es el método de interrupción de la CPU, es decir, el controlador de la tarjeta de red recibe el paquete de datos e informa a la CPU a través de una interrupción para procesar, y luego la CPU copia los datos y los entrega a la pila de protocolos del kernel. Cuando la cantidad de datos es grande, el modo de interrupción de la CPU generará una gran cantidad de interrupciones de la CPU, lo que resultará en una alta carga de la CPU.
Optimización del rendimiento de Linux (9) -Kernel Bypass
(1) Conmutación de subprocesos y procesos causada por
interrupciones de hardware. Las solicitudes de interrupciones de hardware se adelantarán a las interrupciones de software con menor prioridad. Las interrupciones de hardware y las interrupciones suaves que llegan con frecuencia significan una conmutación de subprocesos frecuente, seguida de un cambio de modo de funcionamiento y contexto Una serie de pérdidas de rendimiento de la CPU, como conmutación, carga del programador de subprocesos, Cache Missing, sincronización de datos compartidos de caché multinúcleo y bloqueos en competencia.
(2) El
controlador de la tarjeta de red de copia de memoria está en el modo kernel. Una vez que el controlador de red recibe el paquete de datos, la pila de protocolos del kernel lo procesará y luego lo copiará al búfer de la capa de aplicación en el modo de usuario. La copia de datos del modo kernel al modo de usuario consume mucho tiempo En funcionamiento, el tiempo de copia de datos representará más del 50% del tiempo de procesamiento de paquetes de datos.
(3)
Desviación de la CPU de la plataforma multiprocesador. Un paquete de datos puede interrumpirse en CPU0, el procesamiento en modo kernel es CPU1, el procesamiento en modo usuario es CPU2, el procesamiento en múltiples núcleos físicos (Core) provocará una gran cantidad de fallos de caché de CPU y localidad Invalidar. Para la arquitectura NUMA, también se producirán accesos a la memoria a través de los nodos NUMA, lo que afecta en gran medida el rendimiento de la CPU.
(4) Invalidación de caché
Los servidores tradicionales utilizan principalmente memoria virtual basada en páginas, y las páginas de memoria tienen por defecto páginas pequeñas de 4 K. Habrá una gran cantidad de elementos de mapeo de páginas en procesadores con mayor espacio de almacenamiento. Al mismo tiempo, debido al espacio de caché de TLB limitado, los elementos de mapeo de la tabla rápida de TLB eventualmente se cambian con frecuencia, lo que resulta en una gran cantidad de errores de TLB.

2. Introducción a Kernel Bypass

1. Introducción a Kernel Bypass

Kernel Bypass (kernel bypass) es una tecnología que pasa por alto el kernel de Linux (pila de protocolos TCPIP). No utiliza la función del subsistema del kernel de Linux y utiliza el código de la misma función implementada por él mismo para procesar, acceder directamente y controlar la memoria del dispositivo desde el espacio de usuario. Evite copiar datos del dispositivo al kernel y luego del kernel al espacio de usuario.
Kernel Bypass es actualmente soluciones de implementación convencionales como DPDK y SolarFlare.

2. Ventajas de Kernel Bypass

La tecnología Kernel Bypass en sí está diseñada para un alto rendimiento y baja latencia, por lo que la mayor ventaja es el alto rendimiento y la baja latencia.

3. Desventajas de Kernel Bypass

Las desventajas de la tecnología Kernel Bypass son las siguientes:
(1) Ha cambiado el modo de trabajo del sistema operativo existente y es difícil de integrar con el sistema operativo existente.
(2) Dado que los datos de red no pasan a través de la pila de protocolos de red del kernel, las aplicaciones de red relevantes deben volver a implementar las funciones proporcionadas por el sistema operativo.
(3) Dado que el sistema operativo no tiene control sobre el hardware de red relevante, las herramientas de implementación de administración de red proporcionadas por el sistema operativo ya no están disponibles.
(4) Se destruye la seguridad proporcionada por el kernel del sistema operativo. En el escenario del contenedor, la abstracción y el aislamiento de recursos los proporciona principalmente el kernel del sistema operativo.
(5) Es necesario consumir uno o más núcleos de CPU para procesar paquetes de red exclusivamente.

Tres, DPDK

1. Introducción a DPDK

DPDK (Data Plane Development Kit) es un conjunto de herramientas de desarrollo de plano de datos proporcionado por Intel. Proporciona funciones de biblioteca y compatibilidad con controladores para el procesamiento eficiente de paquetes de datos en el espacio del usuario bajo la arquitectura de procesador de la arquitectura Intel, centrándose en el procesamiento de alto rendimiento de paquetes de datos en aplicaciones de red .
El programa de aplicación DPDK se ejecuta en el espacio del usuario y utiliza la biblioteca de plano de datos proporcionada por él mismo para enviar y recibir paquetes de datos, sin pasar por la pila de protocolos del kernel de Linux para el procesamiento de paquetes de datos. El kernel de Linux considera la aplicación DPDK como un proceso en modo de usuario ordinario, que incluye métodos de compilación, vinculación y carga como los programas ordinarios. Una vez que se inicia el programa DPDK, solo puede haber un subproceso principal y luego crear algunos subprocesos y vincularlos al núcleo de CPU designado para su ejecución.
DPDK (Data Plane Development Kit) es una plataforma e interfaz de desarrollo de reenvío de paquetes de datos de plano de datos de código abierto y procesamiento rápido, compatible con plataformas de hardware X86, ARM y Power PC.
Intel inició el proceso de código abierto de la tecnología DPDK en 2010, lanzó oficialmente el paquete de software de código fuente a través del acuerdo de licencia de código abierto BSD en septiembre de 2010 y estableció formalmente una comunidad de código abierto independiente en www.dpdk.org en abril de 2014 La plataforma brinda soporte a los desarrolladores.
DPDK proporciona una biblioteca de procesamiento de paquetes de datos eficiente en modo de usuario, a través de la capa de abstracción del entorno, la pila de protocolo de derivación del kernel, el envío y la recepción no interrumpidos de mensajes en el modo de sondeo, gestión optimizada de memoria / búfer / colas, reconocimiento de múltiples colas y flujo basado en la tarjeta de red El balanceo de carga y otras tecnologías han logrado capacidades de reenvío de mensajes de alto rendimiento bajo la arquitectura del procesador x86. Los usuarios pueden desarrollar varias aplicaciones de reenvío de alta velocidad en el modo de usuario de Linux, y también son adecuadas para varias soluciones comerciales de aceleración del plano de datos. Integrar.
DPDK vuelve a cargar el controlador de la tarjeta de red para separar el plano de control y el plano de datos del paquete de datos. El controlador ya no realiza interrupciones bruscas para notificar a la CPU después de recibir el paquete de datos, sino que permite que el paquete de datos omita la pila de protocolos del kernel de Linux a través de la pila de protocolos de derivación del kernel. Y almacenado en la memoria mediante la tecnología de copia cero, el programa de la capa de aplicación puede leer el paquete de datos a través de la interfaz proporcionada por DPDK.
El método de procesamiento de paquetes de datos DPDK ahorra tiempo de interrupción de CPU y tiempo de copia de memoria, y proporciona funciones de interfaz de procesamiento de paquetes de datos simples y eficientes a la capa de aplicación, lo que hace que el desarrollo de aplicaciones de red sea más conveniente. Sin embargo, debido a la necesidad de volver a cargar el controlador de la tarjeta de red, DPDK solo se puede utilizar en algunos dispositivos de tarjeta de red que utilizan chips de procesamiento de red Intel. La lista de tarjetas de red admitidas por DPDK: https://core.dpdk.org/supported/, el uso principal Intel 82599 (puerto óptico) e Intel x540 (puerto eléctrico). DPDK puede aumentar el rendimiento del procesamiento de paquetes hasta diez veces. Logre un rendimiento de más de 80 Mbps en un solo procesador Intel Xeon, que se puede duplicar en una configuración de doble procesador.
Optimización del rendimiento de Linux (9) -Kernel Bypass

2. Principio DPDK

Optimización del rendimiento de Linux (9) -Kernel Bypass

3. Arquitectura DPDK

Optimización del rendimiento de Linux (9) -Kernel Bypass
En el kernel de Linux, DPDK tiene dos módulos, KNI e IGB_UIO. En el modo de usuario, consta de varias bibliotecas DPDK, que incluyen principalmente bibliotecas centrales, módulos relacionados con la plataforma (Plataforma) y módulo de controlador del modo de sondeo de la tarjeta de red (PMD- Nativos y Virtual), biblioteca de QoS, algoritmo de clasificación de reenvío de paquetes (Classify), etc. Los usuarios pueden usar la biblioteca DPDK para desarrollar aplicaciones.

4 、 UIO

En la forma tradicional de enviar y recibir paquetes de datos, la tarjeta de red primero informa a la pila de protocolos del kernel de Linux que procese los paquetes de datos a través de interrupciones. La pila de protocolos del kernel primero verifica la validez de los paquetes de datos y luego determina si el destino de los paquetes de datos es nativo. Socket, si se cumplen las condiciones, se enviará una copia del paquete de datos al modo de usuario Socket para su procesamiento.
Para que el controlador de la tarjeta de red (controlador PMD) se ejecute en modo de usuario y logre la omisión del kernel, Linux proporciona un mecanismo UIO (User Space IO). UIO puede detectar interrupciones mediante lectura y comunicarse con dispositivos de tarjeta de red a través de mmap.
UIO es una tecnología de E / S en modo de usuario. Es la base para que DPDK omita la pila de protocolos del kernel y proporcione compatibilidad con el controlador PMD en modo de usuario. La arquitectura DPDK instala los módulos IGB_UIO (igb_uio.ko y kni.ko.IGB_UIO) en el kernel de Linux, que utiliza tecnología UIO para interceptar interrupciones y restablecer el comportamiento de devolución de llamada de interrupción, evitando así el flujo de procesamiento posterior de la pila de protocolos del kernel, e IGB_UIO En el proceso de inicialización del kernel, los registros de hardware de la tarjeta de red se asignan al modo de usuario.
El mecanismo de implementación de UIO es exponer la interfaz de archivo al modo de usuario. Al registrar un dispositivo UIO uioX, aparecerá el archivo de sistema / dev / uioX Leer y escribir en el archivo del dispositivo UIO es la lectura y escritura de la memoria del dispositivo de la tarjeta de red.

5. Funciones de DPDK

(1) Sondeo: evite la sobrecarga de interrumpir el cambio de contexto durante el procesamiento de paquetes,
(2) Unidad de modo de usuario: evite copias de memoria innecesarias y llamadas al sistema, y ​​facilite la optimización iterativa rápida
(3) Afinidad y exclusividad: se pueden realizar tareas específicas Diseñado para funcionar solo en un núcleo determinado, para evitar el cambio frecuente de subprocesos entre diferentes núcleos, para garantizar más accesos de caché
(4) Reducir la sobrecarga de acceso a la memoria: use páginas grandes de memoria HUGEPAGE para reducir la pérdida de TLB y use el acceso intercalado multicanal de memoria para aumentar la memoria Acceda al ancho de banda efectivo
(5) Ajuste del software: alineación de la línea de caché, obtención previa de datos, operaciones por lotes de múltiples datos

Cuatro, XDP

1. Introducción a XDP

XDP (eXpress Data Path) no es un esquema de implementación de Kernel Bypass. Es completamente opuesto a la implementación de Kernel Bypass. Es una tecnología de inyección de código del kernel que se basa en eBPF, que puede filtrar o procesar paquetes de red antes de que lleguen a la pila de protocolos del kernel. . XDP coloca el flujo de procesamiento de paquetes de red en el kernel de Linux delante de la pila de protocolos de red. Cuando procesa paquetes de datos de red, no necesita pasar por el flujo complejo de la pila de protocolos de red, al tiempo que conserva la capacidad del sistema operativo para controlar el hardware de red.
XDP es una tecnología SDN desarrollada en los últimos años, que se ha integrado completamente en el kernel de Linux y aún está en evolución.
Optimización del rendimiento de Linux (9) -Kernel Bypass

2. Flujo de procesamiento de datos de la red XDP

La pila de red del kernel de Linux determina el procesamiento (caída, reenvío) de los paquetes de datos de acuerdo con las reglas establecidas por el firewall de iptables. XDP puede descartar paquetes de datos tan pronto como llegan a la tarjeta de red, por lo que se puede usar para procesar el tráfico de datos de alta velocidad.
Optimización del rendimiento de Linux (9) -Kernel Bypass

3. Composición de XDP

Cuando un paquete de datos llega a la tarjeta de red, antes de que la pila de red del núcleo asigne el búfer para almacenar el contenido del paquete de datos en la estructura sk_buff, el programa XDP se ejecuta, lee las reglas de procesamiento de paquetes de datos escritas por el plano de control del modo de usuario en los mapas BPF, El paquete realiza las operaciones correspondientes, como descartar directamente el paquete de datos o enviar el paquete de datos a la tarjeta de red actual, o reenviar el paquete de datos a otras tarjetas de red o tarjetas de red virtual de capa superior (y luego reenviar el paquete de datos directamente al contenedor de capa superior o máquina virtual) , O pasar el paquete de datos a la pila de protocolos del kernel y luego enviarlo al programa de usuario a través del análisis capa por capa de la pila de protocolos, o reenviar directamente el paquete de datos al programa de aplicación superior a través del socket especial AF_XDP.
Optimización del rendimiento de Linux (9) -Kernel Bypass
Enlace del controlador XDP: un punto de montaje del programa XDP en el controlador de la tarjeta de red. Siempre que la tarjeta de red recibe un paquete de datos, el programa XDP se ejecutará; el programa XDP puede analizar los paquetes de datos capa por capa, filtrarlos de acuerdo con las reglas o realizar paquetes de datos Encapsular o desencapsular, modificar campos para reenviar paquetes de datos, etc.;
Máquina virtual eBPF: el usuario escribe el programa XDP y lo escribe en un lenguaje C restringido, y luego lo compila el front-end clang para generar el código de bytes BPF, y el código de bytes se carga en el kernel Después de ejecutarse en la máquina virtual eBPF, la máquina virtual compila el código de bytes XDP en instrucciones binarias de bajo nivel a través de la compilación justo a tiempo; la máquina virtual eBPF admite la carga y descarga dinámica de programas XDP;
Mapas BPF (mapas BPF): almacene pares clave-valor como usuarios El medio de comunicación entre el programa de estado y el programa XDP de estado del núcleo y el programa XDP de estado del núcleo es similar al acceso a la memoria compartida de la comunicación entre procesos; el programa de estado del usuario puede predefinir reglas en el mapeo BPF, y el programa XDP hace coincidir las reglas del mapeo con el paquete de datos. Realizar filtrado, etc.; El programa XDP almacena estadísticas de paquetes de datos en el mapeo BPF, el programa en modo de usuario puede acceder al mapeo BPF para obtener estadísticas del paquete de datos;
Verificador del programa eBPF: Verificador del programa BPF antes de cargar el bytecode XDP en el kernel Realice controles de seguridad en el código de bytes, como juzgar si hay un bucle, si la longitud del programa excede el límite, si el acceso a la memoria del programa está fuera de los límites y si el programa contiene instrucciones inalcanzables. El código se analiza estáticamente antes de que el programa se cargue en el kernel para garantizar que el código se bloquee o dañe el kernel en ejecución.

4. Ventajas de XDP

Las ventajas de XDP son las siguientes:
(1) XDP está integrado con la pila de protocolos de red del kernel de Linux, el kernel aún tiene la capacidad de controlar el hardware de red, conserva la seguridad proporcionada por el kernel y las herramientas de administración de configuración de red existentes se pueden usar directamente.
(2) Cualquier tarjeta de red con controlador Linux puede usar XDP, solo es necesario actualizar el controlador de la tarjeta de red para agregar el punto de enlace de ejecución XDP. DPDK requiere soporte de hardware especial.
(3) XDP puede usar selectivamente las funciones de la pila de protocolos de red del kernel, como la tabla de enrutamiento y la pila TCP. Esto puede acelerar los datos críticos de la red al tiempo que conserva la interfaz de configuración existente
(4) al interactuar con programas basados ​​en la pila de protocolos de red del kernel, sin volver a inyectar paquetes de datos de red desde el espacio del usuario al espacio del kernel.
(5) Es transparente para las aplicaciones que se ejecutan en el host.
(6) Admite la reprogramación dinámica sin interrupción del servicio y la actualización en caliente de los programas XDP sin interrupción de la red.
(7) No se necesita un núcleo de CPU dedicado para el procesamiento de paquetes. El bajo tráfico corresponde a un bajo uso de la CPU, que es en consecuencia más eficiente y ahorra energía.

5. Escenarios de uso de XDP

Los escenarios de uso de XDP incluyen lo siguiente:
(1) Defensa DDoS
(2) Cortafuegos
(3) Equilibrio de carga basado en XDP_TX
(4) Estadísticas de red
(5) Muestreo de red complejo
(6) Plataforma comercial de alta velocidad

五 、 Llamarada solar

1. Introducción a Solarflare

La tarjeta de red Solarflare admite el acelerador de tarjetas de red OpenOnload, y su esquema de implementación Kernel Bypass es el siguiente: implemente la pila de protocolos de red en el espacio del usuario y use LD_PRELOAD para cubrir las llamadas al sistema de red del programa de destino, y confíe en la biblioteca EF_VI cuando acceda a la tarjeta de red en la parte inferior.
La tarjeta de red Solarflare proporciona una solución de implementación de omisión del kernel de tres niveles. Onload no requiere que los usuarios cambien el código. Después de instalar el controlador de la tarjeta de red, el programa se puede iniciar con la biblioteca onload, que es simple y fácil de usar; tcpdirect es más rápido que onload, pero requiere que los usuarios modifiquen el código; ef_vi omitirá todas las pilas de protocolos y leerá directamente una cola RX específica de la tarjeta de red.
Los productos Solarflare han ocupado el 90% del mercado de hardware de negociación de acciones y futuros de alta frecuencia con características de alto rendimiento y baja latencia. La tarjeta de red de fibra óptica Solarflare X2522 plus de baja latencia se utiliza ampliamente en la negociación de alta frecuencia de valores financieros y futuros, con un precio de más de 20.000 RMB. Actualmente, los últimos productos de Solarflare son las tarjetas de red de latencia ultrabaja X2552, X2541 y X2562.

2 、 carga

Onload es la pila de protocolos de red de derivación de kernel más clásica de Solarflare. Es una derivación de kernel transparente y proporciona una interfaz compatible con la programación de red de socket. Los usuarios no necesitan modificar su propio código, solo precargar libonload.so antes de que se inicie el programa.

3 、 ef_vi

ef_vi es una API de nivel 2 de bajo nivel que puede enviar y recibir tramas de Ethernet sin procesar, pero no admite protocolos de nivel superior. La característica más importante de ef_vi es la copia cero: los usuarios deben preasignar algunos búferes de recepción para que los use ef_vi. Una vez que la tarjeta de red recibe el paquete, escribirá directamente el búfer y el usuario puede comenzar a procesar los datos recibidos obteniendo la identificación del búfer de los datos completados a través de la interfaz de encuesta eventq Y devuelva el búfer a ef_vi para reciclarlo después del procesamiento.
La API ef_vi es más complicada de usar y carece de soporte de protocolo de capa superior, pero puede proporcionar el mejor rendimiento.

4 、 tcpdirect

tcpdirect implementa la pila de protocolos de red de capa superior basada en ef_vi y proporciona una API tipo socket: zocket, que permite a los usuarios leer y escribir datos de carga útil tcp / udp, y también hereda las características de ef_vi zero-copy. tcpdirect requiere el uso de páginas enormes.

Supongo que te gusta

Origin blog.51cto.com/9291927/2594168
Recomendado
Clasificación