Indagini sul comportamento di Oracle RAC

venerdì 20 febbraio 2009 alle 20:06 | Pubblicato su Performance Tuning | 1 commento
Tag: , , ,

Quasi un mese fa ho scritto un post intitolato “Problemi di interconnessione con RAC“. Il fatto di avere un valore stranamente alto nella statistica “packet reassembles failed” visualizzato con il comando neststat -s faceva pensare a qualche problema harware.  In realtà dopo alcuni reboot delle macchine si sono notati comportamenti variabili, che, insieme alla mancanza di altri indizi di anomalie hardware,  mi portano a pensare non si tratti di problemi della singola macchina; al massimo può essere un problema dello switch al quale le interfacce di interconnessione sono attaccate.

Il fatto è che all’aumentare dell’attività di modifica e conteporanea interrogazione massiva dei dati, le prestazioni del RAC  peggioravano, per cui è capitato che una query, un full scan su una tabella non enorme, che in condizioni normali ci impiega tra uno e dieci secondi, ci mettesse anche dieci minuti.

Ho fatto un piccolo test, l’impianto ricordo è un RAC 10.2.0.4 a 4 nodi, con ASM su Linux x86-64. Ho lanciato in sequenza sui quattro nodi una coppia di query che fanno un full scan su due tabelle da circa 80000 blocchi (da 8kB), ad ogni giro ho lanciato questa query:


select TO_CHAR(INST_ID,'9') INST_ID,
TO_CHAR(executions,'999','NLS_NUMERIC_CHARACTERS = '',.''') EXECS,
TO_CHAR(buffer_gets,'99999999','NLS_NUMERIC_CHARACTERS = '',.''') BG,
TO_CHAR(disk_reads,'99999999','NLS_NUMERIC_CHARACTERS = '',.''') DR,
TO_CHAR(CLUSTER_WAIT_TIME/1000000,'99999D99','NLS_NUMERIC_CHARACTERS = '',.''') avg_wclu,
TO_CHAR(USER_IO_WAIT_TIME/1000000,'99999D99','NLS_NUMERIC_CHARACTERS = '',.''') avg_wio,
TO_CHAR(CPU_TIME/1000000,'9999999D99','NLS_NUMERIC_CHARACTERS = '',.''') avg_CPU,
TO_CHAR(elapsed_time/1000000,'999999D99','NLS_NUMERIC_CHARACTERS = '',.''') ELAPs ,
TO_CHAR((CPU_TIME+USER_IO_WAIT_TIME+CLUSTER_WAIT_TIME)/1000000,'99999D99','NLS_NUMERIC_CHARACTERS = '',.''') SUMw,
TO_CHAR((CLUSTER_WAIT_TIME/1000/(BUFFER_GETS-DISK_READS)),'999999D99','NLS_NUMERIC_CHARACTERS = '',.''') "AVGWX_GSBLOCK (ms)",
TO_CHAR((user_io_WAIT_TIME/1000/(DISK_READS)),'999999D99','NLS_NUMERIC_CHARACTERS = '',.''') "AVGW_X_IOBLOCK (ms)"
from Gv$sql where sql_text like'select /* CRISTIAN_TEST%' ORDER BY INST_ID,SQL_TEXT;

L’intento era quello di verificare “l’efficenza” della Global Cache, e l’affermazione secondo cui reperire un blocco dalla cache di un’altro nodo dovrebbe essere più efficente e veloce che reperirlo da disco, il tutto utilizzando le interessanti informazioni fornite dall GV$SQL

Ecco il risultato di questa query dopo circa quattro giri:

INST_ID EXECS BG        DR        AVG_WCLU  AVG_WIO   AVG_CPU     ELAPS      SUMW      AVGWX_GSBLOCK (ms) AVGW_X_IOBLOCK (ms) 
------- ----- --------- --------- --------- --------- ----------- ---------- --------- ------------------ ------------------- 
 1         5     447250    238414    331,58     22,48       17,53     365,27    371,59       1,59                ,09          
 1         4     300141     59236     13,92      5,39        9,21      25,30     28,52        ,06                ,09          
 2         4     357740    202052     12,82     20,75       12,88      41,83     46,46        ,08                ,10          
 2         4     300161      4386     56,95      1,78       11,17      66,46     69,90        ,19                ,41          
 3         4     357708    220675     24,39     21,01       14,31      54,25     59,71        ,18                ,10          
 3         4     300142       771     31,37       ,65        8,81      37,34     40,83        ,10                ,84          
 4         4     357700    237445     32,37     18,48       14,21      60,23     65,05        ,27                ,08          
 4         4     300324      1237     60,16      1,44       12,43      68,08     74,04        ,20               1,17

E’ accaduto che al terzo lancio di una delle due query sul primo dei due nodi, l’esecuzione è durata quasi dieci minuti contro una media compresa tra cinque e quindici secondi. La “causa” di ciò è evidenziata nella tabella sopra, ovvero in un elevato tempo di attesa sui blocchi tramite GCS.  Ho fatto delle approssimazioni nell’analisi e nella costruzione di questa tabella; ho preso i buffer gets come numero totale di blocchi necessari,  i “disk reads” come numero di blocchi non presenti in cache e letti su disco, la differenza l’ho considerata come blocchi recuperati dalla “Global Cache”. Quest’ultima può sembrare ed essere veramente una approssimazione forte, ma i risultati secondo me dimostrano comunque ciò che volevo vedere. Una parte dei blocchi probabilmente è gia presente nella cache locale, ma il tempo per accedere a questi dovrebbe essere trascurabile. Ho fatto dei controlli incrociati sulle V$SESSION_EVENT e V$SESSTAT e penso che le approssimazioni siano accettabili.

Il punto è che un caso anomalo (su cinque esecuzioni) ha portato sulla prima istanza, per la prima delle due query ad avere un tempo medio di attesa su un blocco (“gc cr multi block request”) molto alto. Quello è il caso eclattante e grave, ma nella stessa tabella vi sono altre due righe in cui risulta un tempo medio di attesa sul blocco via GCS  (AVGWX_GSBLOCK (ms)) più alto di quello di attesa sul blocco da disco (AVGW_X_IOBLOCK (ms))

Questa mia indagine è nata dalla stessa analisi fatta su una serie di query lanciate dall’applicativo, infatti li il problema sembra analogo:

INST_ID EXECS BG        DR        AVG_WCLU  AVG_WIO   AVG_CPU     ELAPS      SUMW      AVGWX_GSBLOCK (ms) AVGW_X_IOBLOCK (ms) 
------- ----- --------- --------- --------- --------- ----------- ---------- --------- ------------------ ------------------- 
 2        41    3585914   1987821    328,85    173,20      124,13     586,50    626,17        ,21                ,09          
 2        41    3585734   1937563    211,74    165,57      104,53     454,35    481,85        ,13                ,09          
 3       206   17995303   3855412   1000,00    329,20      515,54    1673,86   1844,74        ,07                ,09          
 3        45    3878755   1640542    680,64    158,28      134,38     930,06    973,29        ,30                ,10          
 3        38    3291803   1322199    587,86    135,06      106,99     799,74    829,91        ,30                ,10          
 3       185   16172079   3765261    884,73    282,55      406,00    1425,50   1573,28        ,07                ,08          

Si tratta di un piccolo campione. Mancano le istanze 1 e 4 che in questo momento, tramite “SERVICES” sono state escluse in quanto il sistema non è a pieno reggime e con due istanze si comporta molto meglio che con tutte e quattro. In ogni caso nel campione si vede che quasi sempre sembra sia più veloce acquisire i blocchi da disco che non dalla cache di altre istanze.

Se non è un problema hardware, o un bug ed il normale comportamento di RAC è un grosso problema.

Nella mia indagine potrebbe esserci qualche buco, sono gradite eventuali segnalazioni, sta di fatto che il comportamento anomalo, che ha pesato sull’utente finale è una certezza

1 commento »

RSS feed for comments on this post. TrackBack URI

  1. Mi ricordo di un bug relativamente a full scan su ASM ma non ricordo la versione di Oracle, ADDM che ti dice in proposito?

    Alessandro


Lascia un commento

Inserisci i tuoi dati qui sotto o clicca su un'icona per effettuare l'accesso:

Logo WordPress.com

Stai commentando usando il tuo account WordPress.com. Chiudi sessione / Modifica )

Foto Twitter

Stai commentando usando il tuo account Twitter. Chiudi sessione / Modifica )

Foto di Facebook

Stai commentando usando il tuo account Facebook. Chiudi sessione / Modifica )

Google+ photo

Stai commentando usando il tuo account Google+. Chiudi sessione / Modifica )

Connessione a %s...

Blog su WordPress.com.
Entries e commenti feeds.

%d blogger cliccano Mi Piace per questo: