bk99.de entertain the web since 1997

epoll oder io_uring? Asynchrones I/O im Vergleich

Zusammenfassung

Der TinyGate-Autor vergleicht epoll und io_uring anhand eines Reverse-Proxys mit vielen gleichzeitigen Verbindungen.

Ideen

  • epoll meldet Bereitschaft; Anwendungen führen Lese- und Schreiboperationen anschließend selbst aus.
  • io_uring meldet abgeschlossene Operationen über gemeinsam genutzte Ringpuffer.
  • Batching verteilt die Kosten eines Systemaufrufs auf mehrere I/O-Operationen.
  • SQPOLL reduziert Systemaufrufe, bindet dafür dauerhaft Rechenzeit eines Kernelthreads.
  • Der Wechsel zu io_uring kann eine vollständige Architekturänderung erzwingen.
  • Ein realistischer Proxy-Benchmark offenbart Grenzen besser als isolierte Mikrobenchmarks.

Einsichten

  • Weniger Kontextwechsel lohnen sich erst bei ausreichend hoher Nebenläufigkeit.
  • Leistungsgewinn verschiebt Komplexität häufig von Systemaufrufen in Zustands- und Fehlerverwaltung.
  • Die beste I/O-Schnittstelle hängt stärker vom Lastprofil als vom Alter ab.

Fakten

  • epoll erschien 2002 im Linux-Kernel.
  • io_uring kam 2019 mit Linux 5.1.
  • Ein io_uring_enter()-Aufruf kann mehrere Einreichungen und Abschlüsse bündeln.
  • Submission- und Completion-Queues liegen in zwischen Anwendung und Kernel geteiltem Speicher.

Empfehlungen

  • Miss beide Modelle mit deinem echten Verbindungs- und Payloadprofil.
  • Aktiviere SQPOLL nur nach Messung des zusätzlichen CPU-Verbrauchs.
  • Plane Migrationen als Architekturprojekt statt als Austausch einzelner Systemaufrufe.

Referenzen

Originalartikel lesen