web-dev-qa-db-fra.com

Comment mesurer l'utilisation distincte du cœur de la CPU pour un processus?

Existe-t-il un moyen de mesurer l'utilisation d'un processeur par processus?

Je sais que haut est utile pour mesurer l'utilisation du processeur du système entier par cœurs et taskset peut fournir des informations sur le type de processeur autorisé pour le processus.

Mais comment mesurer l'utilisation du processeur d'un processus spécifique par les cœurs de processeur?

103
elang

Vous pouvez toujours le faire dans top. Pendant que haut est en cours d'exécution, appuyez sur la touche "1" de votre clavier pour afficher l'utilisation du processeur par cœur.

Limitez les processus indiqués en exécutant ce processus spécifique sous un compte utilisateur spécifique et utilisez le type 'u' pour limiter cet utilisateur.

122
abdollar

Vous pouvez utiliser:

 mpstat -P ALL 1

Il montre combien chaque cœur est occupé et il 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, c’est-à-dire qu’elle ne montre pas l’utilisation du cœur de la CPU pour un processus spécifique.

73
Kamran Bigdely

vous pouvez utiliser ps.
par exemple. ayant python processus avec deux threads occupés sur le processeur double cœur:

$ 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 de la CPU auquel le thread est actuellement assigné)

vous voyez que les threads s'exécutent sur le même noyau de processeur (à cause de GIL)

en exécutant le même python en jython, nous voyons que le script utilise les deux cœurs (et il existe de nombreux autres services ou threads, quasiment 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 nombre total de processeurs pour chaque cœur de processeur.

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

36
mykhal

htop donne un bon aperçu de l'utilisation de base individuelle

9
WBM

La solution ps correspondait à peu près à ce dont j'avais besoin et, avec quelques modifications, elle répond exactement à la question initiale: pour visualiser l'utilisation par cœur de processus spécifiques

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

Utilisez comme: cpustat `pgrep nom_processus`` pgrep nom_processus` ...

#!/bin/bash

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

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

for pid in "${pids[@]}"; do
        if [ ! -e /proc/$pid ]; then
                echo "Error: pid $pid doesn't exist"
                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

Remarque: Ces statistiques sont basées sur le processus de la durée de vie , pas la dernière [~ # ~] x [~ # ~ ] secondes, vous devrez donc redémarrer votre processus pour réinitialiser le compteur.

4
Nathan Kidd
dstat -C 0,1,2,3 

Vous donnera également l'utilisation du processeur des 4 premiers cœurs. Bien sûr, si vous avez 32 cœurs, cette commande sera un peu plus longue mais utile si vous ne vous intéressez qu'à quelques cœurs.

Par exemple, si vous ne vous intéressez qu'aux noyaux 3 et 7, vous pourriez faire

dstat -C 3,7
2
Ask and Learn

J'ai pensé perf stat est ce dont vous avez besoin.

Il montre l'utilisation spécifique d'un processus lorsque vous spécifiez un --cpu=list option. Voici un exemple de surveillance de l’utilisation par le processeur de la construction d’un projet avec perf stat --cpu=0-7 --no-aggr -- make all -j commande. La sortie est:

CPU0         119254.719293 task-clock (msec)         #    1.000 CPUs utilized            (100.00%)
CPU1         119254.724776 task-clock (msec)         #    1.000 CPUs utilized            (100.00%)
CPU2         119254.724179 task-clock (msec)         #    1.000 CPUs utilized            (100.00%)
CPU3         119254.720833 task-clock (msec)         #    1.000 CPUs utilized            (100.00%)
CPU4         119254.714109 task-clock (msec)         #    1.000 CPUs utilized            (100.00%)
CPU5         119254.727721 task-clock (msec)         #    1.000 CPUs utilized            (100.00%)
CPU6         119254.723447 task-clock (msec)         #    1.000 CPUs utilized            (100.00%)
CPU7         119254.722418 task-clock (msec)         #    1.000 CPUs utilized            (100.00%)
CPU0                 8,108 context-switches          #    0.068 K/sec                    (100.00%)
CPU1                26,494 context-switches                                              (100.00%)
CPU2                10,193 context-switches                                              (100.00%)
CPU3                12,298 context-switches                                              (100.00%)
CPU4                16,179 context-switches                                              (100.00%)
CPU5                57,389 context-switches                                              (100.00%)
CPU6                 8,485 context-switches                                              (100.00%)
CPU7                10,845 context-switches                                              (100.00%)
CPU0                   167 cpu-migrations            #    0.001 K/sec                    (100.00%)
CPU1                    80 cpu-migrations                                                (100.00%)
CPU2                   165 cpu-migrations                                                (100.00%)
CPU3                   139 cpu-migrations                                                (100.00%)
CPU4                   136 cpu-migrations                                                (100.00%)
CPU5                   175 cpu-migrations                                                (100.00%)
CPU6                   256 cpu-migrations                                                (100.00%)
CPU7                   195 cpu-migrations                                                (100.00%)

La colonne de gauche est l'index spécifique du processeur et la colonne de droite, son utilisation. Si vous ne spécifiez pas le --no-aggr _ option, le résultat sera agrégé. Le --pid=pid option vous aidera si vous souhaitez surveiller un processus en cours d'exécution.

Essayez -a --per-core ou -a perf-socket aussi, qui présentera des informations plus classifiées.

En savoir plus sur l'utilisation de perf stat peut être vu dans ce tutoriel: statistique du processeur , ainsi que perf help stat aidera à comprendre le sens des options.

1
elinx

J'ai juste eu ce problème et j'ai trouvé une réponse similaire ici .

La méthode consiste à définir top comme vous le souhaitez, puis à appuyer sur W (majuscule W). Ceci enregistre la disposition actuelle de top dans un fichier de configuration dans $ HOME/.toprc

Bien que cela puisse ne pas fonctionner si vous voulez exécuter plusieurs top avec des configurations différentes.

Donc, via ce que je considère comme un moyen de contourner le problème, vous pouvez écrire dans différents fichiers de configuration/utiliser différents fichiers de configuration en effectuant l'une des opérations suivantes ...

1) renommer le binaire

  ln -s /usr/bin/top top2
  ./top2

Maintenant .top2rc va être écrit dans votre $ HOME

2) Définissez $ HOME sur un autre chemin, car il écrira son fichier de configuration dans le fichier $ HOME/.binary-name.rc

HOME=./
top

Maintenant .toprc va être écrit dans le dossier actuel.

En utilisant les commentaires des autres peuples pour ajouter la comptabilité d'utilisation en haut, vous pouvez créer une sortie par lots pour cette information et cette dernière fusionne les informations via un script. Ce n’est peut-être pas aussi simple que votre script, mais j’ai trouvé top pour me fournir TOUS les processus afin que je puisse plus tard récapituler et capturer un état pendant une longue période que j’aurais peut-être manquée (utilisation soudaine du CPU inexpliquée à cause de processus errants)

0