Réponses:
Vous pouvez faire correspondre un ID de backend Postgres spécifique à un ID de processus système à l'aide de la 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 verrous, etc.)
WHERE
clause, mais si vous n'avez pas un grand nombre de PID, c'est tout comme facile à rechercher à travers la sortie complète. Le manuel de Postgres contient des détails supplémentaires sur ce que vous pouvez retirerpg_stat_activity
, ainsi que les autres tableaux de statistiques (qui peuvent vous aider si votre problème n'est pas une requête utilisateur).
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 présentée ici et l'une des méthodes a fonctionné pour moi.
J'ai vérifié la requête en cours d'exécution 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 c'est plus d'une heure, alors c'est le problème. Tuez la connexion longue durée et limitez l'âge maximum de la connexion du côté de l'application.
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 niveau très élevé max_connections
. Envisagez d'abaisser max_connections
et d'utiliser un pool de connexions si tel est le cas.
Sinon: Détails, s'il vous plaît. Sortie complète de top -b -n 1
pour commencer.
postgress
est -postgres
et vous venez de copier à la main.