17.4. Consommation des ressources
-
shared_buffers (integer)
-
Initialise la quantité de mémoire que le serveur de bases de
données utilise comme mémoire partagée. La valeur par défaut,
en général 32 Mo, peut être plus faible si la configuration
du noyau ne la supporte pas (déterminé lors de l'exécution
d'initdb). Ce paramètre doit
être à au moins 128 Ko et au moins 16 Ko par max_connections.
(Des valeurs personnalisées de BLCKSZ peuvent changer ce minimum.) Des
valeurs significativement plus importantes que ce minimum
sont généralement nécessaires pour de bonnes performances.
Plusieurs dizaines de méga-octets sont recommandées pour des
installations de production. Ce paramètre n'est initialisable
qu'au lancement du serveur.
L'augmentation de ce paramètre peut obliger PostgreSQL™ à réclamer plus de
mémoire partagée System V que ce
que la configuration par défaut du système d'exploitation ne
peut gérer. Voir la Section 16.4.1,
« Mémoire partagée et sémaphore » pour de plus
amples informations sur l'ajustement de ces paramètres, si
nécessaire.
-
temp_buffers (integer)
-
Configure le nombre maximum de tampons temporaires utilisés
par chaque session de la base de données. Ce sont des tampons
locaux à la session utilisés uniquement pour accéder aux
tables temporaires. La valeur par défaut est de 8 Mo. Ce
paramètre peut être modifié à l'intérieur de sessions
individuelles mais seulement jusqu'à la première utilisation
des tables temporaires dans une session ; les tentatives
suivantes de changement de cette valeur n'ont aucun effet sur
cette session.
Une session alloue des tampons temporaires en fonction des
besoins jusqu'à atteindre la limite donnée par temp_buffers. Positionner une valeur
importante pour les sessions qui ne le nécessitent pas ne
coûte qu'un descripteur de tampon, soit environ 64 octets,
par incrément de temp_buffers.
Néanmoins, si un tampon est réellement utilisé, 8192 autres
octets sont consommés pour celui-ci (ou, plus généralement,
BLCKSZ octets).
-
max_prepared_transactions
(integer)
-
Configure le nombre maximum autorisé de transactions
simultanément dans l'état « préparées » (voir PREPARE TRANSACTION). Configurer ce
paramètre à zéro désactive la fonctionnalité de transactions
préparées. La valeur par défaut est de cinq transactions. Ce
paramètre ne peut être configurée qu'au lancement du serveur.
Si les transactions préparées ne sont pas utilisées, ce
paramètre peut être positionné à zéro. Au contraire, si elles
sont utilisées, il peut être intéressant de positionner
max_prepared_transactions au minimum
à max_connections
pour éviter d'indésirables échecs lors de l'étape de
préparation.
Augmenter ce paramètre peut conduire PostgreSQL™ à réclamer plus de
mémoire partagée System V que ne
le permet la configuration par défaut du système
d'exploitation. Voir la Section 16.4.1,
« Mémoire partagée et sémaphore » pour les
informations concernant la façon d'ajuster ces paramètres, si
nécessaire.
-
work_mem (integer)
-
Indique la quantité de mémoire que les opérations de tri
interne et les tables de hachage peuvent utiliser avant de
basculer sur des fichiers disque temporaires. La valeur par
défaut est de 1 Mo. Pour une requête complexe, plusieurs
opérations de tri ou de hachage peuvent être exécutées en
parallèle ; chacune peut utiliser de la mémoire à hauteur de
cette valeur avant de commencer à placer les données dans des
fichiers temporaires. De plus, différentes sessions peuvent
exécuter de telles opérations simultanément. La mémoire
totale utilisée peut, de ce fait, atteindre plusieurs fois la
valeur de work_mem ; il est
nécessaire de garder cela à l'esprit lors du choix de cette
valeur. Les opérations de tri sont utilisées pour ORDER BY, DISTINCT et
les jointures de fusion. Les tables de hachage sont utilisées
dans les jointures de hachage, les agrégations fondées sur le
hachage et le traitement des sous-requêtes IN.
-
maintenance_work_mem (integer)
-
Indique la quantité maximale de mémoire que peuvent utiliser
les opérations de maintenance telles que
VACUUM
,
CREATE INDEX
et
ALTER TABLE ADD FOREIGN
KEY
. La valeur par défaut est de 16 Mo.
Puisque seule une de ces opérations peut être exécutée à la
fois dans une session et que, dans le cadre d'un
fonctionnement normal, peu d'opérations de ce genre sont
exécutées concurrentiellement sur une même installation, il
est possible d'initialiser cette variable à une valeur bien
plus importante que work_mem. Une
grande valeur peut améliorer les performances des opérations
VACUUM et de la restauration des sauvegardes.
-
max_stack_depth (integer)
-
Indique la profondeur maximale de la pile d'exécution du
serveur. La configuration idéale pour ce paramètre est la
limite réelle de la pile assurée par le noyau (configurée par
ulimit -s ou équivalent local) à
laquelle est soustraite une marge de sécurité d'un Mo
environ. La marge de sécurité est nécessaire parce que la
profondeur de la pile n'est pas vérifiée dans chaque routine
du serveur mais uniquement dans les routines clés
potentiellement récursives telles que l'évaluation d'une
expression. Le paramétrage par défaut est de 2 Mo, valeur
faible qui implique peu de risques. Néanmoins, elle peut
s'avérer trop petite pour autoriser l'exécution de fonctions
complexes. Seuls les superutilisateurs peuvent modifier ce
paramètre.
Configurer ce paramètre à une valeur plus importante que la
limite réelle du noyau signifie qu'une fonction récursive
peut occasionner un arrêt brutal d'un processus serveur
particulier. Sur les plateformes où PostgreSQL™ peut déterminer la
limite du noyau, il interdit de positionner cette variable à
une valeur inadéquate. Néanmoins, toutes les plateformes ne
fournissent pas cette information, et une grande attention
doit être portée au choix de cette valeur.
17.4.2. Carte de l'espace libre (Free Space Map)
Ces paramètres contrôlent la taille de la carte de l'espace libre partagé. Cette carte
conserve la trace des emplacements inutilisés dans la base de
données. Une carte trop petite peut conduire la base de données à
consommer de plus en plus d'espace disque car l'espace libre qui
n'est pas dans la carte ne peut pas être réutilisé ; de ce fait,
PostgreSQL™ réclame de
l'espace disque supplémentaire au système d'exploitation lorsqu'il
stocke de nouvelles données.
Les dernières lignes affichées par la commande
VACUUM VERBOSE
sur la base
entière peuvent aider à déterminer si les paramètres courants sont
adéquats. Un message NOTICE est également
affiché lors d'une telle opération si le paramétrage est trop
faible.
Augmenter ce paramètre peut toutefois conduire PostgreSQL™ à réclamer plus de mémoire
partagée System V ou de sémaphores que
ne le permet la configuration par défaut du système d'exploitation.
Voir la Section 16.4.1,
« Mémoire partagée et sémaphore » pour plus
d'informations sur la façon d'ajuster ces paramètres si nécessaire.
-
max_fsm_pages (integer)
-
Initialise le nombre maximum de pages disque pour lesquelles
l'espace libre est tracé dans la carte partagée de l'espace
libre. Six octets de mémoire partagée sont consommés par
emplacement de page. Ce paramétrage doit valoir au moins 16 *
max_fsm_relations. initdb teste plusieurs valeurs entre
20000 et 200000. La valeur par défaut sélectionnée dépend
principalement de la mémoire disponible. Ce paramètre n'est
configurable qu'au démarrage du serveur.
-
max_fsm_relations (integer)
-
Initialise le nombre maximum de relations (tables et index)
pour lesquelles l'espace libre est tracé dans la carte
partagée. Environ 70 octets de mémoire partagée sont
consommés par emplacement. La valeur par défaut est de 1000
relations. Ce paramètre n'est configurable qu'au démarrage du
serveur.
17.4.3. Usage des ressources du noyau
-
max_files_per_process (integer)
-
Positionne le nombre maximum de fichiers simultanément
ouverts par sous-processus serveur. La valeur par défaut est
de 1000 fichiers. Si le noyau assure une limite par
processus, il n'est pas nécessaire de s'intéresser à ce
paramètre. Toutefois, sur certaines plateformes (notamment
les systèmes BSD) le noyau autorise les processus individuels
à ouvrir plus de fichiers que le système ne peut
effectivement en supporter lorsqu'un grand nombre de
processus essayent tous d'ouvrir ce nombre de fichiers. Si le
message « Too many open
files » apparaît, il faut essayer de réduire ce
paramètre. Il ne peut être positionné qu'au démarrage du
serveur.
-
shared_preload_libraries
(string)
-
Indique les bibliothèques partagées à précharger au démarrage
du serveur. S'il faut précahrger plusieurs bibliothèques,
leurs noms doivent être séparés par des virgules. Par
exemple, '$libdir/malib' implique le
préchargement de malib.so (ou, sur
certaines plateformes, malib.sl)
depuis le répertoire d'installation des bibliothèques
standard. Ce paramètre ne peut être positionné qu'au
démarrage du serveur.
Les bibliothèques des langages procéduraux de PostgreSQL™ peuvent être
préchargées ainsi, typiquement en utilisant la syntaxe
'$libdir/plXXX' où XXX est pgsql,
perl, tcl
ou python.
Le préchargement d'une bibliothèque partagée permet d'éviter
le temps de chargement de la bibliothèque à sa première
utilisation. Toutefois, la durée de démarrage de chaque
nouveau processus serveur peut augmenter légèrement, même si
aucun de ces processus n'utilise la bibliothèque. Ce
paramètre n'est réellement recommandé que pour les
bibliothèques utilisées dans la plupart des sessions.
Note
Sur un hôte Windows, le préchargement d'une bibliothèque
au lancement du serveur ne réduit pas le temps nécessaire
au lancement de chaque nouveau processus serveur ; chaque
processus serveur recharge toutes les bibliothèques déjà
chargées. Néanmoins, shared_preload_libraries est toujours
utile sur les hôtes Windows car certaines bibliothèques
partagées peuvent nécessiter certaines opérations qui ne
peuvent avoir lieu qu'au lancement du serveur (par
exemple, une bibliothèque partagée peut réserver des
verrous légers ou de la mémoire partagée, ce qui ne peut
être fait une fois le serveur démarré).
Si une bibliothèque indiquée est introuvable, le démarrage du
serveur échoue.
Chaque bibliothèque supportée par PostgreSQL possède un
« bloc magique » qui est
vérifié pour garantir la compatibilité. Pour cette raison,
seules les bibliothèques PostgreSQL peuvent être chargées de
cette façon.
17.4.4. Report du VACUUM en fonction de son coût
Lors de l'exécution des commandes VACUUM et ANALYZE, le système
maintient un compteur interne qui conserve la trace du coût estimé
des différentes opérations d'entrée/sortie réalisées. Quand le coût
accumulé atteint une limite (indiquée par vacuum_cost_limit), le processus traitant
l'opération s'arrête un moment (précisé par vacuum_cost_delay). Puis, il réinitialise le
compteur et continue l'exécution.
Le but de cette fonctionnalité est d'autoriser les administrateurs
à réduire l'impact des entrées/sorties de ces commandes en fonction
de l'activité des bases de données. Il existe un grand nombre de
situations pour lesquelles il n'est pas très important que les
commandes de maintenance telles que
VACUUM
et
ANALYZE
se finissent rapidement ;
néanmoins, il est généralement très important que ces commandes
n'interfèrent pas de façon significative avec la capacité du
système à réaliser d'autres opérations sur les bases de données. Le
report du VACUUM en fonction de son coût fournit aux
administrateurs un moyen d'y parvenir.
Cette fonctionnalité est désactivée par défaut. Pour l'activer, la
variable vacuum_cost_delay doit être
initialisée à une valeur différente de zéro.
-
vacuum_cost_delay (integer)
-
Indique le temps, en millisecondes, de repos du processus
quand la limite de coût a été atteinte. La valeur par défaut
est de zéro, ce qui désactive la fonctionnalité de report du
VACUUM en fonction de son coût. Une valeur positive active
cette fonctionnalité. Sur de nombreux systèmes, la résolution
réelle des délais de repos est de 10 millisecondes ;
configurer vacuum_cost_delay à une
valeur qui n'est pas un multiple de 10 conduit alors au même
résultat que de le configurer au multiple de 10 supérieur.
-
vacuum_cost_page_hit (integer)
-
Indique Le coût estimé du nettoyage par VACUUM d'un tampon
trouvé dans le cache des tampons partagés. Cela représente le
coût de verrouillage de la réserve de tampons, la recherche
au sein de la table de hachage partagée et le parcours du
contenu de la page. La valeur par défaut est de un.
-
vacuum_cost_page_miss (integer)
-
Indique le coût estimé du nettoyage par VACUUM d'un tampon
qui doit être lu sur le disque. Ceci représente l'effort à
fournir pour verrouiller la réserve de tampons, rechercher
dans la table de hachage partagée, lire le bloc désiré sur le
disque et parcourir son contenu. La valeur par défaut est 10.
-
vacuum_cost_page_dirty (integer)
-
Indique le coût estimé de modification par VACUUM d'un bloc
précédemment vide (
clean block
). Cela représente les
entrées/sorties supplémentaires nécessaires pour vider à
nouveau le bloc modifié (
dirty
block
) sur le disque. La valeur par défaut est
20.
-
vacuum_cost_limit (integer)
-
Indique Le coût cumulé qui provoque l'endormissement du
processus de VACUUM. La valeur par défaut est 200.
Note
Certaines opérations détiennent des verrous critiques et
doivent donc se terminer le plus vite possible. Les reports de
VACUUM en fonction du coût ne surviennent pas pendant ces
opérations. De ce fait, il est possible que le coût cumulé soit
bien plus important que la limite indiquée. Pour éviter des
délais inutilement longs dans de tels cas, le délai réel est
calculé de la façon suivante : vacuum_cost_delay * accumulated_balance / vacuum_cost_limit avec un maximum de vacuum_cost_delay * 4.
17.4.5. Processus d'écriture en arrière-plan
Avec PostgreSQL™ 8.0 est
apparu un processus serveur distinct, nommé processus d'écriture en arrière-plan (
background
writer
), dont la seule fonction est d'écrire les
tampons partagés « modifiés »
(
dirty shared
buffers
). Le but est d'éviter aux processus serveur qui
gèrent les requêtes utilisateur d'attendre les écritures, le
processus d'écriture en arrière-plan se chargeant de celles-ci.
Cela réduit également l'impact sur les performances des points de
vérification. Le processus d'écriture en arrière-plan décharge en
permanence sur le disque les pages modifiées, de telle sorte que
seul un petit nombre de pages doit être écrit sur disque lorsque
survient un point de vérification. Il n'y a alors plus le déluge
d'écritures de tampons modifiés qui survenait précédemment à chaque
point de vérification. Cependant, la charge des entrées/sorties
augmente considérablement, parce que si une page fréquemment
modifiée n'était auparavant écrite qu'une seule fois par point de
vérification, le processus d'écriture en arrière-plan peut l'écrire
plusieurs fois dans le même intervalle. Dans la plupart des
situations, une faible charge continue est préférable à un pic
périodique, mais les paramètres décrits dans cette sous-section
permettent d'ajuster ce comportement pour des besoins particuliers.
-
bgwriter_delay (integer)
-
Indique le délai entre les tours d'activité du processus
d'écriture en arrière-plan. À chaque tour, le processus écrit
un certain nombre de tampons modifiés (contrôlable par les
paramètres qui suivent). Puis, il s'endort pour bgwriter_delay millisecondes et recommence. La
valeur par défaut est de 200 millisecondes. Sur de nombreux
systèmes, la résolution réelle des délais de sommeil est de
10 millisecondes ; positionner bgwriter_delay à une valeur qui n'est pas un
multiple de 10 peut avoir le même résultat que de le
positionner au multiple de 10 supérieur. Ce paramètre ne peut
qu'être configuré dans le fichier postgresql.conf ou indiqué sur la ligne de
commande.
-
bgwriter_lru_percent (floating point)
-
Pour réduire la probabilité que les processus serveur aient
besoin de lancer leurs propres écritures, le processus en
arrière-plan tente d'écrire les tampons qui risquent d'être
rapidement recyclés. À chaque tour, il examine jusqu'à
bgwriter_lru_percent des tampons les
plus proches du recyclage et écrit ceux qui ont été modifiés.
La valeur par défaut est 1.0 (1 % est le nombre total de
tampons partagés). Ce paramètre ne peut qu'être configuré
dans le fichier postgresql.conf ou
indiqué sur la ligne de commande.
-
bgwriter_lru_maxpages (integer)
-
À chaque tour, au plus ce nombre de tampons est écrit en
résultat de la recherche des tampons à recycler
prochainement. La valeur par défaut est de cinq tampons. Ce
paramètre ne peut qu'être configuré dans le fichier
postgresql.conf ou indiqué sur la
ligne de commande.
-
bgwriter_all_percent (floating point)
-
Pour réduire la quantité de travail nécessaire à chaque point
de vérification, le processus d'écriture en arrière-plan
effectue aussi un parcours circulaire de l'ensemble des
tampons écrivant les tampons modifiés. À chaque tour, il
examine au plus bgwriter_all_percent
des tampons dans ce but. La valeur par défaut est 0.333
(0,333 % est le nombre total de tampons partagés). Combiné à
la valeur par défaut de bgwriter_delay, ceci permet de parcourir
l'ensemble des tampons environ une fois par minute. Ce
paramètre ne peut qu'être configuré dans le fichier
postgresql.conf ou indiqué sur la
ligne de commande.
-
bgwriter_all_maxpages (integer)
-
À chaque tour, au maximum ce nombre de tampons est écrit en
résultat du parcours de tous les tampons. (Si cette limite
est atteinte, le parcours s'arrête et reprend au tampon
suivant au prochain tour.) La valeur par défaut est de cinq
tampons. Ce paramètre ne peut qu'être configuré dans le
fichier postgresql.conf ou indiqué
sur la ligne de commande.
Des valeurs plus faibles de bgwriter_all_percent et bgwriter_all_maxpages permettent de réduire la
charge supplémentaire des entrées/sorties causée par le processus
d'écriture en arrière-plan mais laissent plus de travail lors des
points de vérification. Pour réduire les pointes de charge lors des
points de vérification, ces deux valeurs peuvent être augmentées.
Pour désactiver totalement ce processus, il suffit de positionner
les valeurs maxpages et/ou les valeurs
percent à zéro.
|