AWS-Ingenieur berichtet, dass sich die PostgreSQL-Leistung unter Linux 7.0 halbiert – eine Behebung könnte nicht einfach sein
(phoronix.com/news)- Im Entwicklungskernel von Linux 7.0 wurde von einem Amazon-/AWS-Ingenieur eine schwere Leistungsregression entdeckt, bei der der Durchsatz des PostgreSQL-Datenbankservers im Vergleich zu früheren Kerneln auf etwa die Hälfte fällt
- Messungen auf Graviton4-Servern zeigen, dass Linux 7.0 im Vergleich zu früheren Kerneln nur etwa den 0,51-fachen Durchsatz liefert; als Ursache wurde festgestellt, dass deutlich mehr Zeit in User-Space-Spinlocks verbraucht wird
- Als Ursache der Regression wurde eine Änderung identifiziert, die in Linux 7.0 die Einschränkung des Kernel-Preemption-Modus betrifft; ein Patch zur Wiederherstellung von PREEMPT_NONE als Standardwert wurde eingereicht, doch die Aussicht auf Annahme ist unklar
- Der ursprüngliche Autor Peter Zijlstra erklärte, statt einer Kernel-Korrektur müsse PostgreSQL so angepasst werden, dass es die RSEQ-(Restartable-Sequences)-Time-Slice-Erweiterung nutzt
- Die stabile Version von Linux 7.0 soll in etwa zwei Wochen erscheinen und wird auch als Basiskernel für Ubuntu 26.04 LTS dienen; deshalb wird eine breit angelegte Leistungsverschlechterung befürchtet, bis PostgreSQL angepasst ist
Entdeckung des Problems und Ausmaß
- Der Amazon-/AWS-Ingenieur Salvatore Dipietro meldete Regressionen bei Durchsatz und Latenz von PostgreSQL
- Auf Basis von Messungen auf Graviton4-Servern liefert Linux 7.0 im Vergleich zu bestehenden Kerneln nur den 0,51-fachen Durchsatz
- Als Ursache wurde bestätigt, dass wesentlich mehr Zeit in User-Space-Spinlocks verbraucht wird
Ursache der Regression: Einschränkung des Preemption-Modus
- Das Bisecting ergab, dass die Ursache eine Änderung ist, die in Linux 7.0 den Kernel-Preemption-Modus einschränkt
- Die Änderung wurde mit dem Ziel vorgenommen, für moderne CPU-Architekturen nur noch Full- und Lazy-Preemption-Modi beizubehalten, und war Teil der Scheduler-Updates für Linux 7.0
Eingereichter Patch und Reaktion des Kernel-Maintainers
- Wegen der schweren Regression wurde ein Patch auf der Linux-Kernel-Mailingliste eingereicht, der PREEMPT_NONE als Standard-Preemption-Modus wiederherstellt
- Der Autor des ursprünglichen Codes, Peter Zijlstra, steht einer Annahme dieses Patches jedoch ablehnend gegenüber und erklärte, die Lösung bestehe darin, dass PostgreSQL die RSEQ-(Restartable-Sequences)-Time-Slice-Erweiterung nutzt
- Die RSEQ-Time-Slice-Erweiterung ist ebenfalls eine in Linux 7.0 enthaltene Funktion
- Zijlstra erklärte, „damit lässt sich die Preemption-Exposition des Lock-Holders begrenzen“
Auswirkungen und Zeitplan für die Veröffentlichung
- Falls diese Haltung bestehen bleibt, könnte die PostgreSQL-Leistung in einigen Szenarien unter der stabilen Version von Linux 7.0 erheblich sinken, bis PostgreSQL aktualisiert wird
- Die stabile Version von Linux 7.0 soll in etwa zwei Wochen erscheinen
- Linux 7.0 ist der Basiskernel von Ubuntu 26.04 LTS, sodass dieselben Auswirkungen auch Ubuntu 26.04 LTS betreffen könnten, dessen Veröffentlichung für Ende April geplant ist
2 Kommentare
Soweit ich gehört habe, haben Kernel-Entwickler den PostgreSQL-Entwicklern wohl schon seit fast 10 bis 20 Jahren gesagt: „Spinlocks im Userland sind nicht empfehlenswert, vielleicht solltet ihr das noch einmal überdenken.“
https://x.com/kosaki55tea/status/2040458791536497035
Hacker-News-Kommentare
Es lohnt sich, den LKML-Nachfolgebeitrag von Postgres-Entwickler Andres Freund zu lesen
Es wurde die Ansicht geäußert, dass Linux-Maintainer zentrale Anwendungen wie PostgreSQL vorrangig unterstützen sollten
Das erinnerte an einen früheren Fall, in dem Fedora Updates blockierte, wenn Wine installiert war
Das heißt, es ist kein Problem, das alle Nutzer von PostgreSQL beim Umstieg auf den neuesten Kernel erleben
Es wurde auch die Meinung geäußert, dass spinlocks im Userspace ohne Kernel-Unterstützung geradezu nach Performance-Verlusten verlangen
Locks auf Futex-Basis verursachen jedoch durch mehr Memory Barriers Performance-Regressions
Außerdem muss Postgres weiterhin Plattformen berücksichtigen, die noch keine 8-Byte-Atomics unterstützen, was einen Ersatz schwierig macht
Der betreffende Spinlock wurde kürzlich entfernt, und bei Verwendung von Huge Pages verschwindet der Engpass fast vollständig
Es gab auch die Behauptung: „Niemand setzt den neuesten Kernel in Produktion ein“
Tatsächlich wird Ubuntu 26.04 LTS aber bald auf Basis von Linux 7.0 erscheinen, sodass viele Nutzer ihn bald verwenden werden
Das Problem ist derzeit, dass kein sysctl, sondern ein Kernel-Patch nötig ist
Hintergrund zu PREEMPT_LAZY findet sich in diesem LWN-Artikel
Es gab einen scherzhaften Kommentar: „Habt ihr nachgesehen, ob Jia Tan kürzlich einen Kernel-Patch eingereicht hat?“
Darauf folgte die Antwort: „Dafür besteht gar keine Notwendigkeit, es gibt ohnehin schon mehr als genug Schwachstellen“
Jemand fragte sich, ob die asynchrone I/O und Parallel-Query-Optimierungen in PostgreSQL 18 diesen Performance-Verlust ausgleichen könnten
Mehr dazu steht in den Release Notes zu PostgreSQL 18
Es wurde auch bezweifelt, warum dynamische Preemption-Modi wie PREEMPT_LAZY überhaupt nötig sind
Der Nutzen für normale Nutzer sei unklar
Dadurch könne der Kernel explizitere Informationen erhalten und Scheduling-Entscheidungen verbessern
Jemand schrieb, zwischen FreeBSD 14 und 15.0 eine Leistungseinbuße von 10 % gemessen zu haben, und fühle sich durch diesen Fall getröstet
Es gab auch Kritik daran, dass Phoronix den Fall ohne ausreichende Verifizierung aufgegriffen habe
In einer Follow-up-Mail wurde geschlussfolgert, dass bereits der Benchmark fehlerhaft gewesen sei und es in Wirklichkeit kein großes Problem gebe
Für PostgreSQL dürfte das kein großes Problem sein, andere Anwendungen, die keine Huge Pages nutzen können, könnten aber betroffen sein
Deshalb sei es nicht etwas, das man einfach ignorieren sollte
Zusätzlich wurde ein älterer LKML-Thread geteilt