Come gestisco i problemi relativi ai bassi livelli di memoria libera o all'utilizzo ad alto scambio nella mia istanza Amazon RDS for Oracle Database?

Ultimo aggiornamento: 30/09/2021

Desidero gestire i problemi relativi ai bassi livelli di memoria libera o all'utilizzo ad alto scambio in Amazon Relational Database Service (Amazon RDS) per l'istanza database Oracle.

Breve descrizione

Nei database Oracle, la memoria disponibile viene utilizzata principalmente dall'area globale del programma (PGA) e dall'area globale del sistema (SGA). Quando si configura un'istanza database Oracle, assicurarsi che la somma di questi due componenti sia inferiore alla memoria fisica totale per rendere disponibile la memoria libera per altri processi e funzionalità host. È necessario regolare i parametri di memoria per evitare un utilizzo ad alto scambio e l'utilizzo di grandi quantità di memoria fisica. Per ulteriori informazioni sull'utilizzo dello scambio e sui limiti consigliati, consulta Perché la mia istanza database Amazon RDS utilizza la memoria di scambio quando ho memoria sufficiente?

Se l'istanza database utilizza la gestione automatica della memoria, la quantità totale di memoria utilizzata dai database Oracle viene gestita dai parametri MEMORY_TARGET e MEMORY_MAX_TARGET. Il valore impostato in MEMORY_TARGET è uguale alla somma di SGA e PGA. La memoria utilizzata da SGA è determinata dai parametri SGA_MAX_SIZE e SGA_TARGET. La memoria utilizzata da PGA è gestita dai parametri PGA_AGGREGATE_TARGET e PGA_AGGREGATE_LIMIT. I valori predefiniti per questi parametri sono impostati su valori elevati per motivi di prestazioni. Tuttavia, in alcuni casi d'uso, questi valori elevati possono causare conflitti di memoria e un utilizzo ad alto scambio.

Risoluzione

Per risolvere il problema, utilizza uno dei seguenti metodi in base alla modalità di gestione della memoria dell'istanza.

  • Se l'istanza database utilizza la gestione automatica della memoria, diminuisci il valore di MEMORY_TARGET.
  • Se l'istanza database utilizza la gestione automatica della memoria condivisa, riduci i valori dei parametri PGA e SGA nell'istanza.

Nota: sebbene questi parametri siano dinamici, è necessario riavviare l'istanza senza failover affinché questi parametri possano essere modificati. Per ulteriori informazioni, vedere la Nota in Abilitazione di HugePages per un'istanza database Oracle.

Prova ad eseguire i seguenti passaggi per la risoluzione dei problemi:

1.    Verifica se l'istanza database utilizza la gestione automatica della memoria o la gestione automatica della memoria condivisa. Ciò è fattibile controllando i parametri SGA, PGA e MEMORY_TARGET:

SQL> SHOW PARAMETER SGA;

SQL> SHOW PARAMETER PGA;

SQL> SHOW PARAMETER MEMORY_TARGET;
  • Se MEMORY_TARGET è impostato, l'istanza utilizza la gestione automatica della memoria.
  • Se MEMORY_TARGET non è impostato, ma SGA_TARGET e PGA_AGGREGATE_TARGET sono impostati, l'istanza utilizza la gestione automatica della memoria condivisa.

Per ulteriori informazioni sulle diverse modalità di gestione della memoria, consulta la documentazione Oracle per Informazioni sulla gestione della memoria.

2.    Eseguire le seguenti query per visualizzare l'utilizzo della memoria da parte di PGA e SGA, rispettivamente:

SQL> SELECT (value/1024/1024) CURRENT_PGA_IN_USE_IN_MB FROM V$PGASTAT WHERE NAME ='total PGA inuse';

SQL> SELECT SUM (bytes/1024/1024) CURRENT_SGA_SIZE_IN_MB FROM V$SGASTAT;

Eseguire le seguenti query per visualizzare la memoria massima allocata per PGA e SGA, rispettivamente, dopo l'ultimo riavvio:

SQL> SELECT (value/1024/1024) MAX_PGA_ALLOCATED_IN_MB FROM V$PGASTAT WHERE NAME = 'maximum PGA allocated';

SQL> SELECT SUM (bytes/1024/1024) MAX_SGA_SIZE_IN_MB FROM V$SGAINFO WHERE NAME='Maximum SGA Size';

Eseguire le seguenti query per visualizzare le viste di avviso per PGA e SGA, rispettivamente:

SQL> SELECT PGA_TARGET_FOR_ESTIMATE,
PGA_TARGET_FACTOR, ADVICE_STATUS, ESTD_TIME, ESTD_PGA_CACHE_HIT_PERCENTAGE FROM
V$PGA_TARGET_ADVICE ORDER BY PGA_TARGET_FACTOR;

SQL> SELECT SGA_SIZE,
SGA_SIZE_FACTOR, ESTD_DB_TIME_FACTOR, ESTD_PHYSICAL_READS FROM
V$SGA_TARGET_ADVICE ORDER BY SGA_SIZE ASC;

3.    Definire le impostazioni appropriate per i parametri di memoria per evitare un consumo eccessivo di memoria e un utilizzo ad alto scambio. Queste impostazioni consentono inoltre di ottimizzare il database per migliorare le prestazioni. È possibile modificare uno qualsiasi dei parametri in questi esempi utilizzando il gruppo di parametri di istanza.

Se l'istanza utilizza la gestione automatica della memoria, viene impostato solo il parametro MEMORY_TARGET. Questo parametro è impostato sul seguente valore, per impostazione predefinita:

MEMORY_TARGET = MEMORY_MAX_TARGET = {dbInstanceClassMemory*3/4}

Se l'istanza utilizza la gestione automatica della memoria condivisa, i parametri PGA_AGGREGATE_TARGET e SGA_TARGET vengono impostati rispettivamente sui seguenti valori predefiniti:

PGA_AGGREGATE_TARGET= {DBInstanceClassMemory*1/8}

SGA_TARGET = SGA_MAX_SIZE = {DBInstanceClassMemory*3/4}

Se l'utilizzo della memoria con queste impostazioni predefinite è elevato, è possibile regolare le impostazioni predefinite per limitare la memoria utilizzata dall'istanza Oracle. È possibile utilizzare le viste di avviso di memoria precedenti per regolare i parametri di memoria. Come da best practice, è consigliabile ottimizzare i parametri di memoria in un ambiente di test prima di applicare le modifiche ai database di produzione.

Ad esempio:

Se l'istanza è la gestione automatica della memoria, riduci solo i valori MEMORY_TARGET e MEMORY_MAX_TARGET:

MEMORY_TARGET = MEMORY_MAX_TARGET = {dbInstanceClassMemory*1/2}

-oppure-

MEMORY_TARGET = MEMORY_MAX_TARGET = {dbInstanceClassMemory*3/5}

-oppure-

MEMORY_TARGET = MEMORY_MAX_TARGET = {dbInstanceClassMemory*2/3}

Se l'istanza utilizza la gestione automatica della memoria condivisa, riduci solo i parametri di memoria di SGA e/o PGA in base ai valori di avviso mostrati nel passaggio precedente. Ad esempio:

SGA_TARGET = {dbInstanceClassMemory*1/2}

-oppure-

SGA_TARGET = {dbInstanceClassMemory*2/3}

È inoltre possibile regolare l'utilizzo della memoria dell'area di memoria del programma impostando il seguente valore per PGA_AGGREGATE_TARGET:

PGA_AGGREGATE_TARGET = {dbInstanceClassMemory*1/12}

4.    In alcuni casi d'uso, l'utilizzo della memoria da parte del PGA potrebbe superare il valore PGA_AGGREGATE_TARGET e raggiungere il valore impostato nel parametro PGA_AGGREGATE_LIMIT. Il valore predefinito di PGA_AGGREGATE_LIMIT dipende dalla configurazione della memoria dell'istanza del database. Per ulteriori informazioni, vedere la documentazione Oracle per PGA_AGGREGATE_LIMIT. Se il valore predefinito di PGA_AGGREGATE_LIMIT è molto alto, l'istanza RDS potrebbe avere una memoria fisica molto bassa o assente per l'host sottostante, causando un utilizzo ad alto scambio e problemi di conflitto di memoria.

Per risolvere questi casi d'uso, individua i processi o le query che utilizzano una quantità elevata di PGA. Esegui la seguente query per visualizzare l'allocazione dell'area di programma per processo:

SQL> SELECT spid, program, round(pga_max_mem/1024/1024) max_MB, round(pga_alloc_mem/1024/1024)alloc_MB, round(pga_used_mem/1024/1024) used_MB, round(pga_freeable_mem/1024/1024) free_MB FROM V$PROCESS ORDER BY 3;

Esegui la seguente query per visualizzare l'utilizzo della memoria da parte di PGA per le sessioni utente, esclusi i processi in background:

SQL> SELECT sum(p.pga_max_mem)/1024/1024 "PGA MAX MEMORY OF USER SESSION (MB)" FROM v$process p, v$session s WHERE P.ADDR = S.paddr and s.username IS NOT NULL;

Esegui la seguente query per visualizzare l'utilizzo della memoria da parte di PGA per sessione e le query eseguite da ogni sessione:

SQL> SELECT s.username, p.pga_max_mem/1024/1024 "PGA MEMORY OF USER SESSION (MB)", q.sql_text FROM v$process p, v$session s, v$SQL q WHERE P.ADDR = S.paddr AND s.username IS NOT NULL AND s.sql_id = q.sql_id ORDER BY 2;

Per ridurre l'elevato utilizzo della memoria da parte di PGA, utilizza uno o più dei seguenti metodi:

  • Limita il valore di PGA_AGGREGATE_LIMIT. Ciò potrebbe impedire all'istanza di esaurire la memoria. Tuttavia, potrebbe causare errori di connessione quando è necessaria memoria PGA aggiuntiva per un processo.
  • Riduci il valore SGA_TARGET in modo appropriato. Ciò consente a PGA_AGGREGATE_TARGET di aumentare fino al valore di PGA_AGGEGATE_LIMIT senza causare problemi di conflitto di memoria.
  • Aumenta la dimensione della classe di istanza a un'istanza di dimensioni maggiori con più memoria.

5.    Dopo aver regolato i parametri di memoria come indicato nei passaggi precedenti, monitorare le prestazioni del database e consultare le viste di avviso del database. Se la limitazione dei parametri di memoria causa un peggioramento delle prestazioni, prova ad aumentare le dimensioni dell'istanza. Ciò consente un maggiore utilizzo della memoria per l'istanza del database in modo efficiente. È possibile utilizzare il pannello di controllo di Performance Insights per analizzare il carico di lavoro del database e identificare le query con il massimo utilizzo della memoria. Quindi, è possibile ottimizzare queste query con il massimo utilizzo della memoria per utilizzare meno memoria.


Documentazione Oracle per l'architettura di memoria

Questo articolo è stato utile?


Hai bisogno di supporto tecnico o per la fatturazione?