Risposte:
Puoi abbinare un ID backend Postgres specifico a un ID processo di sistema usando la pg_stat_activity
tabella di sistema.
SELECT pid, datname, usename, query FROM pg_stat_activity;
può essere un buon punto di partenza.
Una volta che sai quali query sono in esecuzione puoi indagare ulteriormente ( EXPLAIN
/ EXPLAIN ANALYZE
; controllare i blocchi, ecc.)
WHERE
clausola, ma se non hai un numero enorme di PID è proprio come facile da cercare in tutto l'output. Il manuale di Postgres contiene ulteriori dettagli su ciò che puoi ottenerepg_stat_activity
, oltre alle altre tabelle di raccolta statistiche (che possono aiutarti se il tuo problema non è una query dell'utente).
Stavo avendo lo stesso problema. Postgresql è configurato su AWS RDS e stava utilizzando il 100% della CPU anche dopo aver aumentato l'istanza. Ho eseguito il debug con il metodo mostrato qui e uno dei metodi ha funzionato per me.
Ho controllato la query in esecuzione per il tempo più lungo e ho scoperto che alcune query erano bloccate e funzionavano da più di 3-4 ore. Per controllare da quanto tempo è in esecuzione la query, eseguire il comando seguente:
SELECT max(now() - xact_start) FROM pg_stat_activity
WHERE state IN ('idle in transaction', 'active');
Se è più di un'ora, questo è il problema. Uccidere la connessione a lungo termine e limitare l'età massima della connessione dal lato dell'applicazione.
Se questo è davvero il postmaster che utilizza tutta quella CPU, allora probabilmente hai problemi di contesa di blocco, probabilmente a causa di un livello molto alto max_connections
. In questo caso, considerare la possibilità di ridurre max_connections
e utilizzare un pool di connessioni.
Altrimenti: dettagli, per favore. Uscita completa di top -b -n 1
per iniziare.
postgress
siapostgres
e l'hai appena copiato a mano.