apache - que - nginx tutorial
¿Es ''epoll'' la razón esencial por la que Tornadoweb(o Nginx) es tan rápido? (2)
Si está buscando escribir un servidor de socket, un buen punto de partida es el artículo C10k de Dan Kegel de hace unos años:
http://www.kegel.com/c10k.html
También encontré la Guía de la programación en red de Beej para ser bastante útil:
Finalmente, si necesita una gran referencia, hay Programación de Red UNIX por 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 utiliza un hilo por cliente con E / S de bloqueo, mientras que Nginx tiene un solo subproceso con E / S sin bloqueo. El grupo de trabajadores de Apache reduce la sobrecarga de los procesos de inicio y desestresteo, pero aún hace que la CPU cambie entre varios subprocesos al servir a varios clientes. Nginx, por otro lado, maneja todas las solicitudes en un hilo. Cuando una solicitud necesita realizar una solicitud de red (por ejemplo, a un servidor), Nginx adjunta una devolución de llamada a la solicitud de back-end y luego trabaja en otra solicitud de cliente activo. En la práctica, esto significa que regresa al bucle de evento ( epoll
, kqueue
o select
) y solicita descriptores de archivos que tengan algo que informar. Tenga en cuenta que la llamada al sistema en el bucle de evento principal es en realidad una operación de bloqueo, porque no hay nada que hacer hasta que uno de los descriptores de archivo esté listo para leer o escribir.
Esa es la razón principal por la cual Nginx y Tornado son eficientes para atender a muchos clientes simultáneos: solo hay un proceso (que ahorra RAM) y solo un hilo (lo que ahorra CPU de los conmutadores de contexto). En cuanto a epoll, es solo una versión más eficiente de select. Si hay N descriptores de archivos abiertos (sockets), le permite seleccionar los que están listos para leer en O (1) en lugar de O (N). De hecho, Nginx puede usar select en lugar de epoll si lo compila con la opción --with-select_module
, y apuesto a que seguirá siendo más eficiente que Apache. No estoy tan familiarizado con las partes internas de Apache, 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 back-end simultáneas para un único 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 increíblemente eficiente. Después de leer detenidamente el código fuente de Nginx y leer las guías / libros a los que me he vinculado anteriormente, descubrí que sería más fácil escribir módulos Nginx en lugar de mi propio servidor. Así nació la ahora semi-legendaria Guía de Emiller 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ás haciendo algo con HTTP, diría que dale una oportunidad a Nginx porque ha resuelto todos los detalles de tratar con clientes estúpidos. Por ejemplo, el pequeño servidor de socket que escribí para la diversión funcionó muy bien con todos los clientes, excepto Safari, y nunca entendí por qué. Incluso para otros protocolos, Nginx podría ser el camino correcto a seguir; el evento está muy bien abstraído de los protocolos, por lo que puede usar tanto HTTP como IMAP. El código base de Nginx está extremadamente bien organizado y muy bien escrito, con una excepción que cabe mencionar. No seguiría su ejemplo cuando se trata de rodar manualmente un analizador de protocolo; en su lugar, usa un generador de analizador. He escrito algunas cosas sobre el uso de un generador de analizadores (Ragel) con Nginx aquí:
http://www.evanmiller.org/nginx-modules-guide-advanced.html#parsing
Probablemente, todo esto fue más información de la que deseaba, pero espero que encuentre algo útil.
Tornadoweb y Nginx son servidores web populares por el momento y muchos puntos de referencia muestran que tienen un mejor rendimiento que Apache en determinadas circunstancias. Entonces mi pregunta es:
¿Es ''epoll'' la razón más esencial que los hace tan rápidos? ¿Y qué puedo aprender de eso si quiero escribir un buen servidor de socket?
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é eventos son y cómo se usan en wikipedia .
Echa un vistazo a libevent (utilizado por gevent , generalmente más rápido y más estable que tornado) o libev para implementaciones.