Análisis de la tecnología de copia cero [kafka se da cuenta de la base de rendimiento de un millón]

Familias, los puntos de conocimiento en este tema pueden hacer que pierdan algunos cabellos, para que entiendan lo más posible, echemos un vistazo a una castaña antes de entrar en el tema.

regalo para novia

Si, digo si, tienes novia (no te desanimes si no la tienes, después de leer detenidamente el artículo, puedes pedirle a la bloguera que te la consiga)

Se acerca el Día de San Valentín, quiere comprar un regalo para su novia en línea, pero parece poco sincero enviar un regalo listo para usar en línea. eso

Afectado por la epidemia, el mensajero no puede ingresar a la comunidad y usted no puede salir de la comunidad. El mensajero primero coloca el regalo en el punto de mensajería de la comunidad. Usted va al punto de mensajería para recogerlo, llevarlo a casa y hacerlo usted mismo. , y luego devuélvelo al punto de mensajería. Haz clic para obtener un regalo para enviar a la casa de tu novia.

Simplemente dibujé un diagrama de flujo
inserte la descripción de la imagen aquí
. Mirando este proceso, hay demasiados lugares irrazonables. El tiempo humano y la energía son valiosos y deben usarse para jugar, no para enviar/recibir entregas urgentes.

Después de unos años, la empresa de logística desarrolló un robot de entrega. A partir de ese momento, el hermano del mensajero ya no necesita entregar productos en la puerta, por lo que el proceso se ha convertido en
inserte la descripción de la imagen aquí
un robot de mensajería y el mensajero queda libre, pero aún debe ve al punto de mensajería para recoger los regalos. , Después del bricolaje, tienes que enviarlo de vuelta al punto expreso, lo que obviamente no es razonable. ¿No es bueno para mí jugar el mid-laner Yasuo en este momento?

Así que le haces una solicitud al dueño de la tienda de regalos: ¿puedes ayudarme con el bricolaje y luego enviarlo directamente a la casa de mi novia?

El jefe cree que tiene sentido y lanzó un nuevo servicio: los usuarios que necesitan bricolaje, solo necesitan anotar el pedido

Entonces, el proceso se convierte en cuando
inserte la descripción de la imagen aquí
haces un pedido, le pides a la tienda que te ayude con el bricolaje y lo envías directamente a la casa de tu novia. La novia recibió el expreso y se conmovió hasta las lágrimas.

Hasta ahora, sus dos viajes se han guardado.

mirar atrás

Desde la perspectiva de todo el proceso de entrega de regalos, al principio el servicio de mensajería necesitaba correr dos veces y tú también necesitabas correr dos veces, pero ahora solo el robot necesita correr dos veces.

En pocas palabras, cuatro ejecuciones se convirtieron en dos ejecuciones, y estas dos ejecuciones fueron completadas por robots, por lo que la cantidad de ejecuciones artificiales en todo el proceso cambió de 4 a 0. Llamaré a este proceso: Ejecución cero


ok, lo que debería venir todavía está aquí, el ejemplo anterior es solo para despertar su interés, para comprender la copia cero, ahora sustituimos la terminología en

  • tu casa ==> caché de aplicaciones
  • Express Point ==> Caché del kernel del sistema operativo
  • tienda insignia de durex ==> disco
  • Casa de la novia ==> disco o zócalo de destino

Por qué implementar copia cero

Antecedentes: las operaciones con archivos son operaciones peligrosas y es imposible que el sistema operativo otorgue permisos directamente a las aplicaciones o a los usuarios. Solo el kernel tiene permisos
. Cuando una aplicación opera un archivo, como copiar y transferir, necesita pasar por varias pasos:
copie el archivo del disco al El
kernel del sistema se copia del kernel del sistema al programa de aplicación
se copia del programa de aplicación al kernel del sistema se copia
del kernel del sistema a los consumidores como el disco y el zócalo

Dibuja un diagrama de flujo simple

Nota: El enfoque de este artículo es ayudarlo a comprender la copia cero. El conocimiento sobre el kernel del sistema operativo está demasiado fuera de tema, por lo que el diagrama de flujo es muy simple. Por ejemplo, "caché del kernel del sistema operativo" en realidad se puede subdividir en " PageCache" y "Socket buffer". ”, No dibujaré detalles como estos, y es complicado dibujar un dolor de cabeza
, pero tenga la seguridad de que, aunque es simple, los puntos clave no se omiten y no afectará el comprensión de la copia cero en absoluto.

inserte la descripción de la imagen aquí
La CPU completa todos los pasos anteriores 1, 2, 3 y 4. Sabemos que la eficiencia informática de la CPU y el disco no son del mismo orden de magnitud.

Para el servidor los recursos de la CPU son muy escasos, estas cuatro operaciones de replicación han estado ocupando la CPU, lo que obviamente reducirá el rendimiento de todo el sistema.

Entonces, los grandes de la industria informática pensaron en una forma de agregar un componente a la placa base, llamado DMA (nombre completo Direct Memory Access Controller, controlador de acceso directo a la memoria ), que es una pieza de hardware físico, dedicada al disco para el replicación de datos de caché del kernel del sistema operativo entre

Entonces, el proceso se convierte en una
inserte la descripción de la imagen aquí
explicación de palabra roja: casi todas las tarjetas de red actuales admiten la tecnología SG-DMA (Acceso directo a memoria Scatter-Gather) (puede usar el comando ethtool -k eth0 | grep scatter-gather para verificar si es compatible) , puedes entender este punto. , no es necesario realizar una investigación en profundidad, ya es un punto de conocimiento en el campo del desarrollo integrado, no necesitamos dedicarle demasiado tiempo.

Si está un poco confundido ahora, no importa, solo necesita recordar que con DMA, la CPU ya no participa en todo el proceso de copia o transferencia de datos, y solo necesita enviar instrucciones a DMA para decirle cuál el archivo debe copiarse o transferirse, y notificar a la CPU después de que el DMA complete la operación de datos


Hablemos de DMA. La implementación de DMA depende del sistema operativo y el hardware:

En términos de sistema operativo , os proporciona la función sendfile(),
inserte la descripción de la imagen aquí
que recibe cuatro parámetros: descriptor de archivo del lado de destino, descriptor de archivo del lado de origen, desplazamiento y longitud de datos

No necesitamos estudiar cómo llamar a esta función, porque Java ya ha hecho la encapsulación por nosotros.
inserte la descripción de la imagen aquí
No necesita preocuparse en qué clase se encuentra este método ahora, escribiré una demostración de código más adelante.

Por qué kafka puede lograr un rendimiento de un millón de niveles depende del modelo de copia cero. Si observa el código fuente de kafka detenidamente, encontrará que finalmente llama al método transferTo()

En términos de hardware , los componentes DMAC se agregan a la placa base. De hecho, no es solo la placa base, sino que la computadora se ha desarrollado hasta el día de hoy, y casi todos los lugares que involucran operaciones io tienen DMAC integrado.

Hasta aquí podemos hacer un breve resumen: la llamada tecnología zero-copy puede entenderse en realidad como una combinación de software, hardware y lenguaje, cuyo objetivo es reducir el tiempo de espera de la CPU y mejorar la eficiencia de transmisión de datos.


Hablar es fácil. Enséñame el código

Tomemos como ejemplo la copia de archivos para probar la mejora del rendimiento que ofrece el modelo de copia cero.

Cree un nuevo archivo de prueba de
inserte la descripción de la imagen aquí
600 MB
inserte la descripción de la imagen aquí
y pruebe primero con la copia tradicional de io (el código está al final)
inserte la descripción de la imagen aquí

600 MB tomaron 800 ms, que ya es muy rápido en io Si usa io normal sin búfer, el tiempo debe aumentarse unas 3 veces.

Echemos un vistazo a la copia cero nio
inserte la descripción de la imagen aquí

Aproximadamente 300 ms, que es más del doble en comparación con io. No se ve bien. Si piensa en escenarios de alta concurrencia, hay decenas de miles de operaciones similares en cada turno. El tiempo ahorrado es suficiente para que la Parte A se entusiasme con golpea la silla de ruedas.

Código:

public class ZeroCopyTest {
    
    
    public static void main(String[] args) throws IOException, InterruptedException {
    
    
        long start = System.currentTimeMillis();
        File source = new File("D:/fileTest/copy.txt");
        File target = new File("D:/fileTest/copy2.txt");

        ioCopy(source, target);
//        ioCopyWithBuffer(source, target);
//        nioCopy(source, target);
        System.out.println(System.currentTimeMillis() - start);
        Thread.sleep(200);
        target.delete();
    }

    public static void ioCopy(File source, File target) throws IOException {
    
    
        try (InputStream is = new FileInputStream(source);
             OutputStream os = new FileOutputStream(target)) {
    
    
            byte[] buffer = new byte[1024];
            int length;
            while ((length = is.read(buffer)) > 0) {
    
    
                os.write(buffer, 0, length);
            }
        }
    }

    public static void ioCopyWithBuffer(File source, File target) throws IOException {
    
    
        try (InputStream is = new BufferedInputStream(new FileInputStream(source));
             OutputStream os = new BufferedOutputStream(new FileOutputStream(target))) {
    
    
            byte[] buffer = new byte[1024];
            int length;
            while ((length = is.read(buffer)) > 0) {
    
    
                os.write(buffer, 0, length);
            }
        }
    }

    public static void nioCopy(File source, File target) throws IOException {
    
    
        try (FileChannel sourceChannel = new FileInputStream(source).getChannel();
             FileChannel targetChannel = new FileOutputStream(target).getChannel()) {
    
    
            for (long count = sourceChannel.size(); count > 0; ) {
    
    
                long transferred = sourceChannel.transferTo(sourceChannel.position(), count, targetChannel);
                sourceChannel.position(sourceChannel.position() + transferred);
                count -= transferred;
            }
        }
    }
}

Los dos pelos se han ido otra vez, oh oh oh ~


La novia principal mencionada anteriormente es en realidad una mentira para ti.
inserte la descripción de la imagen aquí


Ok. Ya terminé

Supongo que te gusta

Origin blog.csdn.net/qq_33709582/article/details/123043821
Recomendado
Clasificación