EnterpriseDB Advanced Server fornisce una serie di funzionalita'
ulteriori rispetto alla versione PostgreSQL Community
per coprire alcuni requisiti delle configurazioni Enterprise.
Per consentire un'analisi dei tempi di attesa delle applicazioni
EDB Advanced Server fornisce il DRITA (Dynamic Runtime Instrumentation Tools Architecture)
che vedremo in questa paginetta.
Nel seguito la pagina e' organizzata nei capitoli seguenti: Configurazione, Snapshot, Reports, Internals, Oracle Statspack, ...
Il documento e' volutamente breve e pratico con semplici esempi.
L'analisi dei tempi di attesa sugli eventi interni di una base dati e' una delle tecniche
piu' sofisticate per svolgere l'ottimizzazione ed il tuning.
E' infatti possibile confrontare le attivita' svolte dal motore della base dati
individuando quelle che richiedono un tempo maggiore ed hanno quindi un maggior
impatto sui tempi di risposta.
Ad esempio le attivita' di I/O possono essere distinte tra accessi sequenziali alla heap,
letture sugli indici, scritture dei WAL, ...
Questo tipo di analisi non e' disponibile su tutte le basi dati.
Il Dynamic Runtime Instrumentation Tools Architecture (DRITA) consente di eseguire sofisticate analisi sulle performance della base dati EDB Postgres Advanced Server, sia nella configurazione compatibile Oracle che in quella compatibile PostgreSQL.
DRITA e' presente su ogni installazione di EnterpriseDB
e quindi non e' necessaria alcuna installazione.
L'unica impostazione e' il parametro dinamico timed_statistics che puo'
essere impostato nel file di configurazione postgresql.conf oppure con:
SET timed_statistics
Il Dynamic Runtime Instrumentation Tools Architecture (DRITA) consente di eseguire sofisticate analisi sulle performance della base dati PostgreSQL.
Con la selezione:
SELECT * FROM edbsnap()
viene effettuato uno snapshot che e' l'immagine
di tutte le statistiche raccolte in un certo momento.
Per eseguire un'analisi delle attivita' raccolti piu' snapshot.
Per avere l'elenco degli snapshot la selezione e':
select * from get_snaps()
e con una
Per analizzare il carico di un benchmark tipicamente si effettua uno snapshot all'inizio ed uno alla fine delle attivita'. Se vi sono momenti o carichi diversi e' possibile effettuare snapshot interd medi per analizzare poi ogni singolo intervallo.
Per generare un report tra due snapshot basta richiamare il comando:
SELECT * FROM sys_rpt(begin_snap, end_snap, 8)
e viene riportato un report dei primi otto eventi di wait occorsi tra i due snapshot indicati.
Ecco un esempio di report (raccolto durante un benchmark OLTP):
WAIT NAME COUNT WAIT TIME % WAIT --------------------------------------------------------------------------- wal flush 82556 61.912294 33.30 wal write 82569 61.732028 33.21 wal file sync 82561 58.972752 31.72 query plan 66271 3.279333 1.76 db file extend 187 0.014042 0.01 wal insert lock acquire 5 0.000172 0.00 xid gen lock acquire 0 0.000000 0.00
Il report indica chiaramente un bottleneck ovvero una classe di eventi su cui si concentrano le attese. E' evidente infatti che e' presente un forte traffico transazionale e che le attese maggiori sono sulla scrittura dei WAL. In questo caso per migliorare le prestazioni sara' necessario eseguire un tuning specifico dei parametri relativi ai WAL (eg. aumentare il max_wal_size).
Sono disponibili diversi report:
sessid_rpt(begin_snap, end_snap, backend_id)
sesshist_rpt(snap, backend_id)
I report analoghi agli
Oracle Statspack/Automatic Workload Repository (AWR) report sono:
stat_db_rpt()
stat_tables_rpt()
statio_tables_rpt()
stat_indexes_rpt()
statio_indexes_rpt().
La funzione edbreport(
Infine per la gestione degli snapshot si utilizzano le funzioni:
truncsnap()
purgesnap(begin_snap, end_snap).
Per meglio comprendere gli eventi di wait in Postgres e' necessario
conoscere l'architettura interna.
Ciascun processo svolge una serie di compiti precisi ed i tempi di attesa
delle singole attivita' sono raccolti per ogni sessione.
L'elenco completo degli eventi e' riportato nella
documentazione ufficiale
[NdA attenzione alla versione di Postgres: le versioni piu' recenti hanno eventi molto piu' dettagliati].
Chi conosce l'RDBMS Oracle avra' notato una forte somiglianza
con l'utility Statspack presenti dalla versione Oracle 8.1.6.
In effetti l'effettuazione di snapshot, il confronto tra essi,
la produzione di report sono molto, molto simili tra i due strumenti.
Anche il tipo di analisi effettuato, che e' eseguito sui tempi di wait
e' molto simile.
E' noto che lo Statspack e' stato superato in funzionalita'
dall'AWR (Automatic Workload Repository) introdotto nella versione Oracle 10R2.
Pero' lo Statspack e' ancora perfettamente funzionante nella versione Oracle 19c
[NdA attuale versione LTS] ed e' ancora utilizzato perche'
l'AWR non e' disponibile per la Standard Edition e nella Enterprise Edition
e' contenuto nel Diagnostic Pack che e' una
Oracle Option e quindi e' un compomente a pagamento.
Un'introduzione a PostgreSQL si trova in PostgreSQL RDBMS.
Maggiori dettagli tecnici sulle diverse versioni di PostgreSQL e le date
di rilascio di ogni versione sono riportate in
questo documento.
Il sito PostgreSQL
contiene tutta la documentazione ufficiale.
Per ogni ulteriore dettaglio e' opportuno fare riferimento alla
documentazione ufficiale.
Titolo: DRITAInternals
Oracle Statspack
Naturalmente sotto i due motori sono differenti e quindi
gli eventi rilevati sono diversi.
Alcune attivita' sono molto simili: le Sequential Scan delle Heap di Postgres
corrispondono ai Full Table Scan di Oracle,
le scritture sui WAL sono simili a quelle sul Redo Log.
Su entrambe le basi dati l'ottimizzatore deve analizzare gli statement SQL ed ottenere un query plan...
Ma in Postgres non esistono i Rollback Segments ed in Oracle non c'e' la necessita' del VACUUM.
Ulteriori informazioni
Livello: Esperto
Data:
14 Febbraio 2023
Versione: 1.0.0 - 14 Febbraio 2023
Autore: mail [AT] meo.bogliolo.name