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.