Question

Tornadoweb et Nginx sont des serveurs web les plus populaires pour le moment et beaucoup d'analyses comparatives montrent qu'ils ont une meilleure performance que Apache dans certaines circonstances. Donc, ma question est:

est «epoll la raison la plus essentielle qui les rendent si vite? Et que puis-je apprendre que si je veux écrire un bon serveur socket?

Était-ce utile?

La solution

Si vous cherchez à écrire un socket serveur, un bon point de départ est l'article C10K Dan Kegel de quelques années en arrière:

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

J'ai aussi trouvé le Guide de Beej à la programmation du réseau pour être assez pratique:

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

Enfin, si vous avez besoin d'une grande référence, il y a UNIX Network Programming par W. Richard Stevens et. al.

http://www.amazon.com/Unix-Network-Programming-Sockets- Mise en réseau / dp / 0131411551 / ref = dp_ob_title_bk

Quoi qu'il en soit, pour répondre à votre question, la principale différence entre Apache et Nginx est que Apache utilise un thread par client avec blocage d'E / S, alors que Nginx est mono-thread avec des non-bloquant I / O. piscine des travailleurs d'Apache ne réduit les frais généraux de démarrage et les processus destorying, mais il fait encore l'interrupteur CPU entre plusieurs threads au moment de servir plusieurs clients. Nginx, d'autre part, traite toutes les demandes dans un thread. Quand on demande doit faire une demande de réseau (par exemple, à un back-end), Nginx attache un rappel à la demande de back-end et travaille ensuite sur une autre demande du client actif. En pratique, cela signifie qu'il retourne à la boucle d'événements (epoll, kqueue ou select) et demande des descripteurs de fichiers qui ont quelque chose à signaler. Notez que l'appel système en boucle principale de l'événement est en fait une opération de blocage, parce qu'il n'y a rien à faire jusqu'à ce que l'un des descripteurs de fichier est prêt pour la lecture ou l'écriture.

Alors, c'est la raison principale Nginx et Tornado sont efficaces au service de nombreux clients simultanés: il n'y a jamais qu'un seul processus (économisant ainsi RAM) et un seul fil (donc CPU économie de changements de contexte). Quant à epoll, il est juste une version plus efficace de sélection. S'il y a N descripteurs de fichiers ouverts (prises), il vous permet de choisir celles prêtes à lire en O (1) au lieu de O (n). En fait, Nginx peut utiliser au lieu de sélectionner epoll si vous compilez avec l'option --with-select_module, et je parie que ce sera encore plus efficace que Apache. Je ne suis pas aussi familier avec Apache internes, mais un grep rapide montre, il utilise sélectionner et epoll -. Probablement lorsque le serveur est à l'écoute de plusieurs ports / interfaces, ou si elle fait des demandes de back-end simultanées pour un seul client

Soit dit en passant, j'ai commencé avec ce genre de choses en essayant d'écrire un serveur socket de base et je voulais savoir comment Nginx était si terrifié efficace. Après poring à travers le code source Nginx et la lecture de ces guides / livres que je lien ci-dessus, je l'ai découvert serait plus facile d'écrire des modules Nginx au lieu de mon propre serveur. Ainsi est né le Guide de l'Emiller maintenant semi-légendaire Nginx Module de développement:

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

(Attention: le guide a été écrit contre Nginx 0,5-0,6 et les API peut avoir changé.) Si vous faites quoi que ce soit avec HTTP, je dirais que donner un coup de Nginx, car il a travaillé tous les détails poilus de traiter clients stupides. Par exemple, le petit serveur socket que j'ai écrit pour le plaisir fonctionnait très bien avec tous les clients - à l'exception Safari, et je ne compris pourquoi. Même pour les autres protocoles, Nginx peut-être la bonne façon de procéder; le concours complet est assez bien résumé des protocoles, ce qui est la raison pour laquelle il peut proxy HTTP ainsi que IMAP. La base de code Nginx est extrêmement bien organisé et très bien écrit, à une exception près qui porte la mention. Je ne suivrais pas son avance quand il vient à rouler un analyseur de protocole; à la place, utiliser un générateur d'analyseurs. J'ai écrit quelques trucs sur l'utilisation d'un générateur d'analyseur (Ragel) avec Nginx ici:

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

Tout cela était sans doute plus d'informations que vous voulez, mais nous espérons que vous trouverez quelques-uns des utile.

Autres conseils

Oui et non. Alors qu'ils utilisent à la fois epoll, sa technique qu'ils utilisent tous deux une boucle d'événement pour traiter les demandes. Vous pouvez trouver plus d'informations sur les boucles d'événements sont et comment ils sont utilisés à wikipedia .

Consultez libevent (utilisé par gevent , généralement plus rapide et plus stable que la tornade) ou libev pour les implémentations.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top