Fehlerbehebung bei hoher CPU-Auslastung durch Postgres- und Postmaster-Dienste?

26

Ich verwende einen Open-Source-Computer (RHEL 6.2), auf dem die SIEM-Software ausgeführt wird. Wenn ich den topBefehl ausführe , sehe ich postgresund postmasterbeide mit 96% CPU-Auslastung. Gibt es eine Möglichkeit, genau zu bestimmen oder festzustellen, warum sich diese Dienste stapeln?

asadz
quelle
2
"RHCE 6.2"? Meinen Sie "RHEL 6.2"? Ich nehme an postgressist postgresund du hast es gerade von Hand kopiert.
Craig Ringer

Antworten:

28

Sie können eine bestimmte Postgres-Backend-ID mithilfe der Systemtabelle mit einer Systemprozess-ID pg_stat_activityabgleichen.

SELECT pid, datname, usename, query FROM pg_stat_activity;kann ein guter Ausgangspunkt sein.
Sobald Sie wissen, welche Abfragen ausgeführt werden, können Sie weitere Nachforschungen anstellen ( EXPLAIN/ EXPLAIN ANALYZE; Sperren überprüfen usw.).

voretaq7
quelle
Ist dies die exakte Abfrage? Ich kenne mich nicht gut mit DB aus, da ich der Sek-Typ bin, der an Siem arbeitet.
Asadz
1
@asadz nein, es wurde abgeschnitten (jetzt behoben) - Wenn Sie bestimmte PIDs haben und sehen möchten, was sie ausführen, können Sie sie mit einer WHEREKlausel isolieren , aber wenn Sie keine große Anzahl von PIDs haben, ist es genauso Einfache Suche in der gesamten Ausgabe. Das Postgres-Handbuch enthält zusätzliche Details zu den möglichen Ergebnissenpg_stat_activity sowie zu den anderen Statistiksammeltabellen (die Ihnen helfen können, wenn Ihr Problem keine Benutzerabfrage ist).
Voretaq7
Wenn ich diese Abfrage durchführe, gibt es keine PID, die ich vermuten muss
Fendi Tri Cahyono
Vielen Dank für den Hinweis. Kürzlich bin ich auf ein ähnliches Problem gestoßen
Yao
14

Ich hatte das gleiche Problem. Das postgresql wurde unter AWS RDS eingerichtet und hatte auch nach dem Erhöhen der Instanz eine 100% ige CPU-Auslastung. Ich habe mit der hier gezeigten Methode debuggt und eine der Methoden hat für mich funktioniert.

Ich habe nach der Abfrage gesucht, die am längsten ausgeführt wurde, und festgestellt, dass bestimmte Abfragen stecken geblieben sind und seit mehr als 3-4 Stunden ausgeführt werden. Führen Sie den folgenden Befehl aus, um zu überprüfen, seit wann die Abfrage ausgeführt wird:

SELECT max(now() - xact_start) FROM pg_stat_activity
                               WHERE state IN ('idle in transaction', 'active');

Wenn dies mehr als eine Stunde ist, ist dies das Problem. Beenden Sie die lang laufende Verbindung und begrenzen Sie das maximale Alter der Verbindung auf der Anwendungsseite.

Ajeet Khan
quelle
7

Wenn dies wirklich der Postmaster ist, der die gesamte CPU verwendet, dann haben Sie wahrscheinlich Probleme mit Sperrenkonflikten, wahrscheinlich aufgrund von sehr hohen Werten max_connections. max_connectionsZiehen Sie in Betracht, in diesem Fall einen Verbindungspooler zu verringern und zu verwenden.

Ansonsten: Details bitte. Volle Leistung top -b -n 1für den Anfang.

Craig Ringer
quelle
das macht Sinn; da der siem vom analytiker verwendet wird, um viele daten hin und her abzufragen; Gibt es eine Möglichkeit, den Sperrstatus zu überprüfen? oder Bedingungen, die ihr zugeschrieben werden; ?
Asadz