Come misuro l'utilizzo separato del core della CPU per un processo?


115

Esiste un modo per misurare l'utilizzo della CPU di un processo specifico da parte dei core?

So che top è utile per misurare l'utilizzo della CPU dell'intero sistema in base ai core e il set di attività può fornire informazioni su quale core della CPU è consentito per l'esecuzione del processo.

Ma come misuro l'utilizzo della CPU di un processo specifico da parte dei core della CPU?

Risposte:


139

Puoi ancora farlo in alto . Mentre top è in esecuzione, premi "1" sulla tastiera, mostrerà quindi l'utilizzo della CPU per core.

Limita i processi mostrati eseguendo quel processo specifico con un account utente specifico e utilizza il tipo "u" per limitare a quell'utente


3
Puoi anche premere Iper attivare la modalità Irix (al contrario della modalità Solaris ). Quando on, la percentuale visualizzata nell'elenco dei processi è relativa a un thread della CPU . Quando off, la suddetta percentuale viene visualizzata relativamente alla capacità complessiva della CPU (ovvero TUTTI i thread , ovvero tutti i core).
7heo.tk

8
Questo non è specifico per un singolo processo, mostra l'utilizzo della CPU di tutti i processi su più core
m_vitaly

Come possiamo passare "1" come argomento a top, mandice la pagina top -1ma si lamenta! Sarebbe bello top -1 -n 1ottenere una singola iterazione di topma con l'utilizzo della CPU separato visualizzato.
quanti il

76

Puoi usare:

 mpstat -P ALL 1

Mostra quanto ogni core è occupato e si aggiorna automaticamente ogni secondo. L'output sarebbe qualcosa del genere (su un processore 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

Questo comando non risponde alla domanda originale, ad esempio non mostra l'utilizzo del core della CPU per un processo specifico.


3
Penso che questo non risponda realmente alla domanda. Questa è la stessa cosa solo se non ci sono altri processi in esecuzione. Anche questa non sembra essere una CPU quad core, più simile a otto core (forse quad con HT abilitato).
il suino

1
È un quad core con HT abilitato.
Kamran Bigdely

Non risponde alla domanda originale. Tuttavia, per non averlo menzionato (-1) da parte mia.
KGhatak

1
Sono d'accordo con @KGhatak, questo non risponde alla domanda originale -1
jodag

41

puoi usare ps.
es. avere un processo Python con due thread occupati su CPU 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 è l'id della CPU a cui è attualmente assegnato il thread)

vedi che i thread sono in esecuzione sullo stesso core della cpu (a causa di GIL)

eseguendo lo stesso script python in jython, vediamo che lo script utilizza entrambi i core (e ci sono molti altri servizi o qualsiasi thread, che sono quasi inattivi):

$ 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

è possibile elaborare l'output e calcolare la CPU totale per ogni core della CPU.

Sfortunatamente, questo approccio non sembra essere affidabile al 100%, a volte vedo che nel primo caso i due thread di lavoro sono segnalati come separati da ciascun core della CPU, oppure nel secondo caso i due thread sono attivati lo stesso nucleo ..


13

htop offre una bella panoramica dell'utilizzo del core individuale


4

La pssoluzione era quasi ciò di cui avevo bisogno e con alcuni bash lanciati fa esattamente ciò che la domanda originale chiedeva: vedere l'utilizzo per core di processi specifici

Questo mostra anche l'utilizzo per core dei processi multi-thread .

Usa come: cpustat `pgrep processname`` pgrep otherprocessname` ...

#!/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

Nota: queste statistiche si basano sulla durata del processo , non sugli ultimi X secondi, quindi sarà necessario riavviare il processo per ripristinare il contatore.


È possibile utilizzare le funzioni C lib read () e open () per aprire gli pseudo file in / proc / pid / * e analizzare tutti i dati necessari.
GL2014

2
dstat -C 0,1,2,3 

Ti darà anche l'utilizzo della CPU dei primi 4 core. Ovviamente, se hai 32 core, questo comando diventa un po 'più lungo ma utile se sei interessato solo a pochi core.

Ad esempio, se ti interessano solo i core 3 e 7, potresti farlo

dstat -C 3,7

In che modo questo sarà rilevante per un singolo processo?
einpoklum

1

Ho avuto solo questo problema e ho trovato una risposta simile qui .

Il metodo consiste nell'impostare topcome si desidera e quindi premere W(W maiuscola). Questo salva topil layout corrente di un file di configurazione in $ HOME / .toprc

Anche se questo potrebbe non funzionare se si desidera eseguire più programmi topcon configurazioni differenti.

Quindi, tramite quello che considero un lavoro in giro, puoi scrivere su diversi file di configurazione / utilizzare diversi file di configurazione eseguendo una delle seguenti operazioni ...

1) Rinomina il file binario

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

Ora .top2rcverrà scritto nella tua $ HOME

2) Imposta $ HOME su un percorso alternativo, poiché scriverà il suo file di configurazione nel file $ HOME / .binary-name.rc

HOME=./
top

Ora .toprcverrà scritto nella cartella corrente.

Tramite l'uso di commenti di altre persone per aggiungere i vari conti di utilizzo in alto è possibile creare un output batch per tali informazioni e quest'ultimo unisce le informazioni tramite uno script. Forse non è così semplice come lo script, ma ho trovato il top per fornirmi TUTTI i processi in modo che in seguito possa ricapitolare e catturare uno stato durante un lungo periodo che avrei potuto perdere altrimenti (utilizzo improvviso della CPU inspiegabile a causa di processi vaganti)


1

Ho pensato che perf statè quello che ti serve.

Mostra un utilizzo specifico di un processo quando si specifica --cpu=listun'opzione. Di seguito è riportato un esempio di monitoraggio dell'utilizzo della CPU per la creazione di un progetto utilizzando il perf stat --cpu=0-7 --no-aggr -- make all -jcomando. L'output è:

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 colonna di sinistra è l'indice specifico della CPU e la colonna più a destra è l'utilizzo della CPU. Se non specifichi l' --no-aggropzione, il risultato verrà aggregato insieme. L' --pid=pidopzione ti aiuterà se desideri monitorare un processo in esecuzione.

Prova -a --per-coreo -a perf-socketanche tu, che presenterà più informazioni classificate.

Maggiori informazioni sull'uso di perf statpossono essere viste in questo tutorial: perf cpu statistic , perf help stataiuterà anche sul significato delle opzioni.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.