Regression in Linux 7.0 verdoppelt Zeitaufwand für s_lock() in PostgreSQL auf ARM64
Der Amazon-Entwickler Salvatore DiPietro entdeckte einen Leistungsabfall auf ARM64-Systemen, als er PostgreSQL auf der Pre-Release-Version des Linux-Kernels 7.0 testete. Der pgbench-Test im simple-update-Szenario zeigte einen TPS-Abfall von 98.565 auf 50.751 – nahezu halbiert. Das Problem rührt von einer Änderung im Preemptionsmodus des Task-Schedulers her: Der Standardwert wurde für unterstützte Architekturen von PREEMPT_NONE auf PREEMPT_LAZY umgestellt.
Diese Änderung führte dazu, dass PostgreSQL im Benutzerraum 55 % der CPU-Zeit für s_lock()-Aufrufe aufwandte. Kernel 7.0 ist für Ubuntu 26.04 LTS vorgesehen, dessen Release Mitte April 2026 erwartet wird.
Details zur Regression und Analyse
Die Scheduler-Änderung, vorgenommen von Peter Zijlstra, aktivierte PREEMPT_LAZY, das mit ARCH_NO_PREEMPT verknüpft ist. Auf ARM64 steigert dies die Task-Preemption erheblich, was für hochbelastete DBMS wie PostgreSQL kritisch ist.
Das Profiling ergab:
- Zeit in s_lock() schwoll auf 55 % der Gesamt-CPU an.
- Reduzierter Durchsatz und Reaktionsfähigkeit unter pgbench-Last.
- Betroffen sind nur Architekturen mit LAZY-Modus-Unterstützung.
Experten weisen darauf hin, dass die abschließende Testphase für Kernel 7.0 eine Rücksetzung erschwert, ohne neue Regressionsrisiken einzugehen.
Vorgeschlagene Lösungen
DiPietro schlägt vor, standardmäßig zu PREEMPT_NONE zurückzukehren und es von ARCH_NO_PREEMPT zu entkoppeln. Zijlstra, Autor des Patches und Maintainer des Scheduler-Subsystems, besteht darauf, PostgreSQL zu optimieren:
- Die Kernel-Erweiterung rseq slice (Restartable Sequences) nutzen, um Preemption von Lock-Haltern zu minimieren.
- Spinlock-Behandlung im Benutzerraum-Code optimieren.
rseq slice ermöglicht atomare Überprüfung und Aktualisierung von Sequenzzuständen und verringert das Risiko, kritische Abschnitte zu unterbrechen.
Position der Community und Linus’ Entscheidung
OpenNET-Experten betonen das Prinzip von Linus Torvalds: Der Kernel darf weder die Leistung verschlechtern noch die Kompatibilität zum Benutzerraum brechen. Der Konflikt zwischen Kernel-Rücksetzung (Release-Risiko) und PostgreSQL-Fix (erfordert DBMS-Anpassungen) ist noch ungelöst.
Für Mid- und Senior-Entwickler, die PostgreSQL auf ARM64 testen:
- Benchmarken Sie die pgbench-Leistung auf Kernel 7.0-rc.
- Überwachen Sie %CPU in s_lock() via perf.
- Ziehen Sie rseq für Lock-Optimierung in Ihren Projekten in Betracht.
- Beobachten Sie LKML nach Scheduler-Patches.
Wichtige Punkte
- Regression halbiert PostgreSQL-TPS auf ARM64 durch PREEMPT_LAZY.
- Zijlstra empfiehlt rseq slice im Benutzerraum statt Kernel-Rücksetzung.
- Torvalds entscheidet vor Linux-7.0-Release im April 2026.
- rc-Versionen testen: perf record -e cycles für s_lock()-Analyse.
— Editorial Team
Noch keine Kommentare.