La Red de Conocimientos Pedagógicos - Currículum vitae - Mmap es fácil de entender

Mmap es fácil de entender

Antes de empezar a hablar de copia cero, primero debemos tener un concepto del método IO tradicional.

Basado en el método IO tradicional, la capa inferior en realidad se implementa llamando a read() y write().

Lea los datos del disco duro al búfer del kernel mediante read (), luego cópielos en el búfer del usuario, luego escríbalos en el búfer del socket mediante write () y finalmente escríbalos en el; dispositivo de tarjeta de red.

Todo el proceso involucró 4 cambios de contexto y 4 copias del modo de usuario y el modo kernel. El proceso específico es el siguiente:

Luego, el modo de usuario y el modo kernel mencionados aquí se refieren. ¿A qué? ¿Qué es el cambio de contexto?

En pocas palabras, el espacio del usuario se refiere al espacio de ejecución del proceso del usuario y el espacio del kernel se refiere al espacio de ejecución del kernel.

Si el proceso se ejecuta en el espacio del kernel, es el modo kernel, y si se ejecuta en el espacio del usuario, es el modo usuario.

Por razones de seguridad, están aislados entre sí y el cambio de contexto entre el modo de usuario y el modo kernel también lleva mucho tiempo.

De lo anterior podemos ver que un proceso IO simple produce 4 cambios de contexto, lo que sin duda tendrá un mayor impacto en el rendimiento en escenarios de alta concurrencia.

Entonces, ¿qué es la copia DMA?

Porque para una operación de IO, la CPU la completa emitiendo las instrucciones correspondientes, pero en comparación con la CPU, la velocidad de IO es demasiado lenta y la CPU pasa mucho tiempo esperando IO.

Por lo tanto, nació la tecnología de acceso directo a la memoria DMA (Direct Memory Access). Esencialmente, es un chip independiente en la placa base, que transmite datos entre la memoria y los dispositivos IO, reduciendo así el tiempo de espera. .

Pero no importa quién haga la copia, la copia frecuente requiere mucho tiempo y tiene un impacto en el rendimiento.

Entonces, para la copia cero, en realidad no es un proceso sin copia de datos, simplemente reduce la cantidad de cambios entre el modo de usuario y el modo kernel y la cantidad de copias de CPU.

Aquí, solo hablaremos de varias tecnologías comunes de copia cero de manera específica.

En pocas palabras, mmap+write usa mmap para reemplazar la operación de lectura en lectura+escritura, lo que reduce la copia de la CPU.

El principal método de implementación de mmap es asignar la dirección del búfer de lectura y la dirección del búfer del usuario. El búfer del kernel y el búfer de la aplicación se comparten, lo que reduce la necesidad de datos del búfer de lectura. al búfer del usuario.

Todo el proceso ocurrió 4 cambios de contexto entre el modo de usuario y el modo kernel y 3 copias. El proceso específico es el siguiente:

El método mmap guarda una copia de la CPU al mismo tiempo. Debido al proceso del usuario, la memoria es virtual y solo está asignada al búfer de lectura del kernel, por lo que puede ahorrar la mitad del espacio de memoria y es más adecuada para la transmisión de archivos grandes.

En comparación con mmap, sendfile también reduce una copia de CPU y dos cambios de contexto.

sendfile es una función de llamada al sistema introducida después de la versión del kernel de Linux 2.1. Al utilizar sendfile, los datos se pueden transmitir directamente en el espacio del kernel, evitando así la copia del espacio del usuario y del kernel. debido al uso de sendfile en lugar de lectura+escritura, se elimina, ahorrando así una llamada al sistema, que son dos cambios de contexto.

Todo el proceso ocurrió 2 cambios de contexto entre el modo de usuario y el modo kernel y 3 copias. El proceso específico es el siguiente:

Los datos IO del método sendfile son completamente invisibles para el. espacio de usuario, por lo que solo se puede aplicar a situaciones que no requieren ningún procesamiento de espacio de usuario, como servidores de archivos estáticos.

Después de la versión del kernel Linux 2.4, sendfile se ha optimizado aún más mediante la introducción de nuevo soporte de hardware. Este método se llama función DMA Scatter/Gather scatter/gather.

Registra la información de descripción de datos en el búfer de lectura: la dirección de memoria y el desplazamiento en el búfer del socket, y DMA copia los datos del búfer de lectura a la tarjeta de red en función de estos, lo cual se reduce en comparación con la versión anterior El proceso de una copia de CPU

Todo el proceso ocurrió 2 cambios de contexto entre el modo de usuario y el modo kernel y 2 copias. Lo más importante es que no hay ninguna copia de CPU. El proceso es el siguiente:

Al igual que sendfile, los datos recopilados por DMA son invisibles para el espacio del usuario y requieren soporte de hardware. Al mismo tiempo, el descriptor del archivo de entrada solo puede ser un archivo, pero no hay un proceso de copia de la CPU. en absoluto, lo que mejora enormemente el rendimiento.

Con respecto a los dos escenarios mencionados al principio del artículo: RocketMQ y Kafka utilizan tecnología de copia cero.

Para MQ, no es más que el productor que envía datos a MQ y los conserva en el disco, y luego el consumidor lee los datos de MQ.

Para RocketMQ, estos dos pasos usan mmap+write, mientras que Kafka usa mmap+write para conservar datos y enviar datos usando sendfile.