2014-10-07 27 views
5

Her işlem iş parçacığı için% CPU almam gerekiyor.Her iş parçacığı için CPU kullanımı

Yani, basit komut dosyası oluşturmak:

İşte
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)) 

TOP bu süreç için nasıl göründüğünü geçerli:

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 

konu 2,6-5,9% CPU kullanın ve ebeveyn PID - 33.3 kullanın.

Ama - Burada komut dosyasının sonucudur:

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

Burada

eksik ne ... Her iş parçacığı 'yemek' 56-88% CPU benziyor?

+0

Bilgisayarda kaç tane çekirdek var? – dano

+0

Ayrıca, komut dosyasının sonuçlarında ortaya çıkan pitler, "top" dan gelen referanslarla eşleşmiyor. Farklı çalışmalardan günlükleri gösteriyor musunuz? – dano

+0

Çok çekirdekli bir makine kullanıyor musunuz? Araçlar çok çekirdekli mimariler için CPU% sunmak için farklı yaklaşımlar var; bazıları% 100'ün tüm sistemde tam yükte olduğunu ve diğerlerinin% 100'ün yalnızca bir çekirdek olduğunu düşünür, bu yüzden% 100'ün üzerinde bir işlem veya iş parçacığına sahip olabilirsiniz (bkz. [bu örnek] (http://s24.postimg) .org/c4he1p9et/resim.png)). – jdehesa

cevap

4

get_cpu_percent (aralık = 0,1)

geri yüzdesi olarak işlem CPU kullanımı temsil eden bir şamandıra.

Aralık> 0.0 arasındaki zaman aralığı, işlem zamanlarını sistem CPU zamanları ile karşılaştırır ve aralıklar (aralıklar) öncesindeki ve sonrasından geçen.

Aralık 0.0 veya Yok olduğunda , işlem zamanlarını sistem CPU zamanları ile karşılaştırır, son çağrıdan sonra sona erer, hemen döndürür. Bu durumda, bu işlevin, çağrılar arasında en az 0,1 saniye süreyle çağrılabileceği konusunda hassasiyet önerilir. Bu böyle bir sürüolmayan boşta döndürülür harcanan nasıl CPU zamanı çok teşekkür verecektir sesler

(yani: Sistem CPU zamanı
başına işlem CPU zamanı tutar), üst gösterirken işlemin CPU zamanı miktarı, gerçek zamanına göre. Rakamlarına göre gerçekçi gözüküyor.

Değerlerin size görünmesini sağlamak için, her bir iş parçacığının CPU kullanımını, iş parçacığı üzerinde çalışılan çekirdeğin CPU kullanımıyla çarpmanız yeterlidir. psutil.cpu_percent bu konuda yardımcı olmalıdır. Yüzdelerini 100.0 ile (0 ile 1 arasında bir "yüzde" elde etmek için) çarpmadan önce ayırmanız gerektiğini unutmayın.

+0

Aralık = 0 (denklem 'cpu_perc = th.get_cpu_percent() ') I var: ' # PID 10231 kullanımı% CPU = 42.1 PID 10681 kullanımı% CPU = 29.3 PID 11371 kullanımı CPU% ./psutil_threads.py = 60.0 PID 11860 kullanımı% CPU = 41.0 PID 12977 kullanımı% CPU = 40.0' – setevoy

+0

Belki de yanlış vurgulamayı seçtim, ama birbirleriyle kıyaslandığında tam olarak aynı şeyi söylüyor. 0.0 veya aralık> 0.0. * "Aralık 0.0 veya Yok olduğunda **, işlem zamanlarını sistem çağrısı süreleriyle karşılaştırır. ** son çağrıdan bu yana geçen süre, hemen geri döner." * – dom0

3

Bu İhtiyacınız ve maç üst ne vermelidir (kullanımı durumda uyum):

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

@Florent Thiery'nin yanıtına bakın ... – zvi

1

Gabe'in cevabı büyük olsa da, yeni psutil sürümü aşağıdaki güncelleştirilmiş sözdizimi gerektirdiğini unutmayın:

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)) 
İlgili konular