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
Der Link zur Originalquelle öffnet einen neuen Tab.