linux networking network-programming operating-system zero-copy

linux - "Red de copia cero" vs "omisión de kernel"?



networking network-programming (4)

¿Cuál es la diferencia entre "red de copia cero" y "puente de kernel"? ¿Son dos frases que significan lo mismo o diferentes? ¿El núcleo omite una técnica utilizada en "creación de redes de copia cero" y esta es la relación?

TL; DR: son conceptos diferentes, pero es bastante probable que la copia cero sea compatible con kernel bypass API / framework.

Bypass de usuario

Este modo de comunicación también debe ser considerado. Posiblemente sea posible para las transacciones de DMA a DMA que no involucran a la CPU en absoluto. La idea es usar splice() o funciones similares para evitar el espacio del usuario . Tenga en cuenta que con splice() , toda la secuencia de datos no necesita omitir el espacio de usuario. Los encabezados se pueden leer en el espacio del usuario y los datos se transmiten directamente al disco. La caída más común de esto es el splice() no hace la descarga de suma de comprobación.

Copia cero

El concepto de cero copia es solo que los búferes de red están fijos en su lugar y no se mueven. En muchos casos, esto no es realmente beneficioso. La mayoría del hardware de red moderno admite recopilación de dispersión , también conocida como descriptores de memoria intermedia , etc. La idea es que el hardware de red comprenda los indicadores físicos. El descriptor de búfer típicamente consiste en,

  1. Puntero de datos
  2. Longitud
  3. Siguiente descriptor de búfer

El beneficio es que los encabezados de red no necesitan existir uno al lado del otro y los encabezados de IP , TCP y Aplicación pueden residir físicamente separados de los datos de la aplicación .

Si un controlador no es compatible con esto, los encabezados TCP / IP deben preceder a los datos del usuario para que se puedan completar antes de enviarlos al controlador de red .

La copia cero también implica cierta configuración de MMU del usuario del kernel para que las páginas se compartan.

Kernel Bypass

Por supuesto, puedes omitir el kernel. Esto es lo que pcap y otro software sniffer han estado haciendo durante algún tiempo. Sin embargo, es difícil ver un caso en el que el espacio del usuario tenga una victoria definitiva a menos que esté vinculado al hardware en particular. Algunos controladores de red pueden tener acumulación de dispersión admitida en el controlador y otros no.

Hay varias encarnaciones de interfaces de kernel para lograr el by-pass del kernel.

Para armar esto ...

¿Son dos frases que significan lo mismo o diferentes?

Son diferentes como se explica arriba.

¿El núcleo omite una técnica utilizada en "creación de redes de copia cero" y esta es la relación?

Es lo opuesto. Kernel bypass puede usar cero copias y lo más probable es que lo soporte, ya que los búferes están completamente bajo control de la aplicación. Además, no hay intercambio de memoria entre el kernel y el espacio de usuario (lo que significa que no es necesario tener páginas compartidas de MMU ni los efectos de caché / TLB que puedan causar). Por lo tanto, si está utilizando la omisión de núcleo , a menudo será ventajoso admitir copia cero ; entonces las cosas pueden parecer lo mismo al principio.

Si DMA scatter-gather está disponible (la mayoría de los controladores modernos), ya sea el espacio de usuario o el kernel puede usarlo. la copia cero no es tan útil en este caso.

Referencia:

¿Cuál es la diferencia entre "red de copia cero" y "puente de kernel"? ¿Son dos frases que significan lo mismo o diferentes? ¿El núcleo omite una técnica utilizada en "creación de redes de copia cero" y esta es la relación?


CERO-COPIA:

Al transmitir y recibir paquetes, todos los datos del paquete deben copiarse de los búferes del espacio del usuario a los búferes del espacio del núcleo para la transmisión y viceversa para la recepción. Un controlador de copia cero evita esto al tener espacio de usuario y el controlador comparte la memoria del búfer de paquetes directamente.

En lugar de tener el punto de transmisión y recepción en búferes en el espacio del kernel que luego requerirá copiar, se asigna una región de memoria en el espacio de usuario, y se mapea a una región dada de la memoria física, para compartir memoria entre los búferes del núcleo y el búferes de espacio de usuario, luego apunte cada búfer de descriptor a su lugar correspondiente en la memoria recién asignada.


Otros ejemplos de derivación de kernel y copia cero son DPDK y RDMA. Cuando una aplicación utiliza DPDK está pasando por alto la pila kernel TCP / IP. La aplicación está creando las tramas Ethernet y la NIC capturando esas tramas con DMA directamente de la memoria de espacio del usuario, por lo que es cero copia porque no hay copia del espacio de usuario al espacio del núcleo. Las aplicaciones pueden hacer cosas similares con RDMA. La aplicación escribe en los pares de cola que el NIC accede y transmite directamente. RDMA iblibverbs también se usa dentro del kernel, por lo que cuando iSER utiliza RDMA, no es un bypass de Kernel, sino cero.

http://dpdk.org/

https://www.openfabrics.org/index.php/openfabrics-software.html


Red de copia cero

Está haciendo una red de copia cero cuando nunca copia los datos entre el espacio de usuario y el espacio del núcleo (me refiero a espacio de memoria). Por ejemplo:

recv(fd, buffer, BUFFER_SIZE, 0); lenguaje C recv(fd, buffer, BUFFER_SIZE, 0);

Por defecto, los datos se copian:

  1. El núcleo obtiene los datos de la pila de red
  2. El núcleo copia estos datos en el buffer , que está en el espacio de usuario.

Con el método de copia cero, los datos no se copian y llegan al espacio del usuario directamente desde la pila de la red.

Kernel Bypass

La derivación del kernel es cuando se administra usted mismo, en el espacio de usuario, la pila de red y cosas de hardware. Es difícil, pero obtendrá un gran rendimiento (no hay copia, ya que todos los datos están en el espacio de usuario). Este link podría ser interesante si quieres más información.