EMZETT.
Login

epoll und io_uring

Kurz: epoll und io_uring sind Linux-Schnittstellen, mit denen ein Programm tausende Verbindungen oder Dateivorgänge effizient gleichzeitig bedient.

Genauer: Der klassische Weg, bei jeder Verbindung einen Thread blockieren zu lassen, skaliert schlecht. Ereignisgesteuerte Server fragen stattdessen den Kernel, welche Verbindungen bereit sind.

Im Detail

  • select/poll: Übergeben bei jedem Aufruf die ganze Liste und prüfen sie linear, langsam bei vielen Verbindungen.
  • epoll: Der Kernel merkt sich die Beobachtungsliste. epoll_wait liefert nur die bereiten Verbindungen, Aufwand wächst mit der Zahl der aktiven, nicht aller Verbindungen. Grundlage von nginx, Node.js (libuv) und Redis.
  • io_uring: Zwei Ringpuffer zwischen Programm und Kernel (Einreichung und Fertigmeldung). Das Programm reiht viele Operationen ein und holt Ergebnisse, ohne je Operation einen Systemaufruf zu zahlen. Funktioniert auch für Dateien.
  • Vorsicht: io_uring hatte einige Sicherheitsprobleme, manche Umgebungen schalten es ab.
  • Ähnlich: kqueue (BSD, macOS) und IOCP (Windows).
  • Folge: Ein Thread kann zehntausende Verbindungen halten (das C10k-Problem).

Siehe auch: Sockets, Ringpuffer