Statspack su RDS for Oracle

In questa paginetta vediamo lo Statspack: una funzionalita' particolare di Oracle che consente di ottenere informazioni molto utili sulle prestazioni della base dati.
Lo Statspack e' disponibile da molto tempo ma lo utilizzeremo su RDS for Oracle che e' il servizio in Cloud di Amazon che offre un database Oracle gestito.

Questo documento presenta diversi elementi: Introduzione, Configurazione, Utilizzo, Schedulazione, ...

Introduzione

Oracle Statspack consente la raccolta di statistiche prestazionali del database dalla versione 8.1.6 [NdA versione del secolo scorso... era il 1999]. L'uso dello statspack non e' cosi' conosciuto perche' la versione Oracle 10R2 ha introdotto l'AWR (Automatic Workload Repository) che viene utilizzato in forma grafica dall'EM (Enterprise Manager) risultando molto semplice da utilizzare e da comprendere. Tuttavia l'AWR e' una Oracle Option quindi richiede un'acquisto ed e' utilizabile solo con l'Enterprise Edition. Percio' vi sono diversi casi in cui l'utilizzo dello Statspack risulta molto utile. Anche su RDS perche', senza utilizzare la possibilita' del BYOL, generalmente per Oracle vengono utilizzate Standard Edition.

Il funzionamento dello Statspack e' semplice: vengono raccolte periodicamente snap (fotografie) dei contatori delle strutture di sistema della base dati e quindi gli snap vengono confrontati tra loro fornendo indicazioni quali il numero di letture su disco, gli statement piu' utilizzati, i tempi di attesa, ... tutte informazioni utilissime al DBA ed agli sviluppatori tecnicamente piu' preparati per effettuare il tuning della base dati e l'ottimizzazione degli statement SQL.

Anche se introdotto parecchio tempo fa lo Statspack puo' essere utilmente impiegato anche sulle piu' recenti configurazioni di Oracle su Amazon RDS affiancandosi ai sistemi di Monitoring.

Configurazione

La configurazione dello statspack su RDS for Oracle e' molto differente rispetto a quella di un'installazione on-premises... ma e' comunque semplice.

Creiamo un nuovo Option Group:

Statspack on RDS for Oracle - Create Option Group Aggiungiamo l'opzione STATSPACK:

Statspack on RDS for Oracle - Add STATSPACK Option Assegnamo l'Option Group al nostro database ed attendiamo che venga attivato. Non e' necessario alcun riavvio e la sincronizzazione avviene in pochi minuti:

Statspack on RDS for Oracle - Installation completed

L'ultimo passaggio della configurazione prevede l'abilitazione dell'utente PERFSTAT ed il grant per la schedulazione delle attivita':

begin ALTER USER PERFSTAT IDENTIFIED BY xxx ACCOUNT UNLOCK; GRANT CREATE JOB TO PERFSTAT; end;

[NdA ovviamente non utilizzate xxx come password]

Gia' fatto! I passi di configurazione su AWS sono terminati e possiamo passare all'utilizzo.

Utilizzo

Effettuata la configurazione e' possibile utilizzare immediatamente lo Statspack. La prima cosa da fare e' raccogliere gli snap:

begin perfstat.statspack.snap; end;

Tipicamente gli snapshot vanno presi all'inizio ad al termine delle attivita' che si vogliono controllare. Se una fase batch o un bechmark sono particolarmente lunghi e' anche possibile raccogliere snap intermedi.
L'elenco degli snap raccolti si ottiene con questa query:

SELECT SNAP_ID, SNAP_TIME, SNAPSHOT_EXEC_TIME_S, STARTUP_TIME FROM perfstat.STATS$SNAPSHOT ORDER BY 1;

I report Statspack vengono eseguiti confrontando tra loro due snapshot ed ottenendo i dati statistici sulle attivita' occorse nel frattempo.
Su RDS il comando per lanciare il report e':

begin rdsadmin.rds_run_spreport(1,2); end;

Il risultato e' accessibile tra i file di log della base dati e puo' essere facilmente scaricato dalla console:

Statspack on RDS for Oracle - Results

Il formato e' quello testuale classico dello script spreport di Statspack:


STATSPACK report for

Database    DB Id    Instance     Inst Num  Startup Time   Release     RAC
~~~~~~~~ ----------- ------------ -------- --------------- ----------- ---
          2815999920 DEMO01               1 01-Apr-23 06:35 19.0.0.0.0  NO

Host Name             Platform                CPUs Cores Sockets   Memory (G)
~~~~ ---------------- ---------------------- ----- ----- ------- ------------
     ip-172-13-13-269 Linux x86 64-bit           4     2       1         15.5

Snapshot       Snap Id     Snap Time      Sessions Curs/Sess Comment
~~~~~~~~    ---------- ------------------ -------- --------- ------------------
Begin Snap:          1 23-Oct-24 06:53:47       89       1.6
  End Snap:          2 23-Oct-24 08:00:00      122       1.7
   Elapsed:      66.22 (mins) Av Act Sess:       0.0
   DB time:       3.18 (mins)      DB CPU:       2.76 (mins)

Cache Sizes            Begin        End
~~~~~~~~~~~       ---------- ----------
    Buffer Cache:     9,344M              Std Block Size:         8K
     Shared Pool:     2,240M                  Log Buffer:    23,192K

Load Profile              Per Second    Per Transaction    Per Exec    Per Call
~~~~~~~~~~~~      ------------------  ----------------- ----------- -----------
      DB time(s):                0.1                0.0        0.00        0.00
       DB CPU(s):                0.0                0.0        0.00        0.00
       Redo size:           27,189.8            7,216.1
   Logical reads:              619.1              164.3
   Block changes:              111.3               29.5
  Physical reads:                0.5                0.1
 Physical writes:                3.5                0.9
      User calls:              261.6               69.4
          Parses:              120.7               32.0
     Hard parses:                0.4                0.1
W/A MB processed:                0.6                0.2
          Logons:                0.4                0.1
        Executes:              158.9               42.2
       Rollbacks:                0.1                0.0
    Transactions:                3.8

Instance Efficiency Indicators
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
            Buffer Nowait %:   99.98       Redo NoWait %:  100.00
            Buffer  Hit   %:  100.00  Optimal W/A Exec %:  100.00
            Library Hit   %:   99.35        Soft Parse %:   99.70
         Execute to Parse %:   24.07         Latch Hit %:   99.94
Parse CPU to Parse Elapsd %:   52.79     % Non-Parse CPU:   93.27

 Shared Pool Statistics        Begin   End
                               ------  ------
             Memory Usage %:   90.10   86.19
    % SQL with executions>1:   68.28   76.26
  % Memory for SQL w/exec>1:   78.15   87.19

Top 5 Timed Events                                                    Avg %Total
~~~~~~~~~~~~~~~~~~                                                   wait   Call
Event                                            Waits    Time (s)   (ms)   Time
----------------------------------------- ------------ ----------- ------ ------
CPU time                                                        99          56.0
log file sync                                   17,454          27      2   15.5
log file parallel write                         22,908          25      1   14.4
control file sequential read                    17,639          10      1    5.9
control file parallel write                      3,850           4      1    2.2
          -------------------------------------------------------------
Host CPU  (CPUs: 4  Cores: 2  Sockets: 1)
~~~~~~~~              Load Average
                      Begin     End      User  System    Idle     WIO     WCPU
                    ------- -------   ------- ------- ------- ------- --------
                       0.00    0.05      0.76    0.56   97.71    0.06
...

Le prime sezioni del report riportano dati generali sull'istanza ed e' relativamente semplice ottenere indicazioni su eventuali bottleneck e criticita'. Le sezioni successive entrano in dettaglio sugli statement SQL piu' pesanti ordinandoli su diverse metriche... ma entrare nel dettaglio dei report di Statspack richiede piu' spazio di quello disponibile in questa paginetta.

Su web sono disponibili innumerevoli documenti che spiegano come analizzare il report di Statspack... tra cui uno dei primi White Paper ufficiali.

Schedulazione

Per poter eseguire un'analisi sulle attivita' svolte sulla base dati in precedenza alla segnalazione del problema e' necessario raccogliere in modo periodico gli snapshot. Spesso vengono utilizzati strumenti di schedulazione presenti sui sistemi ospite come il crontab. Ma con RDS non e' possibile perche' non si ha accesso alla VM ospite. Va quindi utilizzato uno strumento interno alla base dati.

Nell'esempio che segue le statistiche vengono raccolte ogni due ore in orario lavorativo. E' una configurazione minimale ma utile anche per mostrare la flessibilita' del package dbms_scheduler:

begin
dbms_scheduler.create_job(job_name        => 'statspack_schedule',
                          job_type        => 'PLSQL_BLOCK', 
                          job_action      => 'perfstat.statspack.snap(i_snap_level=>5);',
                          start_date      => systimestamp,
                          repeat_interval => 'freq=hourly; byhour=8,10,12,14,16,18; byminute=0; bysecond=0;',
                          enabled         => true,
                          auto_drop       => false,
                          comments        => 'Office hours statspack schedule');
end;

Altrettanto importante e' ripulire le statistiche raccolte. Con la schedulazione che segue viene mantenuto l'ultimo mese:

begin
dbms_scheduler.create_job(job_name        => 'statspack_purge',
                          job_type        => 'PLSQL_BLOCK', 
                          job_action      => 'perfstat.statspack.purge(I_NUM_DAYS => 32, I_EXTENDED_PURGE => TRUE);',
                          start_date      => systimestamp,
                          repeat_interval => 'FREQ=DAILY; byhour=1; byminute=0; bysecond=0;',
                          enabled         => true,
                          auto_drop       => false,
                          comments        => 'Purge statspack records');
end;

La distanza in tempo tra gli snap e' molto importante. Quale esempio in AWR il default e' uno snapshot ogni ora con una ritenzione di 8 giorni, sicuramente e' una scelta ragionevole. Per disporre di una granularita' maggiore si possono campionare i dati ogni 15 minuti, generalmente non e' opportuna una frequenza maggiore se necessario possono essere eseguiti snap manuali.

Disporre di una baseline e' molto importante. A volte per analizzare un problema e' piu' utile disporre degli snapshot eseguiti a sistema funzionante che di quelli eseguiti durante la problematica.

Ulteriori parametri

Il livello di dettaglio delle statistiche raccolte da uno snap e' configurabile utilizzando il parametro i_snap_level:

begin perfstat.statspack.snap(i_snap_level=>6); end;

I livelli utilizzabili sono riassunti nella seguente tabella:

Livello Descrizione Da versione Note
0 General performance statistics 8i
5 SQL Statements 8i Default
6 SQL Plans 9i
7 Segment statistics 9.2
10 Parent and Child latches 8i

I livelli superiori raccolgono le statistiche di tutti i livelli inferiori.

L'elenco completo dei parametri che e' possibile utilizzare e' il seguente:

Parameter Name      Range         Default  Note
------------------  ------------  -------  -----------------------------------
i_snap_level        0,5,6,7,10    5        Snapshot Level
i_ucomment          Text          Blank    Comment to be stored with Snapshot
i_executions_th     Integer >=0   100      SQL Threshold: number of times the statement was executed
i_disk_reads_th	    Integer >=0   1000     SQL Threshold: number of disk reads the statement made
i_parse_calls_th    Integer >=0   1000     SQL Threshold: number of parse  calls the statement made
i_buffer_gets_th    Integer >=0   10000    SQL Threshold: number of buffer gets the statement made
i_sharable_mem_th   Integer >=0   1048576  SQL Threshold: amount of sharable memory
i_version_count_th  Integer >=0   20       SQL Threshold: number of versions of a SQL statement
i_seg_phy_reads_th  Integer >=0   1000     Segment statistic Threshold: number of physical reads on a segment. 
i_seg_log_reads_th  Integer >=0   10000    Segment statistic Threshold: number of logical reads on a segment.
i_seg_buff_busy_th  Integer >=0   100      Segment statistic Threshold: number of buffer busy waits for a segment.
i_seg_rowlock_w_th  Integer >=0   100      Segment statistic Threshold: number of row lock waits for a segment.
i_seg_itl_waits_th  Integer >=0   100      Segment statistic Threshold: number of ITL waits for a segment.
i_seg_cr_bks_sd_th  Integer >=0   1000     Segment statistic Threshold: number of Consistent Reads blocks served by the instance for the segment.
i_seg_cu_bks_sd_th  Integer >=0   1000     Segment statistic Threshold: number of Current blocks served by the instance for the segment.
i_session_id        sid           0        Session Id of the Oracle Session to capture session granular statistics for
i_modify_parameter  True,False    False    Save the parameters specified for future snapshots?

Varie ed eventuali

Confrontare snap presi a grande distanza di tempo generalmente non fornisce alcuna indicazione utile. Non e' possibile eseguire un report su snap tra cui e' avvenuto un restart dell'istanza del database.

Se gli oggetti o gli utenti che costituiscono lo statspack sono gia' presenti sull'istanza Oracle RDS allora la procedura di configurazione descritta puo' presentare degli errori. Inoltre con alcune versioni puo' presentarsi il bug 28523746 che non fa caclolare correttamente i tempi di CPU. La documentazione ufficiale Amazon riportata tutte le indicazioni ed i work-araound da applicare.

Per conoscere le versioni di Oracle e dei servizi su Amazon RDS... seguite i link!

E' disponibile un'ampia documentazione su Statspack sul sito di supporto di Oracle. Tra i principali documenti: FAQ- Statspack Complete Reference (Doc ID 94224.1), Installing and Configuring StatsPack Package (Doc ID 149113.1), AWR Reporting - Licensing Requirements Clarification (Doc ID 1490798.1), Statistics Package (STATSPACK) Guide (Doc ID 394937.1). Per accedere al sito di supporto Oracle e' necessario di disporre di un'utenza autorizzata.


Titolo: Statspack su RDS for Oracle
Livello: Avanzato (3/5)
Data: 14 Febbraio 2024 ❤️
Versione: 1.0.1 - 31 Ottobre 2024 🎃
Autori: mail [AT] meo.bogliolo.name