Risoluzione dei problemi relativi all'utilizzo elevato della CPU da parte di postgres e servizi postmaster?


28

Sto usando una macchina basata su open source (RHEL 6.2) con software SIEM. Quando eseguo il topcomando, vedo postgresed postmasterentrambi con un utilizzo della CPU del 96%. C'è un modo per individuare o vedere cosa causa l'accumulo di questi servizi?


2
"RHCE 6.2"? Intendi "RHEL 6.2"? Suppongo postgresssia postgrese l'hai appena copiato a mano.
Craig Ringer,

Risposte:


30

Puoi abbinare un ID backend Postgres specifico a un ID processo di sistema usando la pg_stat_activitytabella 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.)


è questa la domanda esatta, non ho molta familiarità con db come sono il secondo ragazzo che lavora su siem, la tua dichiarazione select, devo dargli un pid dal comando principale?
asadz,

1
@asadz no, è stato troncato (risolto ora) - Se hai PID specifici e vuoi vedere cosa stanno funzionando puoi isolarli con una WHEREclausola, 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).
voretaq7,

quando eseguo questa query, non c'è alcun PID che devo sospettare
Fendi Tri Cahyono

Grazie per l'indizio, di recente ho riscontrato un problema simile e ho capito il motivo utilizzando SELECT * FROM pg_stat_activity;
Yao,

14

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.


8

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_connectionse utilizzare un pool di connessioni.

Altrimenti: dettagli, per favore. Uscita completa di top -b -n 1per iniziare.


questo ha senso; poiché il siem viene utilizzato dall'analista per eseguire query su molti dati avanti e indietro; c'è un modo per verificare lo stato del blocco; o condizioni ad esso attribuite; ?
asadz,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.