Mémoire & journalisation

Module M3

Dalibo SCOP

24.12

18 décembre 2024

Sur ce document

Formation Module M3
Titre Mémoire & journalisation
Révision 24.12
PDF https://dali.bo/m3_pdf
EPUB https://dali.bo/m3_epub
HTML https://dali.bo/m3_html
Slides https://dali.bo/m3_slides
TP https://dali.bo/m3_tp
TP (solutions) https://dali.bo/m3_solutions

Licence Creative Commons CC-BY-NC-SA

Cette formation est sous licence CC-BY-NC-SA. Vous êtes libre de la redistribuer et/ou modifier aux conditions suivantes :

  • Paternité
  • Pas d’utilisation commerciale
  • Partage des conditions initiales à l’identique

Marques déposées

PostgreSQL® Postgres® et le logo Slonik sont des marques déposées par PostgreSQL Community Association of Canada.

Versions de PostgreSQL couvertes

Ce document ne couvre que les versions supportées de PostgreSQL au moment de sa rédaction, soit les versions 13 à 17.

Mémoire et journalisation dans PostgreSQL

PostgreSQL

Au menu

La mémoire & PostgreSQL :

  • Mémoire partagée
  • Mémoire des processus
  • Les shared buffers & la gestion du cache
  • La journalisation

Rappel de l’architecture de PostgreSQL

Architecture de PostgreSQL

Mémoire partagée

Zones de la mémoire partagée

  • shared_buffers
    • cache disque des fichiers de données
  • wal_buffers
    • cache disque des journaux de transactions
  • max_connections
    • 100… ou plus ?
  • track_activity_query_size
    • à monter
  • verrous
    • max_connections, max_locks_per_transaction
  • SLRU, etc…
  • Modification → redémarrage

Taille de la mémoire partagée

-- v15+
SHOW shared_memory_size ;
SHOW shared_memory_size_in_huge_pages ;

Mémoire par processus

work_mem, maintenance_work_mem

  • work_mem
    • × hash_mem_multiplier
  • maintenance_work_mem
    • autovacuum_work_mem
  • temp_buffers
  • Pas de limite stricte à la consommation mémoire d’une session !
    • ni à la consommation totale
  • Augmenter prudemment & superviser

Shared buffers

Utilité des shared buffers

Shared buffers ou blocs de mémoire partagée

  • partage les blocs entre les processus
  • cache en lecture ET écriture
  • double emploi partiel avec le cache du système
    • pas de direct I/O
  • caches importants pour les performances !
    • voir effective_cache_size ( ~⅔ RAM)

Dimensionnement des shared buffers

  • En première intention & avant tests :
shared_buffers = 25 % RAM généralement
  • Si > 8 Go :
    • Huge Pages,
    • max_wal_size, checkpoint_timeout

Notions essentielles de gestion du cache

  • Buffer pin
  • Buffer dirty/clean
  • Compteur d’utilisation
  • Clocksweep

Ring buffer

But : Le ring buffer permet de ne pas purger le cache à cause :

  • des grandes tables
  • de certaines opérations
    • Seq Scan
    • VACUUM (écritures)
    • COPY, CREATE TABLE AS SELECT…
    • etc.
  • À partir de PG 16 : vacuum_buffer_usage_limit
VACUUM (ANALYZE, BUFFER_USAGE_LIMIT '16MB') ;
vacuumdb --analyze --buffer-usage-limit='16MB'

Contenu du cache

2 extensions en « contrib » :

  • pg_buffercache
  • pg_prewarm

Synchronisation en arrière-plan

Pour synchroniser les blocs « dirty » :

  • Checkpointer essentiellement :
    • lors des checkpoints (surtout périodiques)
    • synchronise toutes les pages dirty
  • Background writer :
    • de façon anticipée, selon l’activité
    • une portion des pages
  • Backends
    • en dernière extrémité

Journalisation

Principe de la journalisation

Principe de la journalisation

Intégrité & durabilité

  • Intégrité : la base reste cohérente malgré :
    • arrêt brutal des processus
    • crash machine
  • Durabilité garantie si COMMIT
  • Écriture des modifications dans un journal avant les fichiers de données
  • WAL : Write Ahead Logging

Journaux de transaction (rappels)

Essentiellement :

  • pg_wal/ : journaux de transactions
    • sous-répertoire archive_status
    • nom : timeline, journal, segment
    • ex : 00000002 00000142 000000FF
  • pg_xact/ : état des transactions
  • Ces fichiers sont vitaux !

Checkpoint

  • « Point de reprise »
  • À partir d’où rejouer les journaux ?
  • Données écrites au moins au niveau du checkpoint
    • il peut durer
  • Processus checkpointer

Déclenchement & comportement des checkpoints - 1

  • Déclenchement périodique (idéal)
    • checkpoint_timeout
  • ou : Quantité de journaux
    • max_wal_size (pas un plafond !)
  • ou : CHECKPOINT
  • À la fin :
    • sync
    • recyclage des journaux
  • Espacer les checkpoints peut réduire leur volumétrie

Déclenchement & comportement des checkpoints - 2

  • Dilution des écritures
    • checkpoint_completion_target × durée moy. entre 2 checkpoints
  • Surveillance :
    • checkpoint_warning
    • log_checkpoints
    • Gardez de la place ! sinon crash…

Paramètres du background writer

Nettoyage selon l’activité, en plus du checkpointer :

  • bgwriter_delay
  • bgwriter_lru_maxpages
  • bgwriter_lru_multiplier
  • bgwriter_flush_after

WAL buffers : journalisation en mémoire

  • Mutualiser les écritures entre transactions
  • Un processus d’arrière plan : walwriter
  • Paramètres notables :
    • wal_buffers
    • wal_writer_flush_after
  • Fiabilité :
    • fsync = on
    • full_page_writes = on
    • sinon corruption !

Compression des journaux

  • wal_compression
    • compression des enregistrements
    • moins de journaux
    • un peu de CPU
    • off (défaut)
    • pglz (on), lz4, zstd (v15)

Limiter le coût de la journalisation

  • synchronous_commit
    • perte potentielle de données validées
  • commit_delay / commit_siblings
  • Par session

Au-delà de la journalisation

  • Sauvegarde PITR
  • Réplication physique
    • par log shipping
    • par streaming

L’archivage des journaux

  • Repartir à partir :
    • d’une vieille sauvegarde
    • les journaux archivés
  • Sauvegarde à chaud
  • Sauvegarde en continu
  • Paramètres
    • wal_level, archive_mode
    • archive_command ou archive_library

Réplication

  • Log shipping : fichier par fichier
  • Streaming : entrée par entrée (en flux continu)
  • Serveurs secondaires très proches de la production, en lecture

Conclusion

Mémoire et journalisation :

  • complexe
  • critique
  • mais fiable
  • et le socle de nombreuses fonctionnalités évoluées

Questions

N’hésitez pas, c’est le moment !

Quiz

Travaux pratiques

Mémoire partagée

Mémoire de tri

Cache disque de PostgreSQL

Journaux

Travaux pratiques (solutions)