Pregunta

Tornadoweb y Nginx son servidores web populares por el momento y muchas evaluaciones de evaluación comparativa muestran que tienen un mejor rendimiento que Apache en ciertas circunstancias. Entonces mi pregunta es:

¿Es 'Epoll' la razón más esencial que los hace tan rápido? ¿Y qué puedo aprender de eso si quiero escribir un buen servidor de socket?

¿Fue útil?

Solución

Si está buscando escribir un servidor Socket, un buen punto de partida es el artículo C10K de Dan Kegel desde hace unos años:

http://www.kegel.com/c10k.html

También encontré que la guía de Beej para la programación de redes es bastante útil:

http://beej.us/guide/bgnet/

Finalmente, si necesita una gran referencia, hay una programación de red Unix de W. Richard Stevens et. Alabama.:

http://www.amazon.com/unix-network-programming-sockets-networking/dp/0131411551/ref=dp_ob_title_bk

De todos modos, para responder a su pregunta, la principal diferencia entre Apache y Nginx es que Apache usa un hilo por cliente con E/S de bloqueo, mientras que NGINX es de un solo hilo con E/S sin bloqueo. El grupo de trabajadores de Apache reduce la sobrecarga de los procesos de inicio y de desestimación, pero aún así hace que el interruptor de la CPU entre varios hilos al servir a varios clientes. Nginx, por otro lado, maneja todas las solicitudes en un hilo. Cuando una solicitud necesita hacer una solicitud de red (por ejemplo, a un backend), Nginx adjunta una devolución de llamada a la solicitud de backend y luego trabaja en otra solicitud de cliente activo. En la práctica, esto significa que vuelve al bucle de eventos (epoll, kqueue, o select) y solicita descriptores de archivos que tengan algo que informar. Tenga en cuenta que la llamada del sistema en el bucle del evento principal es en realidad una operación de bloqueo, porque no hay nada que hacer hasta que uno de los descriptores de archivos esté listo para leer o escribir.

Entonces, esa es la razón principal por la que Nginx y Tornado son eficientes para servir a muchos clientes simultáneos: solo hay un proceso (así guardando RAM) y solo un hilo (ahorrando así la CPU de los interruptores de contexto). En cuanto a Epoll, es solo una versión más eficiente de Select. Si hay n descriptores de archivos abiertos (enchufes), le permite elegir los que están listos para leer en o (1) en lugar de o (n) tiempo. De hecho, NGINX puede usar seleccionar en lugar de Epoll si lo compila con el --with-select_module Opción, y apuesto a que seguirá siendo más eficiente que Apache. No estoy tan familiarizado con Apache -Internals, pero un GREP rápido muestra que usa Select y Epoll, probablemente cuando el servidor está escuchando múltiples puertos/interfaces, o si hace solicitudes de backend simultáneas para un solo cliente.

Por cierto, comencé con estas cosas tratando de escribir un servidor de socket básico y quería descubrir cómo Nginx era tan eficiente. Después de analizar el código fuente de Nginx y leer esas guías/libros con los que vinculé anteriormente, descubrí que sería más fácil escribir módulos NGINX en lugar de mi propio servidor. Así nació la Guía de Emiller ahora semi-legendaria para el desarrollo del módulo Nginx:

http://www.evanmiller.org/nginx-modules-guide.html

(Advertencia: la guía fue escrita contra Nginx 0.5-0.6 y las API pueden haber cambiado). Si está haciendo algo con HTTP, diría que le dará una oportunidad a Nginx porque ha funcionado todos los detalles peludos de tratar con clientes estúpidos. Por ejemplo, el pequeño servidor de socket que escribí para diversión funcionó muy bien con todos los clientes, excepto Safari, y nunca descubrí por qué. Incluso para otros protocolos, Nginx podría ser el camino correcto; El evento está bastante bien abstraído de los protocolos, por lo que puede proxy HTTP e IMAP. La base del código NGINX está extremadamente bien organizada y está muy bien escrita, con una excepción que lleva la mención. No seguiría su liderazgo cuando se trata de un analizador de protocolo a mano; En su lugar, use un generador de analizador. He escrito algunas cosas sobre el uso de un generador de analizador (ragel) con Nginx aquí:

http://www.evanmiller.org/nginx-modules-guide-advanced.html#parsing

Todo esto probablemente era más información de la que deseaba, pero espero que encuentre algo útil.

Otros consejos

Si y no. Si bien ambos usan Epoll, es técnicamente que ambos usan un bucle de eventos para manejar las solicitudes. Puede encontrar más información sobre qué bucles de eventos son y cómo se usan en Wikipedia.

Verificar libevento (usado por gevente, generalmente más rápido y más estable que el tornado) o Libev para implementaciones.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top