Red de conocimiento informático - Problemas con los teléfonos móviles - Copia cero en RocketMq

Copia cero en RocketMq

Antes de hablar de copia cero, primero comprendamos el proceso de transferencia de datos de archivos desde el servidor al cliente a través de la red. Como servidor de aplicaciones, se lee una gran cantidad de datos del disco y luego la aplicación procesa los datos cargados en la memoria y los envía al cliente a través de la tarjeta de red. El procesamiento de datos tradicional se logra mediante las dos funciones siguientes: <. /p>

En este proceso, el flujo de datos es aproximadamente el siguiente:

Se puede ver que en este proceso se produjeron dos copias de CPU, dos copias de DMA y una copia cero. Esta es una operación muy frecuente para el servidor de aplicaciones y, por tanto, muy costosa.

Por lo tanto, la llamada copia cero significa eliminar dos copias de la CPU, porque los datos de las dos copias de la CPU ya están en la memoria y no es necesario que la CPU participe en la copia de los datos. lo que desperdiciará la CPU. En el caso de grandes cantidades de lectura y escritura de archivos, esta optimización puede aportar beneficios considerables.

Hay dos formas de implementar la copia cero:

mmap utiliza el mapeo de memoria virtual, lo que permite que múltiples direcciones virtuales apunten a la misma dirección de memoria física y permite la virtualización en el espacio del usuario y en el espacio del kernel. La dirección apunta a la misma dirección de memoria física, lo que permite que el espacio del usuario y el espacio del kernel compartan los mismos datos de memoria. De esta manera, los datos cargados por el motor DMA desde el disco no necesitan copiarse en el espacio del kernel ni en el espacio del usuario, lo que reduce una copia de la CPU.

sendfile se llama a través del sistema y estipula que el descriptor de archivo in_fd debe habilitar mmap. sendfile solo puede enviar datos de archivos al socket. sendfile reduce un cambio de estado de la CPU.

Ya sea. mmap combinado con el método de escritura o el método de envío de archivos mmap combinado con el método de escritura y el método de envío de archivos solo reduce una copia de la CPU, y luego el motor DMA también tiene una función de recopilación que puede evitar la copia de la CPU al enviar el búfer del kernel al búfer del socket. dirección del búfer y longitud de los datos al búfer del socket, y luego el motor DMA lee directamente los datos en la colección y los envía a la tarjeta de red a través de la función de recopilación. Esto se basa en que la función de recopilación del motor DMA omite la última copia de la CPU, que es una verdadera copia cero.

La llamada copia cero es para evitar copiar datos entre el búfer de espacio del kernel y el búfer de espacio del usuario, evitando así dos copias de la CPU y liberando la CPU.

RocketMq usa mmap() combinado con el método write() para lograr una copia cero.

La transferencia de datos desde un descriptor de archivo a un socket también se puede implementar en Java a través de FileChannel.transferTo(), que es compatible con la llamada al sistema sendfile.