pgFincore 1.2 est une extension PostgreSQL pour auditer et manipuler le cache de pages de données du système d’exploitation. L’extension a déjà une histoire de 7 ans d’utilisation, avec des évolutions correspondant aux besoins de production.
Télécharger ici la dernière version 1.2, compatible avec PostgreSQL 9.6.
Cache de données
Le cache de pages de données est une opération qui se réalise «naturellement», à plusieurs niveaux dans la gestion des données. L’objet est simple: une multitude de couches se superposent entre les données physiquement enregistrées sur disque et la restitution à l’utilisateur. Actuellement quasiment chaque couche de données possède une abstraction pour servir plus rapidement des ordres de lecture et d’écriture. Ainsi la majorité des disques durs proposent un cache en écriture, qui permet de retarder l’écriture physique, et un cache en lecture qui permet d’anticiper sur des prochaines demandes et servir des données plus rapidement. Un système équivalent existe dans les SAN, les cartes RAID, les système d’exploitation, les logiciels, etc.
PostgreSQL possède bien sûr son propre système de gestion pour les écritures et les lectures, les shared buffers, que l’on peut auditer avec l’extension pg_buffercache.
Il est possible d’auditer le cache du système d’exploitation avec des outils systèmes, et pgFincore porte cela dans PostgreSQL.
Read Ahead
La plupart des systèmes d’exploitation optimisent les parcours de données en proposant une fenêtre de lecture en avance, cela permet de pré-charger des données dans le cache et ainsi les fournir plus rapidement aux applications. PostgreSQL contient plusieurs optimisations pour favoriser ce comportement au niveau système, et porte également une fonctionnalité similaire avec l’option effective_io_concurrency.
Une solution pour faciliter ces optimisations consiste à utiliser des appels systèmes POSIX_FADVISE. Là-aussi pgFincore porte cette solution dans PostgreSQL.
pgFincore 1.2
Cette extension permet donc:
- d’obtenir des informations précises sur l’occupation d’une table ou d’un index (et quelques autres fichiers utilisés par PostgreSQL) dans le cache du système supportant POSIX (linux, BSD, …),
- de manipuler ce cache: en faire une carte et la restaurer ultérieurement ou sur un autre serveur,
- d’optimiser les parcours via les appels posix_fadvise.
Obtenir pgFincore
Paquets Debian et Red Hat disponibles dans les distributions, et pour chaque version de PostgreSQL sur les dépôts Apt PGDG et RPM PGDG.
Et les sources sur le dépôt git pgfincore.
Besoin d’aide ?
En plus du support communautaire, vous pouvez contacter 2ndQuadrant.
Exemples d’utilisation
Installation
$ sudo apt-get install postgresql-9.6-pgfincore
$ psql -c 'CREATE EXTENSION pgfincore;'
Information système
# select * from pgsysconf_pretty();
os_page_size | os_pages_free | os_total_pages
--------------+---------------+----------------
4096 bytes | 314 MB | 16 GB
Optimiser le parcours aléatoire (réduction de la fenêtre de read-ahead)
# select * from pgfadvise_random('pgbench_accounts_pkey');
relpath | os_page_size | rel_os_pages | os_pages_free
------------------+--------------+--------------+---------------
base/16385/24980 | 4096 | 2 | 1853808
Optimiser le parcours séquentiel (augmentation de la fenêtre de read-ahead)
# select * from pgfadvise_sequential('pgbench_accounts');
relpath | os_page_size | rel_os_pages | os_pages_free
------------------+--------------+--------------+---------------
base/16385/25676 | 4096 | 3176 | 1829288
Audit du cache
# select * from pgfincore('pgbench_accounts');
relpath | segment | os_page_size | rel_os_pages | pages_mem | group_mem | os_pages_free | databit
--------------------+---------+--------------+--------------+-----------+-----------+---------------+---------
base/11874/16447 | 0 | 4096 | 262144 | 3 | 1 | 408444 |
base/11874/16447.1 | 1 | 4096 | 65726 | 0 | 0 | 408444 |
Charger une table en mémoire
# select * from pgfadvise_willneed('pgbench_accounts');
relpath | os_page_size | rel_os_pages | os_pages_free
--------------------+--------------+--------------+---------------
base/11874/16447 | 4096 | 262144 | 80650
base/11874/16447.1 | 4096 | 65726 | 80650
Vider le cache d’une table
# select * from pgfadvise_dontneed('pgbench_accounts');
relpath | os_page_size | rel_os_pages | os_pages_free
--------------------+--------------+--------------+---------------
base/11874/16447 | 4096 | 262144 | 342071
base/11874/16447.1 | 4096 | 65726 | 408103
Restaurer des pages en cache
On utilise ici un paramètre de type bit-string représentant les pages à charger et décharger de la mémoire.
# select *
from pgfadvise_loader('pgbench_accounts', 0, true, true,
B'101001'); -- Varbit décrivant les pages à manipuler
relpath | os_page_size | os_pages_free | pages_loaded | pages_unloaded
------------------+--------------+---------------+--------------+----------------
base/11874/16447 | 4096 | 408376 | 3 | 3
NOTE: pour la démo, seul 6 pages de données sont manipulées ci-dessus, 1 charge la page, 0 décharge la page.