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.
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.
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 [...]
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.
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 [...]
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.