Perché la mia istanza database Amazon RDS utilizza la memoria di swap quando la memoria è sufficiente?

6 minuti di lettura
0

Sto eseguendo un'istanza database di Amazon Relational Database Service (Amazon RDS). Utilizza quantità elevate di memoria di swap anche se ho abbastanza memoria libera allocata. Perché viene utilizzata la memoria di swap quando la memoria è sufficiente?

Breve descrizione

Le istanze Amazon Elastic Compute Cloud (Amazon EC2) che eseguono Linux utilizzano la memoria di swap quando un sistema richiede più memoria di quella allocata. Per ulteriori informazioni, consulta Volumi di swap dell'archivio dell'istanza. Poiché la maggior parte delle istanze database RDS utilizza Linux (ad eccezione di SQL Server), il database a volte può utilizzare la memoria di swap.

Le istanze database RDS richiedono pagine nella RAM solo quando le pagine sono attualmente accessibili, ad esempio quando si eseguono query. Le altre pagine che vengono introdotte nella RAM mediante interrogazioni eseguite in precedenza vengono scaricate per sostituire spazio se non sono state utilizzate di recente. È consigliabile consentire al sistema operativo (OS) di scambiare le pagine più vecchie invece di forzare il sistema operativo a conservare le pagine in memoria. Questo assicura che sia disponibile una quantità sufficiente di RAM libera per le domande imminenti.

L'utilizzo della memoria di swap di Linux non viene cancellato frequentemente perché la cancellazione dell'utilizzo della memoria di swap richiede un sovraccarico aggiuntivo per riallocare la memoria di swap quando è necessario e quando si ricaricano le pagine. Di conseguenza, se lo spazio di swap viene utilizzato sull'istanza database RDS, anche una sola volta, le metriche SwapUsage non tornano a zero. La memoria di swap può essere utilizzata anche se utilizzi HugePages supportati da Amazon RDS per Oracle e HugePages su Amazon RDS per PostgreSQL. Le pagine HugePages sono più grandi della dimensione predefinita di Linux di due megabyte.

Risoluzione

Per comprendere il comportamento di utilizzo dello spazio di swap per la tua istanza database RDS, controlla innanzitutto le metriche delle prestazioni del database in base al carico di lavoro dell'applicazione. Controlla i parametri FreeableMemory e SwapUsage di Amazon CloudWatch per comprendere il modello complessivo di utilizzo della memoria della tua istanza database RDS. Controlla queste metriche per verificare se la riduzione della metrica FreeableMemory si verifica contemporaneamente a un aumento della metrica SwapUsage. Ciò può indicare che c'è una pressione sulla memoria dell'istanza database RDS. Per ulteriori informazioni, consulta Come faccio a risolvere il problema della scarsa memoria liberabile in un database Amazon RDS per MySQL? Se è disponibile una quantità sufficiente di memoria liberabile, l'utilizzo dello swap non dovrebbe influire sulle prestazioni dell'istanza database RDS. Se la memoria liberabile rimane costantemente bassa, è possibile modificare la dimensione dell'istanza database RDS con un'istanza più grande con più memoria.

Per monitorare la memoria di swap, attiva il monitoraggio avanzato per rivedere le metriche a intervalli con una granularità di appena un secondo. Il monitoraggio avanzato raccoglie statistiche a livello di host e CloudWatch raccoglie dati a livello di hypervisor ogni 60 secondi. Usa il monitoraggio avanzato per identificare gli aumenti o le diminuzioni che si verificano solo per un secondo e per vedere la CPU e la memoria utilizzate dai singoli processi. Per ulteriori informazioni, consulta Viewing OS metrics using CloudWatch logs.

Puoi anche attivare Performance Insights per identificare gli eventi SQL e di attesa che consumano swap o memoria eccessivi sull'istanza database RDS. Performance Insights raccoglie i dati a livello di database e li visualizza nella dashboard di Performance Insights. Performance Insights può aiutarti a risolvere i problemi relativi alle prestazioni del database. Per ulteriori informazioni, consulta Monitoring DB load with Performance Insights on Amazon RDS.

Amazon RDS per MySQL

Se hai poca memoria liberabile, esegui SHOW FULL PROCESSLIST per esaminare tutti i thread in esecuzione sul tuo database. L'ID del processo dall'output di SHOW FULL PROCESSLIST non corrisponderà all'ID del processo visualizzato da Enhanced Monitoring. Per visualizzare l'ID di processo corretto, modifica il gruppo di parametri database associato al database con il parametro Performance_Schema. Si tratta di un parametro statico, pertanto è necessario riavviare l'istanza database RDS. Per evitare tempi di inattività, modifica il parametro e riavvia il database al di fuori delle ore di punta del traffico. Dopo che la memoria ha raggiunto l'utilizzo desiderato, procedi nel seguente modo:

1.    Ordina gli ID dei processi nella pagina Monitoraggio avanzato in modo da poter visualizzare l'ID dei processi che consumano il massimo della CPU.

2.    Esegui la seguente query come utente principale:

select * from performance_schema.threads where THREAD_OS_ID in (ID shown in the Enhanced Monitoring window)\G

Ad esempio, se la memoria massima viene consumata da Thread_OS_Id 10374 e 1432, esegui la seguente query:

select * from performance_schema.threads where THREAD_OS_ID in (10374, 1432)\G

Per ulteriori informazioni, vedi la tabella dei thread sul sito Web MySQL.

3.    Ottieni la colonna PROCESSLIST_ID dall'output di questa query. Ciò fornisce l'ID del processo che corrisponde al valore dell'ID del processo di SHOW FULL PROCESSLIST.

Dopo aver ottenuto l'ID del processo corretto, è possibile mappare l'ID del processo con la query. È possibile utilizzare l'ID per identificare la causa principale dell'elevato utilizzo della memoria e della CPU. È possibile visualizzare il processo del sistema operativo utilizzando il monitoraggio avanzato. Per ulteriori informazioni, consulta Viewing OS metrics in the RDS console.

Amazon RDS per PostgreSQL

Per identificare il processo che consuma quantità elevate di memoria, associa l'ID del processo nell'elenco dei processi di monitoraggio avanzato alla query esatta. Per identificare il processo, esegui la seguente vista pg_stat_activity:

select * from pg_stat_activity where pid=(the PID of your process);

Quindi, ottimizza le query per consumare meno risorse di elaborazione.

Amazon RDS per SQL Server

Il monitoraggio avanzato potrebbe identificare un ID thread specifico che consuma quantità elevate di memoria. L'ID del thread è ciò che SQL Server chiama Kernal process ID (KPID).

Da Amazon RDS per SQL Server, esegui la seguente query per ottenere l'ID del processo del server (SPID) che corrisponde al KPID:

select * from sys.sysprocesses where kpid = '<Value of Thread ID from Enhanced Monitoring>' ;

Dopo aver ottenuto l'ID del processo del server, ad esempio 69, esegui il seguente comando per esaminare cosa viene fatto da SPID 69:

dbcc inputbuffer(69)

Amazon RDS per Oracle

Utilizzando l'ID del processo del sistema operativo del monitoraggio avanzato, puoi vedere quale processo sta consumando più memoria. Quindi, esegui la seguente query per ottenere l'indirizzo del processo per la sessione:

select ADDR from v$process where SPID=OS_PID;

È possibile utilizzare l'indirizzo del processo per identificare la sessione all'interno del database eseguendo la seguente query:

select sid,serial#,username, status from v$session where PADDR='<ADDR from above query>';

Informazioni correlate

Panoramica del monitoraggio di Amazon RDS