Gestione della memoria AMM ASMM
AMM = Automatic Memomry Management, introdotto dalla 11g, gestisce in automatico lo spazio totale di memoria di SGA e PGA.
E’ abilitato, di default in fase di installazione, una volta impostato il parametro memory_target (e memory_max_target).
E’ consigliato da Oracle anche se la best practise prevede di abilitare la ASMM.
Vuol dire che i componenti di memoria della Sga non sono settati manualmente, ma sono in automatico impostati a zero i parametri db_cache_size e shared_pool_size.
I parametri memory_target possono essere configurati in fase di installazione del db tramite DBCA. memory_target è un parametro dinamico mentre memory_max_target è statico.
SQL> show parameter memory;
NAME TYPE VALUE
---------------------------------- -----------
memory_max_target big integer 5056M
memory_target big integer 4288M
Di default la memoria SGA è impostato al 60% mentre la PGA al 40% della memoria totale quando l’istanza è in start.
select * from V$MEMORY_TARGET_ADVICE;
Se non restituisce alcun record vuol dire che AMM è disabilitato.
Con AMM abilitato, la memoria SGA è allocata creando files sotto /dev/shm.
E’ abilitato, di default in fase di installazione, una volta impostato il parametro memory_target (e memory_max_target).
E’ consigliato da Oracle anche se la best practise prevede di abilitare la ASMM.
Vuol dire che i componenti di memoria della Sga non sono settati manualmente, ma sono in automatico impostati a zero i parametri db_cache_size e shared_pool_size.
I parametri memory_target possono essere configurati in fase di installazione del db tramite DBCA. memory_target è un parametro dinamico mentre memory_max_target è statico.
SQL> show parameter memory;
NAME TYPE VALUE
---------------------------------- -----------
memory_max_target big integer 5056M
memory_target big integer 4288M
Di default la memoria SGA è impostato al 60% mentre la PGA al 40% della memoria totale quando l’istanza è in start.
select * from V$MEMORY_TARGET_ADVICE;
Se non restituisce alcun record vuol dire che AMM è disabilitato.
Con AMM abilitato, la memoria SGA è allocata creando files sotto /dev/shm.
Con AMM l'intera memoria SGA viene allocata creando file in /dev/shm. Quando Oracle Database alloca SGA in questo modo, le HugePages non sono riservate. È necessario disabilitare AMM su Oracle Database 11g per utilizzare HugePages.
Se AMM è abilitato e anche le Linux hugepages sono abilitate, AMM sovrascriverà l'utilizzo delle Linux hugepages.
select *
from v$parameter
where name in ( 'memory_target', 'memory_max_target','sga_target','sga_max_size' ,
'db_cache_size','shared_pool_size','large_pool_size','java_pool_size','streams_pool_size')
enable AMM
|---> enable Memory Size Advisor
|---> enable ASMM (Automatic Shared Memory Management)
|---> not available PGA Advisor
Se ASMM è abilitato ma no AMM allora SGA Size Advisor è disponibile.
Se AMM è disabilitato allora è possibile abilitare PGA Advisor.
memory_target(MT)
sga_target(ST) E S I T O
------------------------------------------------------------------------------------------------------------
MT=0 AMM è disabilitato
ST=0 ASMM è disabilitato Specificare i valori dei pool
MT=0 AMM è disabilitato
ST>0 ASMM abilitato I pool saranno automaticamente dimensionati.
La memoria SGA e PGA è gestita separatamente.
MT>0 AMM è abilitato Gestione automatica della SGA e PGA
ST=0 ASMM è disabilitato
MT>0 AMM è abilitato Gestione automatica della SGA e PGA
ST>0 ASM è abilitato e la SGA ha un valore minimo definito da ST
ATTENZIONE
Se VALUE è Null vuol dire che è stato utilizzato pfile.
Quando si usa spfile il risultato è il seguente:
SQL> show parameter spfile;
NAME TYPE VALUE
------------------------------------ ----------- -----
spfile string /u01/app/oracle/product/18/db_1/dbs/spfileorcl.ora
Come si abilita AMM?
1.a) Se il si sta utilizzando il file init.ora è sufficiente modificarlo inserendo i parametri
memory_max_target=5242880000
memory_target=4454350848
2.a) Effettuare stop e start del db.
oppure
1.b) Se si utilizza spfile.ora invece effettuare il comando
alter system set memory_target=4454350848 scope=spfile;
alter system set memory_max_target=5242880000 scope=spfile;
2.b) Effettuare il restart del db
Se non impostato memory_max_target questo assume il valore di memory_target
Se invece è impostato il valore max ma no il memory_target allora questo assume il valore 0.
Come si abilita ASMM cioè abilitare il controllo automatico della SGA?
1) impostare memory_target = 0 per disabilitare AMM
2) impostare un valore del parametro dinamico sga_target che può aumentare fino al valore sga_max_target (statico). Può essere cambiato con
Questi parametri possono essere impostati ad un valore diverso da 0 che viene considerato come la dimensione minima.
Se si abilita ASMM viene abilitato di default Automatic PGA Memory Management.
Esempio AMM abilitato (memory_max_target <> 0) e ASMM abilitato (sga_target <> 0)
PPer visualizzare le dimensioni delle componenti di memoria quando è abilitato AMM
SQL> column component FORMAT A30
SQL> select component, min_size, max_size
Se AMM è abilitato e anche le Linux hugepages sono abilitate, AMM sovrascriverà l'utilizzo delle Linux hugepages.
select *
from v$parameter
where name in ( 'memory_target', 'memory_max_target','sga_target','sga_max_size' ,
'db_cache_size','shared_pool_size','large_pool_size','java_pool_size','streams_pool_size')
enable AMM
|---> enable Memory Size Advisor
|---> enable ASMM (Automatic Shared Memory Management)
|---> not available PGA Advisor
Se ASMM è abilitato ma no AMM allora SGA Size Advisor è disponibile.
Se AMM è disabilitato allora è possibile abilitare PGA Advisor.
memory_target(MT)
sga_target(ST) E S I T O
------------------------------------------------------------------------------------------------------------
MT=0 AMM è disabilitato
ST=0 ASMM è disabilitato Specificare i valori dei pool
MT=0 AMM è disabilitato
ST>0 ASMM abilitato I pool saranno automaticamente dimensionati.
La memoria SGA e PGA è gestita separatamente.
MT>0 AMM è abilitato Gestione automatica della SGA e PGA
ST=0 ASMM è disabilitato
MT>0 AMM è abilitato Gestione automatica della SGA e PGA
ST>0 ASM è abilitato e la SGA ha un valore minimo definito da ST
ATTENZIONE
ogni volta che si modificano questi parametri assicurarsi di fare una copa del spfile o pfile
Se abilitato ASMM e si vuole cambiare la SGA e la PGA
SQL> show parameter spfile
NAME TYPE VALUE
---------------------------------
spfile string
NAME TYPE VALUE
---------------------------------
spfile string
Se VALUE è Null vuol dire che è stato utilizzato pfile.
Quando si usa spfile il risultato è il seguente:
SQL> show parameter spfile;
NAME TYPE VALUE
------------------------------------ ----------- -----
spfile string /u01/app/oracle/product/18/db_1/dbs/spfileorcl.ora
Creare il file spfile vedere post Create-pfile-from-spfile
Se abilitato ASMM e si vuole cambiare la sga e la pga
SQL> alter system set sga_target=2G scope=spfile;
SQL> alter system set PGA_AGGREGATE_TARGET = 1G scope=spfile;
I nuovi parametri del spfile sono visibili dalla seguente vista ma saranno effettivi solo al riavvio del db.
SQL> select name,value,sid from v$spparameter where name like 'pga%';
pga_aggregate_target
------------------------
1073741824
SQ> select name,value,sid from v$spparameter where name like 'sga%';
sga_target
-------------------
2147483648
Valori attuali
SQL> show parameter sga
NAME TYPE VALUE
------------------------------------ ----------- ----------
lock_sga boolean FALSE
pre_page_sga boolean FALSE
sga_max_size big integer 4768M
sga_target big integer 4768M
SQL> show parameter pga_aggregate_target
NAME TYPE VALUE
------------------------------------ ----------- --------------------
pga_aggregate_target big integer 1588M
SQL> Shutdown
SQL> Startup;
Come si abilita AMM?
1.a) Se il si sta utilizzando il file init.ora è sufficiente modificarlo inserendo i parametri
memory_max_target=5242880000
memory_target=4454350848
2.a) Effettuare stop e start del db.
oppure
1.b) Se si utilizza spfile.ora invece effettuare il comando
alter system set memory_target=4454350848 scope=spfile;
alter system set memory_max_target=5242880000 scope=spfile;
2.b) Effettuare il restart del db
Se non impostato memory_max_target questo assume il valore di memory_target
Se invece è impostato il valore max ma no il memory_target allora questo assume il valore 0.
Come si abilita ASMM cioè abilitare il controllo automatico della SGA?
1) impostare memory_target = 0 per disabilitare AMM
2) impostare un valore del parametro dinamico sga_target che può aumentare fino al valore sga_max_target (statico). Può essere cambiato con
SQL> alter system set sga_target=9G scope=spfile;
Il parametro di inizializzazione statistics_level deve essere impostato a TYPICAL o ALL.
Il parametro di inizializzazione statistics_level deve essere impostato a TYPICAL o ALL.
Per visualizzare la dimensione delle componenti di memoria SGA e PGA.
select name,value /(1024*1024) as Dimensione_MB, isdefault, description
from v$PARAMETER
where name in ( 'sga_max_size' , 'pga_aggregate_target');
I componenti di memoria della SGA vengono automaticamente gestiti
- Default pool of database buffer cache db_cache_size
- shared_pool_size
- large_pool_size
- java_pool_size
- streams_pool_size
Questi parametri possono essere impostati ad un valore diverso da 0 che viene considerato come la dimensione minima.
Se si abilita ASMM viene abilitato di default Automatic PGA Memory Management.
Come si disabilitare ASMM ?
impostare sga_target = 0.
Di conseguenza occorre impostare manualmente le dimensioni dei pool perchè non cambiano più dinamicamente.
Esempio di AMM disabilitato (memory_max_target =0 ) e ASMM disabiliato (sga_target = 0)
DA EM 12c andare sotto Prestazioni > Home Advisor
Esempio AMM abilitato (memory_max_target <> 0) e ASMM abilitato (sga_target <> 0)
PPer visualizzare le dimensioni delle componenti di memoria quando è abilitato AMM
SQL> column component FORMAT A30
SQL> select component, min_size, max_size
from V$MEMORY_DYNAMIC_COMPONENTS;
Storico delle dimensioni delle componenti di memoria
select * from V$MEMORY_RESIZE_OPS;
Risalire al valore SGA_TARGET che è la somma di tutte le dimensioni delle componenti della SGA (in MB)
Attenzione: si tratta di una vista dinamica
select ( (select sum(value) from V$SGA )- ( select current_size from V$SGA_DYNAMIC_FREE_MEMORY))/(1024*1024) "SGA_TARGET"from dual;
Componenti e dimensioni della SGA
SELECT COMPONENT, CURRENT_SIZE, MIN_SIZE, MAX_SIZE from V$SGA_DYNAMIC_COMPONENTS;
Area allocata PGA
SELECT name, value --/(1024*1024) FROM V$PGASTAT where name in ('maximum PGA allocated','total PGA allocated');
Storico delle dimensioni delle componenti di memoria
select * from V$MEMORY_RESIZE_OPS;
Risalire al valore SGA_TARGET che è la somma di tutte le dimensioni delle componenti della SGA (in MB)
Attenzione: si tratta di una vista dinamica
select ( (select sum(value) from V$SGA )- ( select current_size from V$SGA_DYNAMIC_FREE_MEMORY))/(1024*1024) "SGA_TARGET"from dual;
Componenti e dimensioni della SGA
SELECT COMPONENT, CURRENT_SIZE, MIN_SIZE, MAX_SIZE from V$SGA_DYNAMIC_COMPONENTS;
Area allocata PGA
SELECT name, value --/(1024*1024) FROM V$PGASTAT where name in ('maximum PGA allocated','total PGA allocated');
Per passare da Manual Shared Memory Management a ASMM
1) risalire al valore SGA_TARGET che è la somma di tutte le dimensioni delle componenti della SGA
select ( (select sum(value) from V$SGA )- ( select current_size from V$SGA_DYNAMIC_FREE_MEMORY)) "SGA_TARGET"
from dual;
2) impostare il valore del parametro SGA_TARGET
AlTER SYSTEM set SGA_TARGET = <value> [ SCOPE ={SPFILE | MEMORY | BOTH} ]
<value> è il risultato dello step 1 o un valore tra la somma di tutte
4) impostare a 0 il valore della dimensione automatica delle componenti della SGA così che ASMM ricalcola in automatico la memoria per ciascuna componente, modificando il file PFILE o con il comando ALTER SYSTEM …
db_cache_size, shared_pool_size, large_pool_size, java_pool_size, streams_pool_size
1) risalire al valore SGA_TARGET che è la somma di tutte le dimensioni delle componenti della SGA
select ( (select sum(value) from V$SGA )- ( select current_size from V$SGA_DYNAMIC_FREE_MEMORY)) "SGA_TARGET"
from dual;
2) impostare il valore del parametro SGA_TARGET
AlTER SYSTEM set SGA_TARGET = <value> [ SCOPE ={SPFILE | MEMORY | BOTH} ]
<value> è il risultato dello step 1 o un valore tra la somma di tutte
4) impostare a 0 il valore della dimensione automatica delle componenti della SGA così che ASMM ricalcola in automatico la memoria per ciascuna componente, modificando il file PFILE o con il comando ALTER SYSTEM …
db_cache_size, shared_pool_size, large_pool_size, java_pool_size, streams_pool_size
3) Il parametro di inizializzazione statistics_level deve essere impostato a TYPICAL o ALL.
4) restart instance
4) restart instance
Per passare da AMM a ASMM
1) Disabilitare AMM.
AlTER SYSTEM set MEMORY_TARGET = 0 scope=spfile;
Successivamente Oracle imposterà in automatico il valore SGA_TARGET in base al valore attuale della allocazione di memoria della SGA
2) impostare a 0 il valore della dimensione automatica delle componenti della SGA così che ASMM ricalcola in automatico la memoria per ciascun componente
3) restart instance
Per abilitare Manual Shared Memory Management
1) impostare a 0 i parametri di inizializzazione sga_target e memory_target
2) configurare a mano il valore della dimensione delle componenti della SGA tale che la loro somma sia inferiore a sga_max_size.
Per abilitare Automatic PGA Memory Management
1) impostare pga_aggregate_target tra 100MB e 256GB. L'istanza Oracle in automatico gestisce le componenti di memoria e genera le statistiche
2) impostare statistics_level a TYPICAL o ALL
Per disabilitare la Automatic PGA Memory Management
1) impostare pga_aggregate_target = 0
2) impostare i valori di SORT_AREA_SIZE, HASH_AREA_SIZE, BITMAP_MERGE_AREA_SIZE, CREATE_BITMAP_AREA_SIZE
2) restart della istanza.
Questa query mostra come la cache hit-ratio migliora con la dimensione della pga_aggregate_target
SELECT PGA_TARGET_FOR_ESTIMATE/1024/1024 "target mb",
ESTD_PGA_CACHE_HIT_PERCENTAGE "cache_hit%"
FROM V$PGA_TARGET_ADVICE
target mb cache_hit%
---------- -------------------
64 93
128 93
256 93
384 100
512 100
614,399414 100
716,799805 100
819,199219 100
921,599609 100
1024 100
1536 100
2048 100
Per avere un buon PGA hit-ratio impostare pga_aggregate_target a 512M.
Ricorda:
La prima volta che un user process del database Oracle richiede un particolare dato, lo cerca prima nel database buffer cache. Se il processo trova i dati già nella cache (si parla di cache hit), può leggere i dati direttamente dalla memoria. Se il processo non riesce a trovare i dati nella cache (a cache miss), deve prima copiare i data block da un data file su disco in un buffer nella cache e poi ha accesso ai dati.
L'accesso ai dati tramite un cache hit è più rapido dell'accesso ai dati attraverso una miss cache.
AlTER SYSTEM set MEMORY_TARGET = 0 scope=spfile;
Successivamente Oracle imposterà in automatico il valore SGA_TARGET in base al valore attuale della allocazione di memoria della SGA
2) impostare a 0 il valore della dimensione automatica delle componenti della SGA così che ASMM ricalcola in automatico la memoria per ciascun componente
3) restart instance
Per abilitare Manual Shared Memory Management
1) impostare a 0 i parametri di inizializzazione sga_target e memory_target
2) configurare a mano il valore della dimensione delle componenti della SGA tale che la loro somma sia inferiore a sga_max_size.
Per abilitare Automatic PGA Memory Management
1) impostare pga_aggregate_target tra 100MB e 256GB. L'istanza Oracle in automatico gestisce le componenti di memoria e genera le statistiche
2) impostare statistics_level a TYPICAL o ALL
Per disabilitare la Automatic PGA Memory Management
1) impostare pga_aggregate_target = 0
2) impostare i valori di SORT_AREA_SIZE, HASH_AREA_SIZE, BITMAP_MERGE_AREA_SIZE, CREATE_BITMAP_AREA_SIZE
2) restart della istanza.
Questa query mostra come la cache hit-ratio migliora con la dimensione della pga_aggregate_target
SELECT PGA_TARGET_FOR_ESTIMATE/1024/1024 "target mb",
ESTD_PGA_CACHE_HIT_PERCENTAGE "cache_hit%"
FROM V$PGA_TARGET_ADVICE
target mb cache_hit%
---------- -------------------
64 93
128 93
256 93
384 100
512 100
614,399414 100
716,799805 100
819,199219 100
921,599609 100
1024 100
1536 100
2048 100
Per avere un buon PGA hit-ratio impostare pga_aggregate_target a 512M.
Ricorda:
La prima volta che un user process del database Oracle richiede un particolare dato, lo cerca prima nel database buffer cache. Se il processo trova i dati già nella cache (si parla di cache hit), può leggere i dati direttamente dalla memoria. Se il processo non riesce a trovare i dati nella cache (a cache miss), deve prima copiare i data block da un data file su disco in un buffer nella cache e poi ha accesso ai dati.
L'accesso ai dati tramite un cache hit è più rapido dell'accesso ai dati attraverso una miss cache.