Comprendre la mémoire partagée PostgreSQL
PostgreSQL utilise la mémoire, qui peut être classifiée comme suit :
- Mémoire locale : allouée à chaque processus
- Mémoire partagée : utilisée par tous les processus
Mémoire locale
Chaque processus dans PostgreSQL nécessite de la mémoire pour le traitement des requêtes. Les paramètres de serveur suivants vous permettent de définir l’utilisation de la mémoire :
work_mem définit la mémoire requise pour le tri des tuples pour les opérations ORDER BY et DISTINCT. Ce paramètre détermine la quantité de mémoire disponible pour les opérations de tri internes et les tables de hachage. Si vous disposez d’une grande quantité de mémoire disponible et que votre charge de travail comporte des requêtes avec un tri complexe, l’augmentation de cette valeur de paramètre peut améliorer le niveau de performance en permettant des analyses plus volumineuses en mémoire avant leur déversement sur le disque.
Toutefois, une requête complexe peut avoir de nombreuses opérations de tri et de hachage s’exécutant simultanément. Chacune de ces opérations utilise autant de mémoire que la valeur l’autorise avant de commencer à écrire sur des fichiers temporaires sur disque. Sur un système occupé, l’utilisation totale de la mémoire est donc plusieurs fois supérieure à celle d’un paramètre work_mem individuel.
Pour régler cette valeur, utilisez RAM totale * 0,25/max_connections comme valeur initiale.
maintenance_work_mem est la mémoire requise par vacuum et reindex. Ce paramètre détermine la quantité de mémoire disponible pour les opérations de tri internes et les tables de hachage. La valeur par défaut est de 64 ko, mais l’augmentation de cette valeur améliore le nniveau de performance pour le nettoyage.
autovacuum_work_mem : définit la mémoire maximum à utiliser par chaque processus de nettoyage automatique.
temp_buffers définit la mémoire pour le stockage des tables temporaires. Ce paramètre définit le nombre maximum de tampons temporaires utilisés par chaque session de base de données.
effective_cache_size définit la quantité de mémoire disponible pour la mise en cache du disque par le système d’exploitation et dans la base de données. Le planificateur de requêtes PostgreSQL détermine si cette mémoire est fixe dans la RAM. Les analyses d’index sont susceptibles d’être utilisées avec des valeurs plus élevées. Sinon, les analyses séquentielles sont utilisées si la valeur est faible.
Définissez effective_cache_size sur 50 % de la RAM totale de la machine.
Mémoire partagée
La mémoire partagée est allouée au démarrage. La mémoire partagée est utilisée pour :
shared_buffers définit les mémoires tampon de mémoire partagée utilisées par le serveur. PostgreSQL charge les pages de tables et d’index du stockage persistant vers un pool partagé de mémoires tampon, puis travaille dessus en mémoire. Ce pool de tampons partagé est le composant principal de la mémoire partagée utilisée par le serveur. La valeur par défaut est de 128 Mo (selon le niveau de calcul). Si vous décidez d’allouer plus de mémoire, vous devez redémarrer le serveur.
wal_buffers définit le nombre de mémoires tampons de page de disque dans la mémoire partagée pour la journalisation WAL avant de l’écrire dans un stockage persistant.
En résumé, les paramètres de serveur importants relatifs à la mémoire que vous souhaiterez peut-être paramétrer sont les suivants :
- shared_buffers
- work_mem
- effective_cache_size