Frage

Wir haben alle Benchmarks lesen und kennen die Fakten - ereignisbasierte asynchrone Netzwerk-Server sind schneller als ihre Pendants mit Gewinde. Denken Sie lighttpd oder Zeus gegen Apache oder IIS. Warum das?

War es hilfreich?

Lösung

ich denke, Event vs Thread basierend auf Basis ist nicht die Frage - es ist ein nicht-blockierende Multiplexed I / O ist, Wählbare Steckdosen, Lösung vs Thread-Pool-Lösung

.

Im ersten Fall Sie sind Handling alle Eingaben, die in unabhängig davon kommt, was it- so nutzt es keine Blockierung auf der reads- einen einzelnen ‚Hörer‘. Der einzelne Listener-Thread gibt Daten zu dem, was Arbeitsthreads verschiedenen Typen-sein kann und nicht als ein für jede Verbindung. Wieder keine Blockierung auf einen der Daten- Schreiben so kann der Datenhandler nur mit separat ausgeführt werden. Da diese Lösung meist IO liest / schreibt es nicht viel CPU einnimmt zeitüber damit Ihre Anwendung das dauern kann zu tun, was er will.

In einem Thread-Pool-Lösung haben Sie einzelne Threads jede Verbindung Handhabung, so dass sie Zeit haben, um Kontextwechsel zu teilen in und außerhalb jedes ‚hören‘. Bei dieser Lösung ist die CPU + IO Ops im gleichen Gewinde-, die eine Zeit slice- bekommt, so dass Sie auf IO ops am Ende warten pro Thread zu vervollständigen (Blockierung), die traditionell ohne CPU-Zeit getan werden könnte.

Google für nicht-blockierende IO für mehr Detail- und Sie können einige Vergleiche zu vs. Thread-Pools prob finden.

(wenn jemand diese Punkte klären können, fühlen Sie sich frei)

Andere Tipps

Ereignisgesteuerte Anwendungen sind nicht von Natur aus schneller.

Warum Veranstaltungen sind eine schlechte Idee (für Hoch Concurrency-Server) :

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.

Das war im Jahr 2003. Denn der Zustand des Durchzugs auf modernen Betriebssystemen seitdem verbessert hat.

Das Schreiben des Kerns eines ereignisbasierten Server bedeutet, neu zu erfinden kooperatives Multitasking (Windows 3.1-Stil) in Ihrem Code, höchstwahrscheinlich auf einem Betriebssystem, das bereits die richtige präemptive Multitasking, und ohne den Vorteil von transparentem Context-Switching unterstützt. Dies bedeutet, dass Sie Zustand auf dem Heap zu verwalten haben, die normalerweise durch den Befehlszeiger impliziert werden würde oder in einem Stapel Variable gespeichert. (Wenn Ihre Sprache sie hat, Schließungen diese Schmerzen deutlich lindern. Der Versuch, dies zu tun in C viel weniger Spaß ist.)

Dies bedeutet auch, Sie alle die Einsprüche gewinnen kooperatives Multitasking bedeutet. Wenn einer Ihrer Event-Handler eine Weile dauert, aus irgendeinem Grund zu laufen, stirbt er dieses Ereignis Faden. Völlig unabhängig Anfragen hinken. Selbst lange CPU-invensive Operationen haben woanders geschickt werden, um dies zu vermeiden. Wenn Sie über den Kern eines High-Concurrency-Server sprechen, ‚langwierige Operation‘ ist ein relativer Begriff, in der Größenordnung von Mikrosekunden für einen Server pro Sekunde verarbeitet 100.000 Anträge erwartet. Ich hoffe, dass das virtuelle Speichersystem nie für Sie Seiten von der Platte zu ziehen hat!

Erste gute Leistung von einer ereignisbasierte Architektur kann schwierig sein, besonders wenn man Latenz betrachten und nicht nur den Durchsatz. (Natürlich gibt es viele Fehler, die Sie auch mit Themen machen. Concurrency ist immer noch schwer.)

Ein paar wichtige Fragen für den Autor einer neuen Server-Anwendung:

  • Wie führe Gewinde auf den Plattformen, die Sie heute unterstützen möchten? Werden sie Ihre Engpass sein?
  • Wenn Sie immer noch mit einer schlechten Thread-Implementierung stecken: warum niemand zur Korrektur dieses
  • ?

Es hängt wirklich, was du tust; ereignisbasierte Programmierung ist sicherlich heikel für nicht-triviale Anwendungen. ein Web-Server zu sein, ist wirklich ein sehr trivial gut verstanden Problem und sowohl ereignisgesteuerte und Gewinde Modelle arbeiten sehr gut auf modernen Betriebssystemen.

Korrekt komplexe Server-Anwendungen in einem Ereignismodell zu entwickeln ist in der Regel ziemlich heikel - Threaded-Anwendungen sind viel einfacher zu schreiben. Dies kann den entscheidenden Faktor sein, anstatt Leistung.

Es geht nicht um die Fäden wirklich. Es geht um die Art und Weise der Fäden auf Dienstanforderungen verwendet werden. Für so etwas wie lighttpd haben Sie einen einzelnen Thread, der mehrere Verbindungen über Events Services. Bei älteren Versionen von Apache, Sie hatten einen Prozess pro Verbindung und der Prozess wachte auf eingehende Daten, so dass Sie mit einer sehr großen Zahl am Ende, wenn es viele Anfragen war. Nun aber mit MPM Apache ist ereignisbasiert als auch unter Apache MPM Ereignisse .

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