Frage

Alles, was ich habe gelesen und erfahren (Tornado-basierte Anwendungen) führt mich zu glauben, dass epoll ein natürlicher Ersatz für Select und Poll ist basierend Vernetzung, vor allem mit Verdrehte. Das macht mich paranoid, es ist ziemlich selten, dass eine bessere Technik oder Methodik nicht mit einem Preis zu kommen.

Lesen ein paar Dutzend Vergleiche zwischen epoll und Alternativen zeigt, dass epoll ist eindeutig der Champion für Geschwindigkeit und Skalierbarkeit, und zwar, dass es in einer linearen Weise skaliert, was fantastisch ist. Das sei gesagt, was über Prozessor- und Speicherauslastung, ist epoll noch die Champion?

War es hilfreich?

Lösung

Für sehr kleine Anzahl von Steckdosen (variiert je nach Hardware, natürlich, aber wir reden über etwas in der Größenordnung von 10 oder weniger), wählen Sie kann epoll in der Speichernutzung und Runtime-Geschwindigkeit schlagen. Natürlich für eine solche kleine Anzahl von Steckdosen, sind beide Mechanismen so schnell, dass Sie wirklich diesen Unterschied in der überwiegenden Mehrzahl der Fälle ist es egal.

Eine Klärung, though. Beide wählen und epoll Skala linear. Ein großer Unterschied ist jedoch, dass die User-Space gerichtete APIs haben Komplexitäten, die auf verschiedene Dinge basieren. Die Kosten eines select Anruf geht in etwa dem Wert der höchsten nummerierten Dateideskriptors Sie es passieren. Wenn Sie auf einem einzigen fd auswählen, 100, dann ist das in etwa doppelt so teuer wie auf einem einzigen fd Auswahl, 50 mehr fds unter dem höchsten Hinzufügen ist nicht ganz frei, so ist es ein wenig komplizierter, als dies in der Praxis, aber das ist eine gute erste Näherung für die meisten Implementierungen.

Die Kosten für epoll ist näher an der Anzahl der Datei-Deskriptoren, die tatsächlich Ereignisse auf sie haben. Wenn Sie überwachen 200 Dateideskriptoren, aber nur 100 von ihnen haben Ereignisse auf sie, dann bist du (sehr grob) nur für die 100 aktive Filedeskriptoren zahlen. Dies ist, wo epoll neigt eine ihrer wichtigsten Vorteile bieten über auswählen. Wenn Sie mehr als tausend Kunden, die vor allem im Leerlauf sind, dann, wenn Sie wählen verwenden sind Sie immer noch für alle eintausend von ihnen bezahlen. Doch mit epoll, es ist wie Sie nur ein paar haben -. Sie nur für diejenigen bezahlen, die zu einem bestimmten Zeitpunkt aktiv sind,

All dies bedeutet, dass epoll auf weniger CPU-Auslastung für die meisten Workloads führen wird. Soweit Speichernutzung geht, dann ist es ein bisschen ein toss. select nicht verwalten alle notwendigen Informationen in einer sehr kompakten Art und Weise zu repräsentieren (ein Bit pro Dateideskriptor). Und die FD_SETSIZE (in der Regel 1024) Beschränkung, wie viele Dateideskriptoren Sie mit select Mittel verwenden können, dass Sie nie mehr als 128 Bytes für jeden der drei Sätze fd verbringen Sie mit select verwenden können (Lesen, Schreiben, Ausnahme). Im Vergleich zu den 384 Byte max, ist epoll Art eines Schweins. Jeder Dateideskriptor ist durch eine Multi-Byte-Struktur dargestellt. Doch in absoluten Zahlen, ist es immer noch nicht viel Speicher nicht benutzen wollen. Sie können eine große Anzahl von Datei-Deskriptoren in ein paar Dutzend Kilobyte (ca. 20k pro 1000 Filedeskriptoren, glaube ich) darstellen. Und Sie können auch in der Tatsache, werfen, dass Sie alle 384 dieser Bytes mit select verbringen, wenn Sie nur einen Dateideskriptor überwachen möchten, aber sein Wert geschieht 1024 sein, wheras mit epoll Sie nur 20 Bytes ausgeben würde. Dennoch sind alle diese Zahlen ziemlich klein, so dass es nicht viel Unterschied macht.

Und es gibt auch, dass andere Nutzen von epoll, die vielleicht sind Sie bereits wissen, dass es nicht zu FD_SETSIZE Filedeskriptoren beschränkt ist. Sie können es verwenden, so viele Dateideskriptoren zu überwachen, wie Sie haben. Und wenn Sie nur einen Dateideskriptor, aber sein Wert größer als FD_SETSIZE, epoll mit dem funktioniert auch, aber select nicht.

Randomly, habe ich auch vor kurzem einen kleinen Nachteil zu epoll entdeckt zu select oder poll verglichen. Während keines dieser drei APIs unterstützt eine normale Dateien (dh Dateien auf einem Dateisystem), select und poll vorhanden dieser Mangel an Unterstützung als solche Deskriptoren wie immer lesbar und immer beschreibbar berichten. Das macht sie ungeeignet für eine sinnvolle Art von nicht-blockierende Dateisystem I / O, ein Programm, das select oder poll verwendet und kommt aus dem Dateisystem einen Dateideskriptor zu begegnen zumindest weiter betrieben werden (oder wenn es fehlschlägt, wird es nicht wegen select oder poll sein), wenn auch es vielleicht nicht mit der besten Performance.

Auf der anderen Seite wird epoll scheitern schnell mit ihmror (EPERM, scheinbar) auf die Frage, eine solche Datei-Descriptor zu überwachen. Streng genommen ist dies kaum falsch. Es signalisiert lediglich seine mangelnde Unterstützung in expliziter Weise. Normalerweise würde ich explizite Fehlerbedingungen applaudieren, aber diese nicht dokumentiert ist (soweit ich das beurteilen kann) und führt zu einer völlig gebrochenen Anwendung, sondern als eine, die nur mit potenziell verminderter Leistung betrieben wird.

In der Praxis der einzige Ort, ich habe dies bis zu sehen kommen, wenn sie mit stdio interagieren. Ein Benutzer kann stdin oder stdout von / zu einer normalen Datei umleiten. Während früher stdin und stdout ein Rohr gewesen wäre - von epoll unterstützte ganz gut -. Es wird dann eine normale Datei und epoll nicht laut, um die Anwendung zu brechen

Andere Tipps

In den Tests in meiner Firma, ein Problem mit epoll () kam, also ein einzeln Kosten aus, die verglichen.

Wenn von dem Netzwerk mit einem Timeout zu lesen versucht, eine epoll_fd Erstellen (anstelle eines FD_SET), und Hinzufügen des fd zum epoll_fd, ist wesentlich teurer als ein FD_SET Erzeugen (die eine einfache malloc ist).

Gemäß der vorherigen Antwort, wie die Anzahl der FDs in dem Prozess groß wird, die Kosten für die select () höher wird, aber in unseren Tests auch bei fd Werte in den 10.000 ist, wählen Sie war immer noch ein Gewinner. Diese Fälle, in denen es nur ein fd, dass ein Thread wartet, und einfach versuchen, die Tatsache zu überwinden, dass Netzwerk lesen und Netzwerk-Schreib, nicht Timeout, wenn ein Sperr Thread-Modell. Natürlich sind blockiert Faden Modelle geringer Leistung im Vergleich zu nicht-blockierenden Reaktorsystemen, aber es gibt Gelegenheiten, bei denen mit einem bestimmten Legacy-Code-Basis zu integrieren, ist es erforderlich ist.

Diese Art von Anwendungsfall ist selten bei Hochleistungsanwendungen, da ein Reaktormodell braucht keine neuen epoll_fd jedes Mal zu schaffen. Für das Modell, in dem ein epoll_fd ist langlebig --- die eindeutig für jedes Hochleistungs-Server-Design bevorzugt, --- epoll ist der klare Sieger in jeder Hinsicht.

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