Modelo de E / S de subproceso de Redis

antecedentes

  • Redis es de un solo subproceso. ¿Por qué redis usa un solo subproceso en lugar de múltiples subprocesos?
  • Redis almacena datos en función de la memoria, por lo que la CPU no es el cuello de botella de redis.
  • ¿Por qué generalmente usamos subprocesos múltiples? El procesamiento concurrente mejora la eficiencia del procesamiento. Y nuestro sistema generalmente necesita realizar IO para leer los datos almacenados en el disco (base de datos, archivo local, etc.) antes de procesarlos, por lo que un solo subproceso es extremadamente fácil de bloquear, lo que dará como resultado un bajo rendimiento del servicio.
  • Pero Redis no. Redis se basa en la memoria y todas las operaciones son operaciones a nivel de memoria. Ahora que estamos aquí, ¿no sería más rápido abrir un multihilo? ? ? ? La existencia de subprocesos múltiples también tiene sus problemas, pero redis tiene una compensación entre el uso de subprocesos múltiples y de un solo subproceso. Al final, el subproceso único es una buena opción (comprensión personal)
  • Problemas causados ​​por subprocesos múltiples:
    1. Código complejo
    2. Problemas de seguridad de simultaneidad
    3. Problemas de rendimiento del cambio de hilo de contexto, etc.
  • Dado que redis usa un solo hilo, ¿cómo maximiza el rendimiento de un solo hilo? Entonces, ¿tenemos que ver cómo está diseñado el modelo IO roscado de redis?

Modelo de E / S de hilo Redis

E / S sin bloqueo

Proceso IO

  1. Cuando el cliente inicia un enlace de E / S al servidor, entonces el servidor iniciará un hilo para monitorear si hay un archivo entrante, si está bloqueando IO, siempre bloqueará donde no regresará hasta que haya datos Entra, y la E / S sin bloqueo que dijimos volverá directamente, y luego este hilo puede hacer otras cosas. Pero la E / S sin bloqueo tiene un problema obvio: ¿no sabe cuándo habrá datos y cuándo volverán los datos? Lo que quiero hacer es hacer un entrenamiento de rotación larga.Si hay millones de clientes, la CPU de redis se puede considerar como un cuello de botella y un entrenamiento de rotación vacío (lo que resulta en un rendimiento inútil).

Multiplexación IO

  1. La API de sondeo de eventos se utiliza para resolver este problema. La API de sondeo de eventos más simple es la función de selección, que es la API proporcionada por el sistema operativo al programa de usuario. La entrada es la lista de descriptores de lectura y escritura read_fds & write_fds, y la salida son los eventos de lectura y escritura correspondientes. Al mismo tiempo, también proporciona un parámetro de tiempo de espera.Si no se produce ningún evento, esperará como máximo el tiempo de espera y el hilo se bloqueará. Una vez que se produzca un evento durante el período, puede regresar de inmediato. Una vez transcurrido el tiempo, todavía no hay ningún evento y volverá inmediatamente. Después de obtener el evento, el hilo puede continuar procesando el evento correspondiente uno por uno. Después del procesamiento, continúe con la encuesta. Entonces, el hilo entra en un ciclo infinito. A este ciclo infinito lo llamamos ciclo de eventos, y un ciclo es un ciclo. Los diferentes sistemas operativos también tienen diferentes API de sondeo de eventos. El select () aquí también es una API de multiplexación relativamente primitiva, y las optimizaciones posteriores incluyen epollo y así sucesivamente. . . (Https://segmentfault.com/a/1190000003063859)
    Inserte la descripción de la imagen aquí

Cola de instrucciones

  1. Debido a que redis es de un solo subproceso, tiene una cola de instrucciones propia para almacenar todas las instrucciones del usuario, lo cual es una manera justa. El que viene primero.

Cola de respuesta

  1. Redis también asocia una cola de respuesta para cada socket de cliente. El servidor de Redis responde al cliente con el resultado de la instrucción a través de la cola de respuesta. Si la cola está vacía, significa que la conexión está inactiva temporalmente y no hay necesidad de obtener eventos de escritura, es decir, el descriptor de cliente actual se puede mover fuera de write_fds. Espere hasta que la cola tenga datos y luego coloque el descriptor en ella. Evite la llamada al sistema de selección para devolver el evento de escritura inmediatamente y resulta que no hay datos para escribir. Los subprocesos en esta situación elevarán la CPU.

para resumir

  • Redis es un modelo de subproceso multiplexado de E / S de un solo subproceso.
  • A través de la cola de instrucciones y la cola de respuestas, las instrucciones de redis se pueden ejecutar de manera ordenada.

referencia

  • "Redis Deep Adventure"

Supongo que te gusta

Origin blog.csdn.net/weixin_40413961/article/details/108457087
Recomendado
Clasificación