pgFincore 1.2 è un'estensione PostgreSQL per il controllo e la manipolazione della cache della pagina dati del sistema operativo. L'estensione ha già una storia di 7 anni di utilizzo, con evoluzioni corrispondenti alle esigenze produttive.
Scarica qui l'ultima versione 1.2, compatibile con PostgreSQL 9.6.
Cache dati
Il caching delle pagine dati è un'operazione che avviene "naturalmente", a più livelli nella gestione dei dati. L'oggetto è semplice:una moltitudine di strati sono sovrapposti tra i dati registrati fisicamente su disco e la restituzione all'utente. Attualmente quasi tutti i livelli di dati hanno un'astrazione per servire i comandi di lettura e scrittura più velocemente. Pertanto, la maggior parte dei dischi rigidi offre una cache di scrittura, che ritarda la scrittura fisica, e una cache di lettura che consente di anticipare le richieste future e fornire i dati più rapidamente. Esiste un sistema equivalente in SAN, schede RAID, sistemi operativi, software, ecc.
PostgreSQL ha ovviamente un proprio sistema di gestione per scritture e letture, i buffer condivisi , che può essere controllato con l'estensione pg_buffercache.
È possibile controllare la cache del sistema operativo con gli strumenti di sistema e pgFincore portalo in PostgreSQL.
Leggi avanti
La maggior parte dei sistemi operativi ottimizza i percorsi dei dati fornendo una finestra read-ahead, che consente di precaricare i dati nel cache e quindi fornirlo più rapidamente alle applicazioni. PostgreSQL contiene diverse ottimizzazioni per favorire questo comportamento a livello di sistema e offre anche funzionalità simili con l'opzione Effective_io_concurrency.
Una soluzione per facilitare queste ottimizzazioni consiste nell'usare le chiamate di sistema POSIX_FADVISE. Ancora pgFincore porta questa soluzione in PostgreSQL.
pgFincore 1.2
Questa estensione consente quindi:
- per ottenere informazioni precise sull'occupazione di una tabella o di un indice (e alcuni altri file utilizzati da PostgreSQL) nella cache del sistema che supporta POSIX (linux, BSD, …),
- per manipolare questa cache:creane una mappa e ripristinala in un secondo momento o su un altro server,
- per ottimizzare i percorsi tramite chiamate posix_fadvise.
Ottieni pgFincore
Pacchetti Debian e Red Hat disponibili nelle distribuzioni e per ogni versione di PostgreSQL sui repository Apt PGDG e RPM PGDG.
E i sorgenti sul repository git di pgfincore.
Hai bisogno di aiuto?
Oltre al supporto della community, puoi contattare 2ndQuadrant.
Esempi di utilizzo
Configurazione
$ sudo apt-get install postgresql-9.6-pgfincore $ psql -c 'CREATE EXTENSION pgfincore;'
Informazioni di sistema
# select * from pgsysconf_pretty(); os_page_size | os_pages_free | os_total_pages --------------+---------------+---------------- 4096 bytes | 314 MB | 16 GB
Ottimizza la passeggiata casuale (riduci la finestra di 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
Ottimizzazione dell'attraversamento sequenziale (aumento della finestra read-ahead)
# select * from pgfadvise_sequential('pgbench_accounts'); relpath | os_page_size | rel_os_pages | os_pages_free ------------------+--------------+--------------+--------------- base/16385/25676 | 4096 | 3176 | 1829288
Controllo della 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 |
Carica una tabella in memoria
# 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
Svuota la cache di una tabella
# 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
Ripristina le pagine memorizzate nella cache
Qui utilizziamo un parametro di tipo stringa di bit che rappresenta le pagine da caricare e scaricare dalla memoria.
# 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
NOTA:per la demo vengono gestite solo 6 pagine dati sopra, 1 carica la pagina, 0 scarica la pagina.