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

28

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

asadz
la source
2
"RHCE 6.2"? Vous pensez "RHEL 6.2"? Je suppose postgressest - postgreset vous venez de copier à la main.
Craig Ringer

Réponses:

30

Vous pouvez faire correspondre un ID de backend Postgres spécifique à un ID de processus système à l'aide de la pg_stat_activitytable 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.)

voretaq7
la source
est-ce la requête exacte, je ne suis pas très familier avec db car je suis le gars sec travaillant sur siem, votre instruction select, dois-je le nourrir pid à partir de la commande supérieure?
asadz
1
@asadz non, il a été tronqué (corrigé maintenant) - Si vous avez des PID spécifiques et que vous voulez voir ce qu'ils exécutent, vous pouvez les isoler avec une WHEREclause, 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).
voretaq7
quand j'exécute cette requête, il n'y a aucun PID que je
doive
Merci pour l'indice, récemment, j'ai rencontré un problème similaire et trouvé la raison en utilisant SELECT * FROM pg_stat_activity;
Yao
14

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.

Ajeet Khan
la source
8

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_connectionset 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 1pour commencer.

Craig Ringer
la source
cela a du sens; puisque le siem est utilisé par l'analyste pour interroger beaucoup de données dans les deux sens; existe-t-il un moyen de vérifier l'état du verrou; ou des conditions qui lui sont attribuées; ?
asadz