web-dev-qa-db-fra.com

Dépannage de l'utilisation élevée du processeur des services postgres et postmaster?

J'utilise une machine open source (RHEL 6.2) exécutant le logiciel SIEM. Lorsque j'exécute la commande top, je vois postgres et postmaster avec une utilisation du processeur de 96%. Existe-t-il un moyen de localiser ou de voir ce qui provoque l'empilement de ces services?

29
asadz

Vous pouvez faire correspondre un ID de backend Postgres spécifique à un ID de processus système à l'aide de pg_stat_activity table système.

SELECT pid, datname, usename, query FROM pg_stat_activity; peut être un bon point de départ.
Une fois que vous savez quelles requêtes sont en cours d'exécution, vous pouvez enquêter davantage (EXPLAIN/EXPLAIN ANALYZE; vérifier les serrures, etc.)

30
voretaq7

J'avais le même problème. Le postgresql est installé sur AWS RDS et il avait une utilisation de 100% du processeur même après l'augmentation de l'instance. J'ai débogué avec la méthode indiquée ici et l'une des méthodes a fonctionné pour moi.

J'ai vérifié que la requête s'exécutait le plus longtemps et j'ai appris que certaines requêtes étaient bloquées et fonctionnaient depuis plus de 3 à 4 heures. Pour vérifier depuis combien de temps la requête s'exécute, exécutez la commande suivante:

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

Si cela dure plus d'une heure, c'est bien le problème. Tuez la connexion longue durée et limitez l'âge maximum de la connexion du côté de l'application.

15
Ajeet Khan

Si c'est vraiment le maître de poste qui utilise tout ce CPU, alors vous avez probablement des problèmes de contention de verrouillage, probablement en raison d'un très haut max_connections. Envisagez de réduire max_connections et en utilisant un pool de connexions si c'est le cas.

Sinon: Détails, s'il vous plaît. Sortie complète de top -b -n 1 pour un début.

8
Craig Ringer

Vous pouvez utiliser pg_stat_statements,
https://www.postgresql.org/docs/current/pgstatstatements.html .

Première, pg_stat_activity (des autres réponses) est un bon conseil - et je pense que parfois ce n'est pas suffisant? Il montre l'activité actuelle uniquement, mais que se passe-t-il s'il y a beaucoup de requêtes rapides, qui ne durent pas assez longtemps pour qu'elles aient l'air intéressantes dans pg_stat_activity? Cependant, quand ils sont nombreux, ils peuvent toujours entraîner une utilisation élevée du processeur?

Ensuite, vous pouvez utiliser pg_stat_statements:

pg_stat_statements enregistre les requêtes qui sont exécutées sur votre base de données, en supprime un certain nombre de variables, puis enregistre les données sur la requête, telles que le temps qu'il a fallu, ainsi que ce qui est arrivé aux lectures/écritures sous-jacentes.

(De ce billet de blog: L'extension Postgres la plus utile: pg_stat_statements )

Ici, je l'utilise pour découvrir pourquoi ma propre utilisation du processeur est étonnamment élevée:

\x

select 
  (total_time / 1000 / 3600) as total_hours,
  (total_time / 1000) as total_seconds,
  (total_time / calls) as avg_millis, 
  calls num_calls,
  query 
from pg_stat_statements 
order by 1 desc limit 10;


-[ RECORD 1 ]-+-------------------------
total_hours   | 0.128210291016666
total_seconds | 461.557047659998
avg_millis    | 9.06506889111474
num_calls     | 50916
query         | select p.site_id, p.page_id, p.version current_version, h.page_version cached_version from  ...
-[ RECORD 2 ]-+------------------------
total_hours   | 0.0586912504452778
total_seconds | 211.288501603
avg_millis    | 4.14966517279101
num_calls     | 50917
query         | select p.site_id, p.page_id ... from ...
:
:

Avez-vous remarqué quelque chose, ci-dessus? - Les premières requêtes sont rapides: 0,009 et 0,004 secondes. Mais ils sont appelés plusieurs fois.

1
KajMagnus