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 contraseñas enhebradas. Piense lighttpd o Zeus contra Apache o IIS. ¿Porqué es eso?¿Por qué las aplicaciones de red basadas en eventos son inherentemente más rápidas que las enrutadas?
Respuesta
Creo que la base de los sucesos no es la cuestión: es una solución de agrupación de subprocesos de E/S multiplataforma, no bloqueable, sockets seleccionables.
En el primer caso, usted está manejando todas las entradas que entran independientemente de lo que se está utilizando, por lo que no hay 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, usted 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 'escucha'. 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.
Google para IO no bloqueante para obtener más detalles, y también puede encontrar algunas comparaciones frente a grupos de subprocesos.
(si alguien puede aclarar estos puntos, se sienten libres)
No se trata de los hilos de verdad. 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 apache MPM event.
Realmente depende de lo que esté 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 eventos suele ser bastante complicado: las aplicaciones con subprocesos son mucho más fáciles de escribir. Este puede ser el factor decisivo en lugar del rendimiento.
Las aplicaciones controladas por eventos son no intrínsecamente más rápidas.
De Why Events Are a Bad Idea (for High-Concurrency Servers):
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 enhebrar el sistema operativo moderno 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 multitarea preventiva adecuada y sin la ventaja de una conmutación 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 lenguaje los tiene, los cierres alivian este dolor significativamente. Intentar hacer esto en C es mucho menos divertido.)
Esto también significa que usted gana todas las advertencias que la multitarea cooperativa implica.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, hay un montón de errores que puede hacer con hilos, así concurrencia es todavía difícil..)
Un par de preguntas importantes para el autor de una nueva aplicación de servidor:
- ¿Cómo hilos realizan en las plataformas que pretendes apoyar hoy? ¿Van a ser tu cuello de botella?
- Si todavía está atascado con una mala implementación de hilo: ¿por qué nadie está solucionando esto?
- 1. ¿Las aplicaciones basadas en XAML de Windows 8 son notablemente más rápidas que las de HTML/CSS?
- 2. ¿Por qué las máquinas virtuales basadas en registro son mejores que las basadas en la pila?
- 3. ¿Por qué las matrices NumPy son tan rápidas?
- 4. ¿Son las estructuras "más rápidas" que las clases, en general o en el marco .NET?
- 5. ¿Las cargas alineadas con palabras son más rápidas que las cargas desalineadas en los procesadores x64?
- 6. ¿Cómo comprueba una unidad las secciones de código que son procesales o basadas en eventos?
- 7. Para Android Eventos ¿por qué las declaraciones de cambio son más comunes que las cadenas de if-else?
- 8. ¿Cuál es la diferencia entre las aplicaciones basadas en ventanas y las aplicaciones basadas en vista?
- 9. ¿Las aplicaciones web son más portátiles que las aplicaciones de escritorio?
- 10. ¿Las pruebas basadas en datos son malas?
- 11. ¿Por qué las expresiones regulares compiladas de C# son más rápidas que los métodos de cadenas equivalentes?
- 12. ¿Por qué las operaciones LINQ pueden ser más rápidas que un bucle normal?
- 13. ¿Las entradas son siempre más rápidas que números/flotantes en AS3?
- 14. ¿Son las sesiones más rápidas que consultar la base de datos?
- 15. PLINQ inherentemente más rápido que System.Threading.Tasks.Parallel.ForEach
- 16. Delphi XE2: ¿Por qué las aplicaciones FireMonkey son HD?
- 17. ¿Cuáles son las aplicaciones del algoritmo de ruta más corta?
- 18. ¿Cuáles son los beneficios de tener eventos que se ajusten a las pautas de la red?
- 19. Utilice node.js para las actualizaciones basadas en eventos en Django?
- 20. ¿Las clases de ByteBuffer/IntBuffer/ShortBuffer Java son rápidas?
- 21. ¿Enumeración de colecciones que no son inherentemente IEnumerable?
- 22. ¿Cuáles son las aplicaciones prácticas de Colas?
- 23. ¿Qué son las cookies firmadas y por qué son útiles?
- 24. ¿Por qué las claves externas son más utilizadas en teoría que en la práctica?
- 25. ¿Son posibles las matrices basadas en la pila en C#?
- 26. ¿Las vistas basadas en clases son ampliamente utilizadas por la comunidad de Django?
- 27. Por qué las propiedades no son declarables en las interfaces
- 28. ¿Cómo identifica Windows las aplicaciones que no son Unicode?
- 29. ¿No deberían las declaraciones preparadas ser mucho más rápidas?
- 30. ¿Los lenguajes funcionales son inherentemente más paralelos que sus OO o primos imperativos?
Gracias por la respuesta. – dowski