Régression dans Linux 7.0 : le temps passé sur s_lock() doublé dans PostgreSQL sur ARM64
Le développeur Amazon Salvatore DiPietro a découvert une chute de performances sur les systèmes ARM64 en testant PostgreSQL sur la version préliminaire du noyau Linux 7.0. Le test pgbench dans le scénario simple-update a affiché une baisse du TPS de 98 565 à 50 751 — presque la moitié. Le problème vient d’un changement dans le mode de préemption de l’ordonnanceur de tâches : par défaut, il est passé de PREEMPT_NONE à PREEMPT_LAZY pour les architectures prises en charge.
Ce changement a fait que PostgreSQL en espace utilisateur consacre 55 % du temps CPU aux appels s_lock(). Le noyau 7.0 est prévu pour Ubuntu 26.04 LTS, avec une sortie attendue mi-avril 2026.
Détails de la régression et analyse
Le changement dans l’ordonnanceur, apporté par Peter Zijlstra, a activé PREEMPT_LAZY, lié à ARCH_NO_PREEMPT. Sur ARM64, cela accentue la préemption des tâches, critique pour les SGBD à forte charge comme PostgreSQL.
Le profilage a révélé :
- Le temps dans s_lock() a explosé à 55 % du CPU total.
- Débit et réactivité réduits sous charge pgbench.
- N’affecte que les architectures supportant le mode LAZY.
Les experts notent que l’étape finale de test pour le noyau 7.0 limite l’option de revenir en arrière sans risquer de nouvelles régressions.
Correctifs proposés
DiPietro propose de revenir à PREEMPT_NONE par défaut et de le découpler d’ARCH_NO_PREEMPT. Zijlstra, auteur du patch et mainteneur du sous-système ordonnanceur, insiste pour améliorer PostgreSQL :
- Utiliser l’extension rseq (séquences redémarrables) du noyau afin de minimiser la préemption des détenteurs de verrous.
- Optimiser la gestion des spinlocks dans le code en espace utilisateur.
L’extension rseq permet la vérification et la mise à jour atomiques des états de séquences, réduisant le risque d’interruption des sections critiques.
Position de la communauté et décision de Linus
Les experts d’OpenNET rappellent le principe de Linus Torvalds : le noyau ne doit ni dégrader les performances ni casser la compatibilité avec l’espace utilisateur. L’impasse entre un revert du noyau (risque pour la sortie) et une correction dans PostgreSQL (qui nécessite des ajustements au SGBD) reste entière.
Pour les développeurs de niveau intermédiaire à senior testant PostgreSQL sur ARM64 :
- Benchez les performances pgbench sur noyau 7.0-rc.
- Surveillez le %CPU dans s_lock() via perf.
- Envisagez rseq pour optimiser les verrous dans vos projets.
- Suivez LKML pour les patches sur l’ordonnanceur.
Points clés
- Régression divise par deux le TPS de PostgreSQL sur ARM64 à cause de PREEMPT_LAZY.
- Zijlstra recommande rseq en espace utilisateur plutôt qu’un revert du noyau.
- Torvalds arbitrera avant la sortie de Linux 7.0 en avril 2026.
- Testez les versions rc : perf record -e cycles pour analyser s_lock().
— Editorial Team
Aucun commentaire pour le moment.