Warum wird die Umfrage nicht durch epoll ersetzt?

8

Level-Triggered epollist sehr ähnlich zu poll. Warum ist nicht pollnur ein Wrapper für epollSysteme, die letzteres unterstützen?

EDIT: Ich meine, gibt es technische Hindernisse gegen eine solche Entscheidung? Die Implementierung pollals epollwürde dramatisch steigert die Leistung von vielen Netzwerkanwendungen. Es sollte ein technisches Problem geben, das ich nicht bemerke.

Nicht Verstehen
quelle
5
Dies sind Systemaufrufe. Wenn Sie keine Ahnung haben, wovon er spricht, sollten Sie es vielleicht nachschlagen, aber seine Frage ist vollkommen gültig.
drrlvn
2
Bei beiden handelt es sich um Systemaufrufe, die auf Aktivitäten in einer Reihe von Dateideskriptoren warten. Epoll ist spezifisch für Linux 2.6+. Ich habe Links zu Manpages hinzugefügt.
Ich weiß was sie sind. Aber es gibt viele Linux / Unix-ähnliche Systeme, die Umfragen haben, und die Frage kann nicht ohne Angaben darüber beantwortet werden, welche Versionen von was.
Bmargulies
Die Implementierung pollals Wrapper für epollwäre unglaublich komplex und ineffizient. Sie müssten entweder einen neuen Epoll-Deskriptor einrichten und jedes Mal konfigurieren, oder Sie müssten den aktuellen Umfragesatz mit dem bereits mit dem Epoll-Deskriptor verknüpften vergleichen. Yuck!
David Schwartz

Antworten:

2

Umfrage ist für einfache Fälle viel einfacher; Es ist wahrscheinlich genauso effizient für eine kleine Anzahl von Dateideskriptoren. Der Anrufer muss sich nicht um die Verwaltung von Umfrage-FDs und das Hinzufügen / Entfernen von FDs kümmern. Er kann einfach alle hinzufügen, die er bei jedem Anruf zur Abfrage haben möchte.

Mein Gefühl ist, dass sie kostenlos sind, obwohl Umfrage als Wrapper für Epoll implementiert werden könnte, sollte es wahrscheinlich nicht sein.

epoll könnte (fast) als Wrapper für Umfragen implementiert werden, aber das würde seine Effizienzargumente zunichte machen.

MarkR
quelle
1
Das ist die wahrscheinlichste Antwort. Ich habe es getestet und epoll ist wirklich 10-mal langsamer als die Abfrage für 1 Dateideskriptor einer lokalen Datei (550 us pro 1000 Umfragen und 5420 us pro 1000 epolls (create + ctl + wait + close)). epoll_wait war nur 2 mal langsamer als poll.
1

Die Semantik von poll()und epollist unterschiedlich. Wenn poll()Sie darüber informiert werden, dass ein Deskriptor lesbar ist, lesen Sie etwas, lesen jedoch nicht alle verfügbaren Bytes und übergeben Sie diesen Deskriptor poll()erneut. Er wird sofort aktiviert. AFAIK das gleiche gilt nicht für epoll.

Beachten Sie auch, dass epollDeskriptoren eine begrenzte Ressource sind. Die Manpage spricht über epoll_create()Fehlerbedingungen, bei denen AFAIK nicht auftritt poll().

Während ich bin nicht sicher , der alle Details der Implementierung, daraus können wir sagen , dass es keinen Sinn macht , um poll()für einen Wrapper epoll. Der Programmierer muss sich dieser Punkte bewusst sein, und vorhandener Code, der mit den zulässigen Annahmen geschrieben wurde, poll()würde brechen.


quelle
1
1. Die Standardvariante von Epoll (Level-ausgelöst) verhält sich wie eine Umfrage (siehe Beschreibung Abschnitt der Manpage für Epoll (7)). 2. Die Umfrage ist im Wesentlichen epoll_create + epoll_ctl + epoll + wait + close. Die Anzahl der in dieser imaginären Abfrage verwendeten Epoll-Deskriptoren ist also durch die Anzahl der Threads begrenzt, die gleichzeitig eine Abfrage durchführen. Es könnte also eine Technik geben, um max_user_instances an die maximale Anzahl von Threads anzupassen. 3. Ich habe diese Frage gestellt, weil ich neugierig war, was diese Annahmen waren.
1

Okay, 7 Jahre später habe ich eine überzeugende Antwort basierend auf diesen Artikel von Evan Klitzke.

Erstens ist der Grund, warum ich die Frage gestellt habe, der oft erwähnte Leistungsvorteil epollgegenüber poll/ select. Das Wort epollist asymptotisch effizienter (O (1)) als poll(O ( N )).

Was nicht so allgemein bekannt ist, ist, dass nur flankengetriggert epoll wirklich O (1) ist, während pegelgesteuert epoll die gleiche Asymptotik von O ( N ) aufweist. In der Tat muss der durch Level ausgelöste Geschmack jedes Mal, wenn er aufgerufen wird, die Liste der beobachteten FDS durchgehen, um diejenigen zu finden, bei denen möglicherweise noch mehr Daten ausstehen. Eine flankengetriggerte Variante kann sich auf Signale als Reaktion auf neue Bytes stützen, die in einem fd erscheinen.

Es wäre interessant herauszufinden, wie genau ein wiederaufgenommener Thread herausfindet, welcher fd ihn aufgeweckt hat, aber es ist sicherlich möglich, dass dieses Datum während des epoll-ausgelösten Aufweckens durchlaufen wird.

Offensichtlich kann poll/ selectkann keine flankengetriggerte Verwendung verwenden ,epoll da die Semantik unterschiedlich ist. Wie wir gesehen haben, würde die Implementierung mit Level-Trigger epoll keine asymptotischen Leistungsvorteile bringen. Und möglicherweise auch negativ beeinflussen, wenn konstante Faktoren oder konstante Terme hoch sind (da sie auf einem groben Benchmark zu beruhen scheinen, den ich gemacht und in einem anderen Kommentar zitiert habe).

Weitere Informationen finden Sie unter Blockieren von E / A, Nichtblockieren von E / A und Epoll .

Nicht Verstehen
quelle