Frage

Tornadoweb und Nginx Für den Moment sind beliebte Webserver und viele Benchmarkings zeigen, dass sie unter bestimmten Umständen eine bessere Leistung als Apache haben. Meine Frage ist also:

Ist 'Epoll' der wichtigste Grund, der sie so schnell macht? Und was kann ich daraus lernen, wenn ich einen guten Socket -Server schreiben möchte?

War es hilfreich?

Lösung

Wenn Sie einen Socket -Server schreiben möchten, ist ein guter Ausgangspunkt Dan Kegels C10K -Artikel aus vor ein paar Jahren:

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

Ich fand auch Beejs Leitfaden für Netzwerkprogramme ziemlich praktisch:

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

Wenn Sie eine großartige Referenz benötigen, gibt es die UNIX -Netzwerkprogrammierung von W. Richard Stevens et. Al .:

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

Um Ihre Frage zu beantworten, besteht der Hauptunterschied zwischen Apache und Nginx darin, dass Apache einen Thread pro Client mit Blockierung von I/A verwendet, während Nginx mit nicht blockierender I/A Single-Threaded ist. Der Worker -Pool von Apache verringert den Overhead von Start- und Zählprozessen, macht den CPU -Schalter jedoch immer noch zwischen mehreren Threads, wenn sie mehrere Clients bedienen. Nginx hingegen behandelt alle Anforderungen in einem Thread. Wenn eine Anfrage eine Netzwerkanforderung (z. B. an ein Backend) stellen muss, fügt Nginx einen Rückruf an die Backend -Anfrage bei und arbeitet dann auf einer anderen aktiven Client -Anfrage. In der Praxis bedeutet dies, dass es zur Ereignisschleife zurückkehrt (epoll, kqueue, oder select) und bittet nach Dateideskriptoren, die etwas zu melden haben. Beachten Sie, dass der Systemanruf in der Hauptveranstaltung tatsächlich ein Blockierungsvorgang ist, da nichts zu tun ist, bis einer der Dateideskriptoren zum Lesen oder Schreiben bereit ist.

Das ist der Hauptgrund, warum Nginx und Tornado viele gleichzeitige Kunden effizient bedienen: Es gibt immer nur einen Prozess (somit sparen RAM) und nur einen Thread (somit CPU vor Kontextschalter speichern). Was Epoll betrifft, ist es nur eine effizientere Version von Select. Wenn es N offene Dateideskriptoren (Sockets) gibt, können Sie diejenigen auswählen, die bereit sind, in O (1) anstelle von o (n) Zeit zu lesen. Tatsächlich kann Nginx ausgewählt anstelle von epoll verwenden, wenn Sie es mit dem kompilieren --with-select_module Option, und ich wette, es wird immer noch effizienter als Apache. Ich bin mit Apache -Interna nicht so vertraut, aber ein schnelles GREP zeigt, dass es ausgewählt und epoll verwendet wird - wahrscheinlich, wenn der Server mehrere Ports/Schnittstellen anhört oder wenn er gleichzeitige Backend -Anforderungen für einen einzelnen Client erfolgt.

Übrigens habe ich mit diesem Zeug angefangen, um einen Basis -Socket -Server zu schreiben, und wollte herausfinden, wie verdammt effizient war. Nachdem ich den Nginx -Quellcode durchgesehen und diese Anleitungen/Bücher gelesen hatte, mit denen ich oben verlinkt habe, stellte ich fest, dass es einfacher wäre, Nginx -Module anstelle meines eigenen Servers zu schreiben. So wurde der jetzt Semi-Legendary Emiller's Leitfaden zur Entwicklung des Nginx-Moduls geboren:

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

(WARNUNG: Der Leitfaden wurde gegen Nginx 0,5-0.6 geschrieben und APIs haben sich möglicherweise geändert.) Wenn Sie mit HTTP etwas tun, würde ich Nginx eine Aufnahme geben, weil er alle haarigen Details des Umgangs mit dummen Kunden ausgearbeitet hat. Zum Beispiel hat der kleine Socket -Server, den ich für Spaß geschrieben habe, mit allen Kunden hervorragend funktioniert - außer Safari, und ich habe nie herausgefunden, warum. Selbst für andere Protokolle ist Nginx möglicherweise der richtige Weg. Die Veranstaltung ist ziemlich gut abstrahiert aus den Protokollen, weshalb es sowohl HTTP als auch IMAP proxy proxy kann. Die Nginx-Codebasis ist äußerst gut organisiert und sehr gut geschrieben, mit einer Ausnahme, die erwähnt wird. Ich würde seiner Führung nicht folgen, wenn es darum geht, einen Protokollparser zu handeln. Verwenden Sie stattdessen einen Parser -Generator. Ich habe hier ein paar Sachen über die Verwendung eines Parser -Generators (Ragel) mit Nginx geschrieben:

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

All dies war wahrscheinlich mehr Informationen als Sie wollten, aber hoffentlich werden Sie einige davon nützlich finden.

Andere Tipps

Ja und nein. Während sie beide Epoll verwenden, verwenden sie technisch, dass beide eine Ereignisschleife zum Umgang mit den Anfragen verwenden. Weitere Informationen darüber finden Sie, welche Eventschleifen sind und wie sie verwendet werden Wikipedia.

Kasse libvent (benutzt von Gevent, im Allgemeinen schneller und stabiler als Tornado) oder libev Für Implementierungen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top