Introduction
Une récente mise à jour du noyau Linux, la version 7.0, a introduit un changement dans la façon dont les processus sont gérés, entraînant une baisse significative des performances de PostgreSQL. Cet article explore les raisons behind cette régression et les mécanismes impliqués.
Contexte Technique
Le problème a été identifié par Salvatore Dipietro, un ingénieur chez AWS, qui a constaté que les performances de PostgreSQL avaient chuté de moitié sur une machine équipée de 96 vCPUs et exécutant Linux 7.0. Les tests ont montré que le changement dans la préemption des processus était à l'origine de cette baisse de performances.
La préemption est le mécanisme par lequel le système d'exploitation décide de suspendre un processus en cours d'exécution pour en lancer un autre. Avant Linux 7.0, il existait trois options de préemption : PREEMPT_NONE, PREEMPT_FULL et PREEMPT_LAZY. La dernière version de Linux a supprimé l'option PREEMPT_NONE, laissant seulement PREEMPT_FULL et PREEMPT_LAZY.
PostgreSQL utilise une gestion de mémoire basée sur des pages de données de 8 Ko, qui sont stockées dans un pool de tampon partagé. Lorsqu'un client se connecte à la base de données, un processus dédié est créé pour gérer cette connexion, et chaque processus doit accéder au pool de tampon pour lire ou écrire des données.
Analyse et Implications
L'analyse a montré que le changement dans la préemption a entraîné une augmentation significative du temps d'exécution de la fonction StrategyGetBuffer, qui est responsable de la gestion du pool de tampon. Cette fonction utilise un spinlock pour coordonner l'accès au pool de tampon, mais le changement dans la préemption a entraîné une augmentation du temps d'attente pour acquérir le spinlock.
Le problème est aggravé par la façon dont les pages de données sont stockées en mémoire virtuelle et traduites en adresses physiques à l'aide de la table de pages et du TLB (Translation Lookaside Buffer). Lorsqu'un processus accède à une adresse de mémoire qu'il n'a pas utilisée récemment, il doit effectuer une recherche dans la table de pages, ce qui prend du temps.
Perspective
Il est important de surveiller les performances de PostgreSQL sur les systèmes Linux 7.0 et de considérer les options de préemption disponibles. Les développeurs de PostgreSQL devraient également examiner les mécanismes de gestion de mémoire et de spinlock pour améliorer les performances dans ce contexte.
Enfin, il est essentiel de comprendre les implications de la préemption sur les performances des applications et de considérer les compromis entre la préemption et les autres facteurs tels que la sécurité et la fiabilité.