143 votes

Comment puis-je mesurer l'utilisation séparée du processeur pour un cœur de CPU?

Y a-t-il un moyen de mesurer l'utilisation spécifique du processeur d'un processus par coeurs?

Je sais que top est bon pour mesurer l'utilisation globale du processeur du système par coeurs et taskset peut fournir des informations sur le coeur du CPU sur lequel le processus est autorisé à s'exécuter.

Mais comment mesurer l'utilisation du CPU d'un processus spécifique par coeurs du CPU ?

170voto

abdollar Points 1546

Vous pouvez toujours le faire en haut. Pendant que top est en cours d'exécution, appuyez sur '1' sur votre clavier, cela affichera ensuite l'utilisation du CPU par cœur.

Limitez les processus affichés en ayant ce processus spécifique exécuté sous un compte utilisateur spécifique et utilisez Type 'u' pour limiter à cet utilisateur

5 votes

Vous pouvez également appuyer sur I pour basculer en mode Irix (par opposition au mode Solaris). Lorsque on, le pourcentage affiché dans la liste des processus est relatif à un fichier d'ordinateur. Lorsque off, ledit pourcentage est affiché par rapport à la capacité globale de l'ordinateur (c'est-à-dire tous les threads - alias tous les cœurs).

10 votes

Il ne s'agit pas d'un processus unique, cela affiche l'utilisation du CPU de tous les processus sur plusieurs cœurs.

0 votes

Comment pouvons-nous passer "1" en argument à top, la page man dit top -1 mais ça ne fonctionne pas ! Ce serait bien d'avoir top -1 -n 1 pour obtenir une seule itération de top mais avec l'affichage séparé de l'utilisation du CPU.

90voto

kami Points 1350

Vous pouvez utiliser :

 mpstat -P ALL 1

Cela montre combien chaque cœur est occupé et se met à jour automatiquement chaque seconde. La sortie ressemblerait à ceci (sur un processeur quad-core) :

10:54:41 PM  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest   %idle
10:54:42 PM  all    8.20    0.12    0.75    0.00    0.00    0.00    0.00    0.00   90.93
10:54:42 PM    0   24.00    0.00    2.00    0.00    0.00    0.00    0.00    0.00   74.00
10:54:42 PM    1   22.00    0.00    2.00    0.00    0.00    0.00    0.00    0.00   76.00
10:54:42 PM    2    2.02    1.01    0.00    0.00    0.00    0.00    0.00    0.00   96.97
10:54:42 PM    3    2.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00   98.00
10:54:42 PM    4   14.15    0.00    1.89    0.00    0.00    0.00    0.00    0.00   83.96
10:54:42 PM    5    1.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00   99.00
10:54:42 PM    6    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00
10:54:42 PM    7    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00

Cette commande ne répond pas à la question initiale, à savoir qu'elle ne montre pas l'utilisation du CPU pour un processus spécifique.

4 votes

Je pense que cela ne répond pas vraiment à la question. C'est seulement la même chose s'il n'y a pas d'autres processus en cours d'exécution. De plus, cela ne semble pas être un processeur quad core, mais plutôt un processeur huit cœurs (peut-être quad core avec HT activé).

1 votes

C'est un quad core avec HT activé.

1 votes

Ne répond pas à la question d'origine. Cependant, pour ne pas l'avoir mentionné (-1) de ma part.

46voto

mykhal Points 5873

Vous pouvez utiliser ps.
par exemple, avoir un processus python avec deux threads occupés sur un processeur dual core :

$ ps -p 29492 -L -o pid,tid,psr,pcpu
  PID   TID PSR %CPU
29492 29492   1  0.0
29492 29493   1 48.7
29492 29494   1 51.9

(PSR est l'identifiant du CPU auquel le thread est actuellement assigné)

vous voyez que les threads s'exécutent sur le même cœur de CPU (à cause du GIL)

en exécutant le même script python en jython, nous voyons que le script utilise les deux cœurs (et il y a de nombreux autres threads de services ou autre, qui sont presque inactifs) :

$ ps -p 28671 -L -o pid,tid,psr,pcpu
  PID   TID PSR %CPU
28671 28671   1  0.0
28671 28672   0  4.4
28671 28673   0  0.6
28671 28674   0  0.5
28671 28675   0  2.3
28671 28676   0  0.0
28671 28677   1  0.0
28671 28678   1  0.0
28671 28679   0  4.6
28671 28680   0  4.4
28671 28681   1  0.0
28671 28682   1  0.0
28671 28721   1  0.0
28671 28729   0 88.6
28671 28730   1 88.5

vous pouvez traiter la sortie et calculer le CPU total pour chaque cœur CPU.

Malheureusement, cette approche ne semble pas être fiable à 100 %, parfois je vois que dans le premier cas, les deux threads de travail sont signalés comme étant séparés sur chaque cœur de CPU, ou dans le second cas, les deux threads sont signalés comme étant sur le même cœur...

0 votes

surveiller -n1 ps -p 28671 -L -o pid,tid,psr,pcpu l'exécute toutes les secondes

20voto

WBM Points 351

htop donne un joli aperçu de l'utilisation individuelle de chaque cœur

5voto

Nathan Kidd Points 1792

La solution ps était presque ce dont j'avais besoin et avec un peu de bash ajouté fait exactement ce que la question originale demandait : voir l'utilisation par cœur de processus spécifiques

Cela montre également l'utilisation par cœur de processus multi-threadés.

Utilisation : cpustat `pgrep nomduprocessus` `pgrep autrenomduprocessus` ...

#!/bin/bash

pids=()
while [ $# != 0 ]; do
        pids=("${pids[@]}" "$1")
        shift
done

if [ -z "${pids[0]}" ]; then
        echo "Utilisation : $0  [pid2] ..."
        exit 1
fi

for pid in "${pids[@]}"; do
        if [ ! -e /proc/$pid ]; then
                echo "Erreur : le pid $pid n'existe pas"
                exit 1
        fi
done

while [ true ]; do
        echo -e "\033[H\033[J"
        for pid in "${pids[@]}"; do
                ps -p $pid -L -o pid,tid,psr,pcpu,comm=
        done
        sleep 1
done

Note : Ces statistiques sont basées sur la durée de vie du processus, pas sur les dernières X secondes, donc vous devrez redémarrer votre processus pour réinitialiser le compteur.

0 votes

Vous pourriez utiliser les fonctions de la bibliothèque C read() et open() pour ouvrir les fichiers pseudo dans /proc/pid/* et extraire les données dont vous avez besoin.

0 votes

Essayer: watch -n1 ps -L -o pid,tid,psr,pcpu,comm= $(pgrep processname) $(pgrep otheprocessname)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X