Mémoire & journalisation

Module M3

Dalibo SCOP

24.09

29 août 2024

Sur ce document

Formation Module M3
Titre Mémoire & journalisation
Révision 24.09
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 12 à 16.

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

  • L’implémentation dépend de l’OS
  • Quelles zones ?
  • Quelle taille ?

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
  • 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
    • × hash_mem_multiplier (v 13)
  • 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

  • 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 (voir effective_cache_size)
    • importants pour les performances !
  • Dimensionnement en première intention & avant tests :
    • shared_buffers = 25 % RAM généralement
    • si > 8 Go : Huge Pages, max_wal_size

Notions essentielles de gestion du cache

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

Ring buffer

But : ne pas purger le cache à cause :

  • des grandes tables
  • de certaines opérations
    • Seq Scan (lecture)
    • VACUUM (écritures)
    • COPY, CREATE TABLE AS SELECT…

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

  • Garantir la durabilité des données
  • Base encore cohérente après :
    • arrêt brutal des processus
    • crash machine
  • É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

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)