Vous n'êtes pas identifié(e).

#1 15/06/2012 16:00:17

pcsystemd
Membre

Valeurs pour kernel.shmmax ,shared_buffers,work_mem,max_connexions.

Bonjour,

je souhaite optimiser Postgresql 8.3 et à ce sujet je recherche les valeurs le mieux appropriées pour kernel.shmmax ,shared_buffers,work_mem,max_connexions. Voici quelques informations

Poste :
Pentium(R) Dual-Core  CPU      E5200  @ 2.50GHz
2Go de Ram
OS :Débian Squeeze (2.6.26-2-686)

sysctl -a | grep kernel.shm | sort
kernel.shmall = 2097152
kernel.shmmax = 33554432
kernel.shmmni = 4096
free -k
             total       used       free     shared    buffers     cached
Mem:       2040468    1944932      95536          0      48872    1665340
-/+ buffers/cache:     230720    1809748
Swap:      3903776        836    3902940

Dans mon fichier postgresql.conf j'ai actuellement les valeurs suivantes :
max_connections = 100
shared_buffers = 24MB

Je vous remercie d'avance pour votre aide.

Merci

Hors ligne

#2 15/06/2012 16:05:00

rjuju
Administrateur

Re : Valeurs pour kernel.shmmax ,shared_buffers,work_mem,max_connexions.

Bonjour,
pour pouvoir vous aider il nous faudrait plus de renseignement. Est-ce un serveur dédié pour postgresql ? Combien de clients doivent se connecter en simultané ? Y a-t-il des connexions persistantes ou des connexions brêves ? Quelle est l'utilisation de la base ? beaucoup de lecture, beaucoup d'écriture ...
Y a-t-il beaucoup de grosses requêtes (beaucoup de tris, group by sur beaucoup de données)

Hors ligne

#3 18/06/2012 07:44:05

pcsystemd
Membre

Re : Valeurs pour kernel.shmmax ,shared_buffers,work_mem,max_connexions.

Bonjour,

je vais essayé de répondre a vos questions.

- Ce n'est pas un serveur dédié postgresql. En faites ce serveur est dédié au CRM OpenERp + postgresql
- Que voulez vous dire par "clients simultanés"?
-Ce sont plutôt des connexions persistantes.
-Je dirais que l'utilisation est de 50% lecture, 50% ecriture
-Il y a de grosse requête car beaucoup de données

Merci pour vos conseils.

Hors ligne

#4 18/06/2012 09:30:20

gleu
Administrateur

Re : Valeurs pour kernel.shmmax ,shared_buffers,work_mem,max_connexions.

Que voulez vous dire par "clients simultanés"?

Des connexions à PostgreSQL qui exécutent des requêtes en simultané. Cette information aide à configurer max_connections. Si vous ne savez pas, laissez la valeur par défaut et affinez plus tard si vous le voulez. work_mem dépend aussi du nombre de requêtes exécutées en parallèle. À priori, avec les informations déjà données, je ne dépasserais pas 10 Mo pour l'instant.

De façon très généraliste, une plutôt bonne approximation de shared_buffers est de lui donner 1/4 de la RAM sur un serveur dédié (et donc 1/4 de la RAM consacrée à PostgreSQL sur un serveur non dédié, ce qui semble être votre cas). shmmax doit être au minimum à un peu plus que la valeur de shared_buffers, mais il peut être à beaucoup plus, cela ne changera rien. De toute façon, si shmmax n'est pas suffisamment élevé, PostgreSQL ne pourra pas démarrer, vous trouverez donc rapidement la bonne valeur smile

Pour la gestion de la mémoire, cet article (http://www.dalibo.org/glmf107_gestion_m … postgresql) peut vous intéresser. Même s'il commence à dater, les informations qu'il contient sont toujours pertinentes.


Guillaume.

Hors ligne

#5 18/06/2012 14:17:57

pcsystemd
Membre

Re : Valeurs pour kernel.shmmax ,shared_buffers,work_mem,max_connexions.

Merci pour vos informations. Je vais testé cela .

Hors ligne

#6 20/10/2012 10:31:08

ochaussavoine
Membre

Re : Valeurs pour kernel.shmmax ,shared_buffers,work_mem,max_connexions.

Sur le même sujet, en reprenant les infos données sur http://www.postgresql.org/docs/current/ … urces.html et partant de la règle selon laquelle
shmmax = taille de la RAM/4
shmall = shmax/ PAGESIZE
pour la config que j'ai

getconfig PAGESIZE 

     j'obtiens 4096
la RAM fait 2 Go soit 2^30.98 arrondi à 2^30 que je divise par 4, ça donne 2^28 = 268435456
et shmall = 2^28/4092 = 65536

en mettant dans postgres.conf

shared_buffer = 268Mo

et en modifiant les paramètres de kernel comme celà

sysctl -w kernel.shmmax=268435456
sysctl -w kernel.shmall=65536

Et bien, ça marche pas. Si je modifie postgres.conf:

shared_buffer = 200Mo

Ca marche. Quelqu'un sait-il ce qui ne va pas?

Hors ligne

#7 20/10/2012 10:48:10

rjuju
Administrateur

Re : Valeurs pour kernel.shmmax ,shared_buffers,work_mem,max_connexions.

Vous avez configuré votre shmmax à 256Mo. Le shmmax est exprimé en octet. Pour prendre 1/4 de la RAM (512 Mo), il faut donc 512*1024*1024=536870912

Dans le doute, pour vérifier le paramétrage vous pouvez utiliser ipcs -l -m. Attention également, en modifiant avec sysctlw -w, votre modification ne sera pas conservée lors d'un redémarrage. Il est préférable de modifier le fichier sysctl.conf et de le recharger (sysctl -p).

Hors ligne

#8 20/10/2012 12:22:02

ochaussavoine
Membre

Re : Valeurs pour kernel.shmmax ,shared_buffers,work_mem,max_connexions.

J'ai bien modifié sysctl.conf et redémarré à chaque fois.
J'aurais pu mettre plus de shared buffer, mais je que je comprend pas pourquoi si on fixe
shmmax= 2^28 = 268 435 456 soit 268,435 456 millions, et un shared_buffer=268MB alors postgres râle,
alors qu'il ne râle plus avec 200MB.
J'ai l'impression que l'erreur vient du fait de l'approximation que je fais en considérant que 1Mo = 1 000 000 octets != 2^20 = 1 048 576
Si on fait le calcul juste avec shmmax=2^28 on a
shared_buffer = 2^28/2^20 = 2^8 = 256MB
C'est exactement la valeur que donne rjuju
pourtant il râlait avec shared_buffer=250Mo autant et de la même manière qu'avec shared_buffer=268Mo

Finalement, j'ai une solution pour m'en tirer avec shared_buffer=200Mo et j'aimerais comprendre.
Au fait, je suis avec postgres 9.2 et ubuntu precise, mais je ne crois pas que cette info soit très utile.

Je viens de faire un nouveau test en reprenant les valeurs de rjuju:

shmmax=512MB

et

kernel.shmmax=536870912
# 2^29
kernel.shmall=131072

postgres me donne l'erreur:
DETAIL:  Failed system call was shmget(key=5432001, size=572530688, 03600).
il va chercher une mémoire dont la taille est 572530688 est supérieure (de peu) à 2^29
si on change shared_buffer à 500, on a l'erreur:
DETAIL:  Failed system call was shmget(key=5432001, size=558759936, 03600).
si on change shared_buffer à 490 on a l'erreur:
DETAIL:  Failed system call was shmget(key=5432001, size=547717120, 03600).
si on change shared_buffer à 450 on n'a plus l'erreur!
BYZARRE non?

Dernière modification par ochaussavoine (20/10/2012 12:27:39)

Hors ligne

#9 20/10/2012 13:15:06

rjuju
Administrateur

Re : Valeurs pour kernel.shmmax ,shared_buffers,work_mem,max_connexions.

Tout simplement parce que postgres n'alloue pas que la valeur du shared_buffers dans son segment de mémoire partagée, même si le shared_buffers est la partie la plus importante. Il alloue également le wal_buffers ainsi que de la mémoire pour les connexions, les autovacuum workers etc. Si vous voulez calculer exactement la valeur du shmmax avec vos paramètres, vous pouvez regarder la doc: http://www.postgresql.org/docs/9.2/stat … urces.html (tableau 17-2).

C'est quand même préférable de prévoir largement au-dessus, ça permet de modifier un des paramètres influant sur la taille du segment de mémoire partagée et relancer postgres sans avoir à modifier le shmmax.

Hors ligne

#10 20/10/2012 13:38:23

ochaussavoine
Membre

Re : Valeurs pour kernel.shmmax ,shared_buffers,work_mem,max_connexions.

Voilà qui est très clair.
Bonne journée Julien et merci de cette réponse.

Hors ligne

Pied de page des forums