57 votes

Linux utilisation du CPU et historique d'exécution des processus

Y a-t-il un moyen de voir quel(s) processus ont causé la plus forte utilisation du CPU ?

J'ai AMAZON EC2 Linux dont l'utilisation du CPU atteint 100 pour cent et me force à redémarrer le système. Je ne peux même pas me connecter via SSH (en utilisant putty).

Y a-t-il un moyen de voir ce qui cause une utilisation aussi élevée du CPU et quel processus en est la cause ?

Je connais les commandes sar et top mais je n'ai pas pu trouver d'historique d'exécution des processus n'importe où. Voici l'image de l'outil de surveillance d'Amazon EC2, mais j'aimerais savoir quel processus l'a causé :

entrer la description de l'image ici

J'ai également essayé ps -eo pcpu,args | sort -k 1 -r | head -100 mais je n'ai pas eu de chance à trouver une utilisation du CPU aussi élevée.

51voto

Matthew Ife Points 22370

Il y a quelques façons possibles de faire cela. Notez qu'il est tout à fait possible que ce soit de nombreux processus dans un scénario de fuite qui causent cela, pas seulement un.

La première façon est de configurer pidstat pour s'exécuter en arrière-plan et produire des données.

pidstat -u 600 >/var/log/pidstats.log & disown $!

Cela vous donnera un aperçu assez détaillé du fonctionnement du système à intervalles de dix minutes. Je vous suggère de commencer par là car cela produit les données les plus précieuses/fiables avec lesquelles travailler.

Il y a un problème avec cela, principalement si la box entre dans une boucle CPU en fuite et produit une charge élevée - vous n'êtes pas garanti que votre processus réel s'exécutera en temps voulu pendant la charge (si jamais) donc vous pourriez en fait manquer la sortie!

La deuxième façon de chercher cela est d'activer la comptabilité des processus. Peut-être plus une option à long terme.

accton on

Cela activera la comptabilité des processus (si ce n'était pas déjà ajouté). S'il ne fonctionnait pas avant, cela prendra du temps pour s'exécuter.

Ayant été exécuté, par exemple 24 heures - vous pouvez ensuite exécuter une commande telle que celle-ci (qui produira une sortie comme ceci)

# sa --percentages --separate-times
     108  100.00%       7.84re  100.00%       0.00u  100.00%       0.00s  100.00%         0avio     19803k
       2    1.85%       0.00re    0.05%       0.00u   75.00%       0.00s    0.00%         0avio     29328k   troff
       2    1.85%       0.37re    4.73%       0.00u   25.00%       0.00s   44.44%         0avio     29632k   man
       7    6.48%       0.00re    0.01%       0.00u    0.00%       0.00s   44.44%         0avio     28400k   ps
       4    3.70%       0.00re    0.02%       0.00u    0.00%       0.00s   11.11%         0avio      9753k   ***other*
      26   24.07%       0.08re    1.01%       0.00u    0.00%       0.00s    0.00%         0avio      1130k   sa
      14   12.96%       0.00re    0.01%       0.00u    0.00%       0.00s    0.00%         0avio     28544k   ksmtuned*
      14   12.96%       0.00re    0.01%       0.00u    0.00%       0.00s    0.00%         0avio     28096k   awk
      14   12.96%       0.00re    0.01%       0.00u    0.00%       0.00s    0.00%         0avio     29623k   man*
       7    6.48%       7.00re   89.26%       0.00u    0.00%       0.00s    

Les colonnes sont commandées comme suit:

  1. Nombre d'appels
  2. Pourcentage d'appels
  3. Montant du temps réel passé sur tous les processus de ce type.
  4. Pourcentage.
  5. Temps d'UC utilisateur
  6. Pourcentage
  7. Temps CPU système.
  8. Appels IO moyens.
  9. Pourcentage
  10. Nom de la commande

Vous chercherez les types de processus qui génèrent le plus de temps CPU utilisateur/système.

Cela décompose les données en fonction de la quantité totale de temps CPU (la ligne supérieure) puis comment ce temps CPU a été réparti. La comptabilité des processus ne fonctionne correctement que lorsqu'elle est activée au moment où les processus sont générés, il est donc probablement préférable de redémarrer le système après l'avoir activée pour s'assurer que tous les services sont pris en compte.

Cela ne vous donne en aucun cas une idée définitive de quel processus pourrait être la cause de ce problème, mais cela pourrait vous donner une bonne idée. Comme il pourrait s'agir d'un instantané de 24 heures, il est possible d'obtenir des résultats biaisés, donc gardez cela à l'esprit. De plus, il devrait toujours se connecter car il s'agit d'une fonction du noyau et contrairement à pidstat produira toujours des sorties même en cas de charge importante.

La dernière option disponible utilise également la comptabilité des processus, vous pouvez donc l'activer comme ci-dessus, puis utiliser le programme "lastcomm" pour produire des statistiques sur les processus exécutés autour du moment du problème ainsi que des statistiques CPU pour chaque processus.

lastcomm | grep "May  8 22:[01234]"
kworker/1:0       F    root     __         0.00 secs Tue May  8 22:20
sleep                  root     __         0.00 secs Tue May  8 22:49
sa                     root     __         0.00 secs Tue May  8 22:49
sa                     root     __         0.00 secs Tue May  8 22:49
sa                   X root     __         0.00 secs Tue May  8 22:49
ksmtuned          F    root     __         0.00 secs Tue May  8 22:49
awk                    root     __         0.00 secs Tue May  8 22:49

Cela pourrait également vous donner des indices sur ce qui pourrait causer le problème.

0 votes

Très belle et détaillée réponse, bon travail!

2 votes

MIfe, si vous n'avez pas utilisé atop, essayez-le ! Il rassemble les mêmes informations que pidstat mais les présente dans une interface beaucoup plus adaptée à l'exploration interactive. Il dispose également d'une commande atopsar si vous préférez les rapports de style sar.

0 votes

Juste une note, ceci est une réponse de 12 ans. BPF et execsnoop sont les moyens d'avancer maintenant.

27voto

Tom Points 720

Atop est un démon particulièrement pratique pour examiner les détails au niveau des processus et archive par défaut ces données pendant 28 jours. En plus de présenter une interface de surveillance en temps réel impressionnante, vous pouvez spécifier les fichiers journaux à ouvrir et les parcourir.

L'article donne une idée des capacités, et vous pouvez en trouver davantage dans la page de manuel.

C'est vraiment un merveilleux logiciel.

4voto

Janne Pikkarainen Points 31244

Des programmes tels que psmon et monit peuvent vous être utiles. Ces derniers peuvent surveiller les processus s'exécutant sur votre système et si un seuil (utilisation du CPU, utilisation de la mémoire...) est dépassé, vous pouvez les configurer pour vous envoyer un rapport par e-mail sur ce qui se passe.

Il est également possible de redémarrer automatiquement les processus qui posent problème.

1voto

Didix Points 119

Script Bash pour enregistrer dans un fichier journal

Je vais ajouter ma solution séparément car elle ne nécessite aucune installation de package par rapport aux autres réponses. (Ubuntu 23.10)

Pour ajouter à l'idée de rackandboneman, voici mon script pour enregistrer les ressources dans un fichier journal.

#!/bin/bash

LOGFILE="/var/log/resource_monitor.log"
echo "------" >> $LOGFILE

date >> $LOGFILE
top -b -n 1 | head -n 20 >> $LOGFILE
free -h >> $LOGFILE 
df -h >> $LOGFILE 
  • date ajoute la date et l'heure à l'entrée du journal
  • top pour prendre un instantané des processus utilisant le plus CPU.
  • head limite la sortie aux premières lignes
  • free pour voir l'utilisation de la mémoire
  • df pour voir l'utilisation du disque
  • -h le rend lisible par l'homme

Adaptez librement selon vos besoins

Rendre le script exécutable

chmod +x resource_monitor.sh

Créer une tâche récurrente

Ouvrez l'éditeur CRON avec la commande : crontab -e

Ajoutez une ligne pour exécuter votre script à intervalles réguliers. Par exemple, pour exécuter le script toutes les 5 minutes

*/5 * * * * /lien/vers/resource_monitor.sh

Plus de documentation sur les tâches cron: help.ubuntu.com/community/CronHowto

Sortie

Voici un exemple de sortie :

Dim Mar 3 00:15:01 UTC 2024

---CPU---
top - 00:15:01 up  8:27,  0 utilisateur,  charge moyenne: 0.43, 0.51, 0.54
Tâches: 154 au total,   1 en cours d'exécution, 153 en attente,   0 arrêtées,   0 zombi
%Cpu(s):  0.0 utilisateur, 25.0 système,  0.0 utilisateur, 50.0 inactif, 25.0 en attente,  0.0 hi,  0.0 sin,  0.0 st 
MiB Mem :   3810.3 total,    112.6 libre,   3730.7 utilisé,    178.9 buff/cache     
MiB Swap :      0.0 total,      0.0 libre,      0.0 utilisé,     79.6 Mem dispo 

    PID USER      PR  NI    VIRT    RES    SHR S  %CPU  %MEM     TIME+ COMMANDE
  88411 ubuntu    20   0 5903644   2.5g   1636 S  43.8  68.1 190:12.21 java
     62 root      20   0       0      0      0 S   6.2   0.0   1:22.84 kswapd0
   3869 darwin    20   0 1180964 275688   4992 S   6.2   7.1   1:09.69 node
 175975 darwin    20   0   12268   5248   3200 R   6.2   0.1   0:00.01 top
      1 root      20   0  168936   8544   4832 S   0.0   0.2   0:27.17 systemd
      2 root      20   0       0      0      0 S   0.0   0.0   0:00.00 kthreadd
      3 root       0 -20       0      0      0 I   0.0   0.0   0:00.00 rcu_gp
      4 root       0 -20       0      0      0 I   0.0   0.0   0:00.00 rcu_par+
      5 root       0 -20       0      0      0 I   0.0   0.0   0:00.00 slub_fl+
      6 root       0 -20       0      0      0 I   0.0   0.0   0:00.00 netns
      8 root       0 -20       0      0      0 I   0.0   0.0   0:00.00 kworker+
     11 root       0 -20       0      0      0 I   0.0   0.0   0:00.00 mm_perc+
     12 root      20   0       0      0      0 I   0.0   0.0   0:00.00 rcu_tas+

---RAM---
               total        utilisé        libre      partagé  buff/cache   disponible
Mem :           3.7Gi       3.6Gi       120Mi       2.8Mi       171Mi        83Mi
Swap :             0B          0B          0B

---DD---
Système de fichiers      Taille  Utilisé Disponible Uti% Monté sur
tmpfs           382M  1.4M  380M   1% /run
/dev/sda1        78G  6.9G   71G   9% /
tmpfs           1.9G     0  1.9G   0% /dev/shm
tmpfs           5.0M     0  5.0M   0% /run/lock
/dev/sda15      105M  6.1M   99M   6% /boot/efi
tmpfs           382M  4.0K  382M   1% /run/user/1001

J'espère que cela vous aidera

0voto

Alex Points 1

Les années ont apporté quelques bonnes options open source légères, comme ttop.

  1. Téléchargez le binaire depuis github ou compilez-le vous-même

  2. Configurez-le pour s'exécuter toutes les minutes (par défaut, il capture les statistiques système toutes les 10 minutes):

    ttop --on 1
  3. Lorsque vous avez collecté certaines statistiques (/var/log/ttop/*) vous pouvez exécuter l'interface utilisateur textuelle ttop et parcourir les statistiques historiques pour trouver des périodes où l'utilisation du CPU/MEM était élevée et voir quelles processus en étaient responsables.

Capture d'écran de ttop

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X