Come posso aumentare il numero massimo delle connessioni della mia istanza Amazon RDS per MySQL o Amazon RDS per PostgreSQL?

8 minuti di lettura
0

Desidero aumentare il numero massimo di connessioni per la mia istanza database Amazon Relational Database Service (Amazon RDS) per MySQL o Amazon RDS per PostgreSQL.

Risoluzione

Visualizzazione del valore corrente di max_connections

In Amazon RDS per MySQL, il parametro max_connections monitora il numero massimo impostato di connessioni client simultanee (consentite).

Per impostazione predefinita, il parametro max_connections si basa sulla seguente formula in Amazon RDS per MySQL (calcolata dal valore DBInstanceClassMemory):

max_connections = DBInstanceClassMemory/12582880

Per controllare il valore corrente di max_connections, emetti il seguente comando dopo la connessione all'istanza Amazon RDS per MySQL:

SHOW GLOBAL VARIABLES LIKE 'max_connections';

In Amazon RDS per PostgreSQL, il parametro max_connections monitora il numero massimo impostato di connessioni client simultanee. Per impostazione predefinita, il parametro max_connections si basa sulla seguente formula in Amazon RDS per PostgreSQL (calcolata dal valore DBInstanceClassMemory):

max_connections = LEAST({DBInstanceClassMemory/9531392}, 5000)

Per controllare il valore corrente di max_connections, emetti il seguente comando dopo la connessione all'istanza Amazon RDS per PostgreSQL:

postgres=> show max_connections;

Il valore di default di max_connections sia per RDS per MySQL che per RDS per PostgreSQL dipende dalla classe di istanza utilizzata dall'istanza di Amazon RDS. Una classe di istanza database con più memoria disponibile supporta anche un numero maggiore di connessioni al database.

Tieni presente che il numero di default di max_connections calcolato utilizzando la formula potrebbe variare leggermente dal numero di connessioni di default restituito dal comando precedente. Questo perché parte della memoria della DBInstanceClassMemory totale è riservata alle operazioni del sistema operativo sottostante. Il comando precedente considera solo la memoria riservata per il motore PostgreSQL e non al sistema operativo host sottostante.

Analisi dei motivi di un numero eccessivo di connessioni

Quando il numero di connessioni client supera il valore max_connections, vengono restituiti errori simili ai seguenti:

Le connessioni al database possono superare il valore max_connections per i seguenti motivi:

Aumento del numero di connessioni client/applicazione all'istanza database, causato da un aumento del carico di lavoro o dal blocco a livello di tabella/riga.

Chiusura errata di una connessione client o di un'applicazione dopo la fine di un'operazione: quando una connessione al server non viene chiusa correttamente, l'applicazione client apre una nuova connessione. Nel tempo, queste nuove connessioni del server possono far sì che l'istanza superi il valore max_connections. Per elencare tutte le connessioni attive per l'istanza database RDS per MySQL, emetti il seguente comando:

SHOW FULL PROCESSLIST

Per visualizzare le connessioni per ogni database per l'istanza RDS per PostgreSQL, emetti il seguente comando:

SELECT datname, numbackends FROM pg_stat_database;

Connessioni in sospeso: le connessioni in sospeso, note anche come connessioni aperte inattive, vengono causate quando si impostano valori più alti per i parametri di timeout della connessione, come wait_timeout o interactive_timeout in MySQL. Se configuri un limite di connessione troppo alto, è possibile che si abbia un maggiore utilizzo della memoria anche se tali connessioni non vengono utilizzate. Di conseguenza, quando il server dell'applicazione prova ad aprire tutte le connessioni client al database, queste connessioni potrebbero essere rifiutate. Per terminare una connessione in sospeso in un'istanza database RDS per MySQL, emetti il seguente comando:

CALL mysql.rds_kill(example-pid);

Connessioni inattive: puoi visualizzare le connessioni inattive in un'istanza RDS per PostgreSQL emettendo la seguente query. La seguente query visualizza le informazioni sui processi di back-end con uno dei seguenti stati per più di 15 minuti: "idle", "idle in transaction", "idle in transaction (aborted)" e "disabled".

SELECT * FROM pg_stat_activity
WHERE pid <> pg_backend_pid()
AND state in ('idle', 'idle in transaction', 'idle in transaction (aborted)', 'disabled')
AND state_change < current_timestamp - INTERVAL '15' MINUTE;

Per terminare una connessione inattiva in un'istanza RDS per PostgreSQL, emetti il seguente comando:

SELECT pg_terminate_backend(example-pid)

Suggerimento: è da considerarsi una best practice la configurazione delle sole connessioni attive necessarie per le prestazioni dell'applicazione. Potresti anche prendere in considerazione l'aggiornamento a una classe di istanze database Amazon RDS più ampia.

Aumento del valore di max_connections

Puoi aumentare il numero massimo di connessioni all'istanza database RDS per MySQL o RDS per PostgresSQL utilizzando i seguenti metodi:

  • Imposta un valore maggiore per il parametro max_connections utilizzando un gruppo di parametri personalizzato a livello di istanza. L'aumento del parametro max_connections non causa alcuna interruzione. Anche se è possibile aumentare il valore di max_connections oltre il valore predefinito, questa non è una best practice. Ciò perché l'istanza potrebbe incorrere in problemi quando il carico di lavoro aumenta e viene richiesta una maggiore quantità di memoria. Un aumento del numero di connessioni può aumentare l'utilizzo della memoria. Le istanze in esaurimento della memoria potrebbero essere arrestate in maniera anomala. Questo vale soprattutto per le istanze più piccole. Se aumenti il valore max_connections, assicurati di monitorare l'utilizzo delle risorse. Inoltre, assicurati di consultare l'amministratore del database in merito all'aumento. Quando sono necessarie più connessioni, è consigliabile mantenere il valore predefinito o scalare fino a una classe di istanze più ampia.
  • Se l'istanza database utilizza un gruppo di parametri di default, modifica il gruppo di parametri in un gruppo di parametri personalizzato. Assicurati di associare il gruppo di parametri del database personalizzato all'istanza Amazon RDS per MySQL e riavvia l'istanza. Dopo aver associato il nuovo gruppo di parametri personalizzato all'istanza database, puoi modificare il valore del parametro max_connections. Per ulteriori informazioni, consulta la sezione Come posso modificare i valori di un gruppo di parametri del database di Amazon RDS?
    Nota: la modifica del gruppo di parametri può causare un'interruzione. Per ulteriori informazioni, consulta Utilizzo dei gruppi di parametri del database.
  • Dimensiona l'istanza database fino a una classe di istanza database con più memoria. Tieni presente che il ridimensionamento delle istanze RDS influisce sulla fatturazione dell'account. Per ulteriori informazioni, consulta la sezione Fatturazione delle istanze database per Amazon RDS.
    Avvertenza: i tempi di inattività si verificano quando modifichi un'istanza database di Amazon RDS.

Best practice per la configurazione del parametro max_connections

Quando utilizzi il parametro max_connections per l'istanza database, tieni conto delle seguenti best practice:

  • I limiti di connessione di default vengono regolati per i sistemi che utilizzano i valori di default per altri consumer di memoria principali (ad esempio, il pool di buffer). Una best practice consiste nell'aumentare la classe di istanza invece di modificarne il valore. Tuttavia, se le istanze hanno molta memoria libera, puoi modificare manualmente questo parametro. Prima di modificare queste impostazioni per l'istanza database, prendi in considerazione la possibilità di regolare il limite di connessione per tenere conto dell'aumento o della diminuzione della memoria disponibile nelle istanze database.
  • Imposta max_connections su un valore leggermente più alto rispetto al numero massimo di connessioni che prevedi di aprire in ogni istanza database.
  • Per un'istanza RDS per MySQL, se hai attivato Performance Schema, presta molta attenzione all'impostazione del parametro max_connections. Le strutture di memoria di Performance Schema vengono ridimensionate automaticamente in base alle variabili di configurazione del server. Maggiore è l'impostazione della variabile, maggiore sarà la quantità di memoria utilizzata da Performance Schema. In casi estremi, ciò può causare problemi di memoria insufficiente su tipi di istanze più piccoli come T2 e T3. Se utilizzi Performance Schema, una best practice consiste nel lasciare l'impostazione max_connections sul valore di default. Se prevedi di aumentare in modo significativo il valore max_connections (a un valore superiore al valore di default), valuta la possibilità di disabilitare Performance Schema.
    Nota: se abiliti Performance Insights per un'istanza database Amazon RDS per MySQL, anche Performance Schema viene abilitato automaticamente.
  • Per un'istanza RDS per MySQL, quando regoli il parametro max_connections, verifica i seguenti parametri relativi alla connessione MySQL: wait_timeout: il numero di secondi in cui il server attende l'attività su una connessione TCP/IP o Unix non interattiva prima di chiudere la connessione
    interactive_timeout: il numero di secondi in cui il server attende l'attività su una connessione interattiva prima di chiuderla
    net_read_timeout: il numero di secondi di attesa di ulteriori dati da una connessione TCP/IP prima di eliminare l'attività di lettura
    net_write_timeout: il numero di secondi di attesa sulle connessioni TCP/IP per la scrittura di un blocco prima di eliminare l'attività di scrittura
    max_execution_time: il timeout di esecuzione per le istruzioni SELECT, in millisecondi
    max_connect_errors: un host è bloccato da ulteriori connessioni se vi sono più di questo numero di connessioni interrotte.
    max_user_connections: il numero massimo di connessioni simultanee consentite a un determinato account MySQL.
  • Per un'istanza RDS per PostgreSQL, quando regoli il parametro max_connections, verifica anche i seguenti parametri relativi alla connessione PostgreSQL:
    idle_in_transaction_session_timeout: termina qualsiasi sessione con una transazione aperta che è rimasta inattiva per un periodo superiore alla durata specificata in millisecondi. Ciò consente di rilasciare tutti i blocchi detenuti da quella sessione e di riutilizzare lo slot di connessione. Inoltre, le tuple visibili solo a questa transazione vengono aspirate.
    tcp_keepalives_idle: il numero di secondi di inattività dopo i quali il sistema operativo invia il messaggio TCP keepalive al client
    tcp_keepalives_interval: il numero di secondi dopo i quali un messaggio TCP keepalive non riconosciuto dal client viene nuovamente trasmesso
    tcp_keepalives_count: il numero di keepalive TCP che possono essere persi prima che la connessione del server al client sia considerata morta.

Nota: questo articolo non include i valori consigliati per i parametri elencati perché questi valori variano in base al caso d'uso.