multithreading - significa - sd wan fortinet
¿Por qué las aplicaciones de red basadas en eventos son inherentemente más rápidas que las enrutadas? (4)
Todos hemos leído los puntos de referencia y conocemos los hechos: los servidores de red asincrónicos basados en eventos son más rápidos que sus homólogos enhebrados. Piense lighttpd o Zeus contra Apache o IIS. ¿Porqué es eso?
No se trata de los hilos realmente. Se trata de la forma en que los hilos se utilizan para atender las solicitudes. Para algo como lighttpd tienes un único hilo que da servicio a múltiples conexiones a través de eventos. Para las versiones anteriores de apache, usted tenía un proceso por conexión y el proceso despertaba con los datos entrantes, por lo que terminaba con un número muy grande cuando había muchas solicitudes. Ahora, sin embargo, con MPM apache también se basa en eventos, vea el evento apache MPM .
Realmente depende de lo que estés haciendo; la programación basada en eventos es ciertamente complicada para aplicaciones no triviales. Ser un servidor web es realmente un problema muy trivial bien entendido y tanto los modelos basados en eventos como los enrutados funcionan bastante bien en sistemas operativos modernos.
El desarrollo correcto de aplicaciones de servidor más complejas en un modelo de evento generalmente es bastante complicado: las aplicaciones con subprocesos son mucho más fáciles de escribir. Este puede ser el factor decisivo en lugar del rendimiento.
Creo que la pregunta no es la basada en eventos versus la basada en hilos: es una solución de agrupación de subprocesos de E / S multiplexadas, no bloqueable, sin bloqueos.
En el primer caso, usted está manejando todas las entradas que ingresan, independientemente de lo que lo esté usando, para que no haya bloqueo en las lecturas, un solo "oyente". El subproceso único de escucha transfiere datos a lo que pueden ser subprocesos de trabajo de diferentes tipos, en lugar de uno para cada conexión. Una vez más, no hay bloqueo al escribir ninguno de los datos, por lo que el manejador de datos solo puede ejecutarlo por separado. Debido a que esta solución es en su mayoría IO de lectura / escritura, no ocupa mucho tiempo de CPU, por lo que su aplicación puede tomar eso para hacer lo que quiera.
En una solución de grupo de subprocesos, tiene subprocesos individuales que manejan cada conexión, por lo que tienen que compartir el tiempo para el cambio de contexto dentro y fuera de cada uno ''escuchando''. En esta solución, las operaciones CPU + IO están en el mismo subproceso, que obtiene un intervalo de tiempo, por lo que terminas esperando en operaciones IO para completar por subproceso (bloqueo) que tradicionalmente se podía hacer sin utilizar el tiempo de CPU.
Busque en Google IO no bloqueante para obtener más detalles, y también puede encontrar algunas comparaciones frente a grupos de hilos.
(Si alguien puede aclarar estos puntos, siéntete libre)
Las aplicaciones impulsadas por eventos no son intrínsecamente más rápidas.
De por qué los eventos son una mala idea (para servidores de alta concurrencia) :
We examine the claimed strengths of events over threads and show that the
weaknesses of threads are artifacts of specific threading implementations
and not inherent to the threading paradigm. As evidence, we present a
user-level thread package that scales to 100,000 threads and achieves
excellent performance in a web server.
Esto fue en 2003. Sin duda, el estado de la conexión en sistemas operativos modernos ha mejorado desde entonces.
Escribir el núcleo de un servidor basado en eventos significa reinventar la multitarea cooperativa (estilo Windows 3.1) en su código, muy probablemente en un sistema operativo que ya admite la multitarea preventiva adecuada, y sin la ventaja del cambio de contexto transparente. Esto significa que debe administrar el estado en el montón que normalmente estaría implícito en el puntero de instrucción o almacenado en una variable de pila. (Si su idioma los tiene, los cierres alivian este dolor significativamente. Intentar hacer esto en C es mucho menos divertido.)
Esto también significa que obtienes todas las advertencias que implica la multitarea cooperativa. Si uno de sus controladores de eventos tarda un tiempo en ejecutarse por cualquier motivo, lo detiene. Las solicitudes totalmente no relacionadas demoran. Incluso las operaciones de CPU-invensive largas deben enviarse a otro lugar para evitar esto. Cuando habla del núcleo de un servidor de alta concurrencia, ''operación larga'' es un término relativo, del orden de microsegundos para un servidor que se espera maneje 100.000 solicitudes por segundo. Espero que el sistema de memoria virtual nunca tenga que sacar páginas del disco por ti.
Obtener un buen rendimiento de una arquitectura basada en eventos puede ser complicado, especialmente cuando se considera la latencia y no solo el rendimiento. (Por supuesto, también hay muchos errores que puedes cometer con los subprocesos. La simultaneidad sigue siendo difícil).
Un par de preguntas importantes para el autor de una nueva aplicación de servidor:
- ¿Cómo se desempeñan los hilos en las plataformas que intenta soportar hoy? ¿Van a ser tu cuello de botella?
- Si todavía estás atascado con una mala implementación de hilo: ¿por qué nadie está solucionando esto?