2014-10-07 19 views
5

Ho bisogno di ottenere% CPU per ogni thread di processo.Utilizzo CPU per thread

Così, ho creare semplici script:

import psutil 
from psutil import Process 
p = psutil.Process(4499) 

treads_list = p.get_threads() 

for i in treads_list: 
    o = i[0] 
    th = psutil.Process(o) 
    cpu_perc = th.get_cpu_percent(interval=1) 
    print('PID %s use %% CPU = %s' % (o, cpu_perc)) 

Ecco come TOP assomiglia per questo processo:

4942 teamcity 20 0 3288m 831m 3124 R 33.3 10.6 10303:37 java 
32700 teamcity 20 0 3288m 831m 3124 S 5.9 10.6 18:49.99 java 
5824 teamcity 20 0 3288m 831m 3124 S 5.9 10.6 1:57.90 java 
4621 teamcity 20 0 3288m 831m 3124 S 3.0 10.6 1834:09 java 
4622 teamcity 20 0 3288m 831m 3124 S 2.6 10.6 1844:15 java 

discussioni utilizzano 2,6-5,9% della CPU, e genitore PID - utilizzano 33,3.

Ma - qui è il risultato di script:

# ./psutil_threads.py 
PID 10231 use % CPU = 60.9 
PID 10681 use % CPU = 75.3 
PID 11371 use % CPU = 69.9 
PID 11860 use % CPU = 85.9 
PID 12977 use % CPU = 56.0 
PID 14114 use % CPU = 88.8 

Sembra che ogni thread 'mangiare' 56-88% della CPU ...

Quello che mi manca qui?

+0

Quanti core ha il computer? – dano

+0

Inoltre, i pid visualizzati nel risultato dello script non corrispondono ai pid da 'top'. Stai visualizzando i log di diverse esecuzioni? – dano

+0

Stai utilizzando un computer multi-core? Gli strumenti hanno approcci diversi per presentare la CPU% per architetture multi-core; alcuni considerano che il 100% sia l'intero sistema a pieno carico e altri il 100% sia solo un core al completo, quindi è possibile che processi o thread utilizzino più del 100% (vedere [questo esempio] (http: //s24.postimg .org/c4he1p9et/immagine.png)). – jdehesa

risposta

4

get_cpu_percent (intervallo = 0,1)

Return un galleggiante che rappresenta l'utilizzo della CPU processo in percentuale.

Se l'intervallo è> 0.0 confronta i tempi di elaborazione con i tempi della CPU del sistema trascorso prima e dopo l'intervallo (blocco).

Se l'intervallo è 0.0 o Nessuno confronta i tempi di elaborazione con i tempi della CPU del sistema trascorso dall'ultima chiamata, restituendo immediatamente. In questo caso si raccomanda per precisione che questa funzione venga chiamata con almeno 0,1 secondi tra una chiamata e l'altra.

Questo suona un po 'come vi darà la quantità di tempo di CPU speso non-idle viene restituito (cioè: quantità di tempo di CPU di processo per ogni sistema tempo di CPU), mentre in alto mostra la quantità di tempo CPU del processo in relazione al tempo reale. Questo sembra realistico considerando i tuoi numeri.

Per ottenere i valori in alto, viene visualizzato, moltiplicando semplicemente l'utilizzo della CPU di ciascun thread per l'utilizzo della CPU del core su cui il thread viene eseguito dovrebbe funzionare. psutil.cpu_percent dovrebbe aiutare con quello. Si noti che è necessario dividere le percentuali per 100.0 (per ottenere una "percentuale" tra 0 e 1) prima di moltiplicarle.

+0

Even con Intervallo = 0 (eq 'cpu_perc = th.get_cpu_percent()') ho ottenuto: '# ./psutil_threads.py PID 10231 utilizzo della CPU% = 42,1 PID 10681 utilizzo della CPU% = 29,3 PID 11371 utilizzo della CPU% = 60.0 PID 11860 utilizzo della CPU% = 41,0 PID 12977 utilizzo della CPU% = 40.0' – setevoy

+0

Bene l'ho forse scelto l'evidenziazione sbagliato, ma si dice la stessa cosa esatta di ciò che i tempi sono confrontati uno contro l'altro, regardlass dell'intervallo == 0.0 o intervallo> 0.0. * "Quando l'intervallo è 0.0 o Nessuno ** confronta i tempi del processo con i tempi della CPU del sistema ** trascorso dall'ultima chiamata, restituendo immediatamente." * – dom0

3

Questo dovrebbe dare quello che ti serve e abbinare top (adattarsi al vostro caso d'uso):

import psutil 

def get_threads_cpu_percent(p, interval=0.1): 
    total_percent = p.get_cpu_percent(interval) 
    total_time = sum(p.cpu_times()) 
    return [total_percent * ((t.system_time + t.user_time)/total_time) for t in p.get_threads()] 

# Example usage for process with process id 8008: 
proc = psutil.Process(8008) 
print(get_threads_cpu_percent(proc)) 
+0

Vedere la risposta di @ Florent Thiery ... – zvi

1

Mentre la risposta di Gabe è grande, si noti che nuova versione psutil richiede la seguente sintassi aggiornamento:

import psutil 

def get_threads_cpu_percent(p, interval=0.1): 
    total_percent = p.cpu_percent(interval) 
    total_time = sum(p.cpu_times()) 
    return [total_percent * ((t.system_time + t.user_time)/total_time) for t in p.threads()] 

# Example usage for process with process id 8008: 
proc = psutil.Process(8008) 
print(get_threads_cpu_percent(proc)) 
Problemi correlati