Optimisation de Postgresql

La plupart des distributions livrent PostgreSQL avec une configuration basique, passe-partout, qui n'est pas forcement adaptée au volume et au nombre de transaction que peut générer freedom.

Voici quelques éléments de configuration pour une machine type avec 2 Go à 3 Go de RAM.

shared_buffers

Le paramètre shared_buffers permet de spécifier la taille de la mémoire partagée allouée par Postgresql.

Il est à noter que ce paramètre PostgreSQL dépend d'un paramètre du kernel qui indique la valeur maximale de mémoire partagée disponible pour les process. Il faudra donc au préalable augmenter la valeur de ce paramètre au niveau du noyau, pour ensuite augmenter la valeur dans PostgreSQL.

Sous Linux, la taille de la mémoire partagée maximale autorisée est définie par le paramètre sysctl kernel.shmmax :

# sysctl kernel.shmmax
kernel.shmmax = 33554432

On voit dans ce cas que la valeur est de 32 Mo

Sur une machine dédiée à PostgreSQL avec 2 à 3 Go de RAM on alloue entre 1 et 2 Go de mémoire partagée utilisable par les process :

# sysctl -w kernel.shmmax=2147483648
kernel.shmmax = 2147483648

Pour rendre ce paramètre persistant au redémarrage, on enregistre celui-ci dans le fichier /etc/sysctl.conf.

Une fois le shmmax configuré sur le kernel, on définit le paramètres PostgreSQL shared_buffers.

# vi /var/lib/pgsql/data/postgresql.conf
[...]
shared_buffers = 1024MB
[...]

La prise en compte de ce paramètre est effective après re-démarrage de PostgreSQL :

# /etc/rc.d/init.d/postgresql restart

Si Postgresql ne redémarre pas, vérifier que la valeur de shared_buffers est bien inférieure à la valeur de kernel.shmmax.

effective_cache_size

Ce paramètre indique à PostgreSQL la mémoire restante une fois que PostgreSQL et tous les autres process du serveur tournent en fonctionnement normal. Cet espace « libre » est utilisé par le noyau pour gérer ses buffers et son cache. Cet espace est visualisable sous Linux avec la commande free sous la forme des valeurs de buffers et cached :

# free
             total       used       free     shared    buffers     cached
Mem:       3095688    1932116    1163572          0      62524    1433776
-/+ buffers/cache:     435816    2659872
Swap:      1044208      89816     954392

Dans le cas ci-dessus, on peut donc indiquer à PostgreSQL une valeur de effective_cache_size de 1400 Mo :

# vi /var/lib/pgsql/data/postgresql.conf
[...]
effective_cache_size = 1400MB
[...]

work_mem

Le paramètre work_mem spécifie la quantité de mémoire que peut utiliser un process PostgreSQL pour effectuer des tris. Une valeur plus grande lui permettra de pouvoir manipuler plus de données en mémoire vive (plutôt que d'avoir recours à des fichiers temporaires qui sont plus lents).

Ce paramètre doit être calibré en fonction du nombre maximum de connexions concurrentes déclaré par le paramètre max_connections. La mémoire allouée pour ces opérations étant alors égale à max_connections * work_mem.

# vi /var/lib/pgsql/data/postgresql.conf
[...]
max_connections = 64
[...]
work_mem = 16Mb
[...]

Dans l'exemple ci-dessus, l'utilisation mémoire pourra monter à 64 * 16 Mo = 1 Go.

maintenance_work_mem

Le paramètre maintenance_work_mem spécifie la quantité de mémoire que peuvent utiliser les commandes/process PostgreSQL de VACUUM, création d'index et altération de table. Une valeur plus grande lui permettra de pouvoir manipuler plus de données en mémoire vive, et accélèrera le temps de traitement sur les VACUUM (freedom_clean) par exemple.

# vi /var/lib/pgsql/data/postgresql.conf
[...]
maintenance_work_mem = 128Mb
[...]

Conclusion

Ces paramètres permettent donc de donner une plus grande liberté de mouvement à PostgreSQL comparés à ceux livrés par défaut.

Les valeurs données ci-dessus sont des exemples qu'il faudra bien sûr adapter/moduler en fonction de la machine et de son utilisation dans le temps.

Liens utiles

freedom_3/install/tuning_postgresql.txt · Dernière modification: 11/10/2010 10:48 par jerome.auge