Bonjour,
Nous avons une utilisation assez particulière de PostgreSQL et nous recherchons un peu d'aide pour configurer, ou plutôt optimiser les configurations de notre serveur.
Notre matériel :
Nous avons un serveur Dell PowerEdge T620 avec 32 Go de RAM et 32 CPU 2.6GHz avec un système Ubuntu 12.04.
Notre usage :
Nous ne faisons pas de collecte de données en temps réelle (pas de site web avec des SELECT / INSERT / UDPDATE réguliers). Nous faisons plutôt de l'analyse et du traitement de données en masse. Nous collectons de gros fichiers de données (jusqu'à plusieurs Go, plusieurs dizaines de millions d'enregistrements avec parfois une centaine de colonnes). Et en général, nous effectuons quelques requêtes SELECT avec des COUNT, MIN, MAX, AVERAGE, etc. Pas mal de GROUP BY, quelques JOIN (mais beaucoup plus rares car en général, on a une grosse table avec toutes les infos dedans). Enfin, il nous est assez rare de faire des UPDATE car ceux-ci prennent beaucoup trop de temps ! Lorsqu'on doit modifier des données, on utilise plutôt des requêtes du genre CREATE TABLE x_bis AS SELECT ... FROM x; en utilisant des CASE dans le SELECT pour modifier les choses. A titre d'exemple, pour un résultat identique, une requête CREATE TABLE AS SELECT va prendre 2 à 3h alors qu'un UPDATE peut mettre jusqu'à 5 jours...
La problématique :
Aujourd'hui, nous n'arrivons pas à utiliser la pleine puissance du serveur. Dès que l'on fait tourner plusieurs requêtes en parallèle (CREATE TABLE AS SELECT), PostgreSQL devient très long, même pour de simples requêtes SELECT. Et au max, on utilise 15 à 20% de la puissance CPU total et de la mémoire RAM. Le serveur est dédié à la base de données, donc nous souhaiterions changer les configurations de PostgreSQL afin qu'il puisse utiliser toute la puissance du serveur. Nous cherchons donc un peu d'aide ou quelques conseil là-dessus.
Pour le moment, nous avons changé les configurations suivantes :
shared_buffers = 6144MB
checkpoint_segment = 30
checkpoint_timeout = 10min
effective_cache_size = 16384MB
Nous avons essayé d'espacer les checkpoints pour limiter l'accès disque, car nous n'avons pas besoin d'une restauration "rapide" en cas de crash (nous n'avons jamais eu de crash de PostgreSQL dans tous les cas). Et au pire, même si on met des checkpoints beaucoup plus espacés et que ça nous permet de nous faire gagner 30min sur des requête qui peuvent durer 4 à 5h, c'est toujours ça de gagner, même si derrière il nous faut une heure pour redémarrer PostgreSQL suite à un crash. Mais après, nous ne sommes pas sûr que ça améliore la performance globale dans le sens où les checkpoints se font moins souvent, mais du coup, sont plus long à faire puisqu'il y a plus de données à écrire...
Nous pensons aussi que nous pourrions gagner en rendant plus léger l'autovacuum, dans le sens où nous avons très peu, voire pas du tout d'UPDATE...
Donc en bref, si quelques personnes expérimentées souhaitent nous donner quelques astuces ou conseil pour améliorer notre configuration, elles sont les bienvenues
Merci d'avance.
Partager