2014-10-07 8 views
5

मुझे प्रत्येक प्रक्रिया थ्रेड के लिए CPU% प्राप्त करने की आवश्यकता है।सीपीयू उपयोग प्रति थ्रेड

तो, मैं सरल स्क्रिप्ट बनाने:

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)) 

यहाँ कैसे टॉप इस प्रक्रिया के लिए की तरह लग रहा है:

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 

धागे 2.6-5.9% सीपीयू उपयोग करते हैं, और माता पिता के पीआईडी ​​- 33.3 का उपयोग करें।

लेकिन - यहाँ स्क्रिप्ट के परिणाम है:

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

प्रत्येक थ्रेड 'खाने' 56-88% सीपीयू की तरह लग रहा ...

क्या मैं यहाँ याद कर रहा हूँ?

+0

कंप्यूटर के कितने कोर हैं? – dano

+0

इसके अलावा, स्क्रिप्ट के परिणाम में दिखाई देने वाली बोलियां 'शीर्ष' से पिड्स से मेल नहीं खाती हैं। क्या आप अलग-अलग रनों से लॉग दिखा रहे हैं? – dano

+0

क्या आप एक बहु-कोर मशीन का उपयोग कर रहे हैं? बहु-कोर आर्किटेक्चर के लिए CPU% प्रस्तुत करने के लिए टूल्स के अलग-अलग दृष्टिकोण हैं; कुछ मानते हैं कि 100% पूर्ण लोड पर पूरी प्रणाली है और अन्य 100% पूर्ण रूप से केवल एक कोर है, इसलिए आपके पास 100% से अधिक का उपयोग कर प्रक्रिया या धागे हो सकते हैं (देखें [यह उदाहरण] (http: //s24.postimg .org/c4he1p9et/image.png))। – jdehesa

उत्तर

4

get_cpu_percent (अंतराल = 0,1)

वापसी एक नाव एक प्रतिशत के रूप प्रक्रिया CPU उपयोग का प्रतिनिधित्व।

अंतराल> 0.0 अंतराल (अवरुद्ध) से पहले और बाद में सिस्टम CPU समय प्रक्रिया प्रक्रिया समय की तुलना करता है।

जब अंतराल 0.0 या कोई नहीं सिस्टम सीपीयू टाइम्स की प्रक्रिया प्रक्रिया समय की तुलना में अंतिम कॉल के बाद से समाप्त हो गया, तुरंत लौट रहा है। इस मामले में सटीकता के लिए अनुशंसा की जाती है कि इस समारोह को कॉल के बीच कम से कम 0.1 सेकंड के साथ बुलाया जाए।

यह ऐसा लगता है जैसे एक बहुत आप दे देंगे कैसे सीपीयू काफी समय व्यतीत किया गैर निष्क्रिय दिया जाता है लगता है (जो है: प्रति प्रणाली CPU समय प्रक्रिया CPU समय की राशि) है, जबकि शीर्ष से पता चलता वास्तविक समय के संबंध में प्रक्रिया के CPU समय की मात्रा। यह आपकी संख्याओं को यथार्थवादी लगता है।

मूल्यों को शीर्ष पर प्राप्त करने के लिए आपको दिखाएगा कि प्रत्येक थ्रेड के CPU उपयोग को कोर के सीपीयू उपयोग द्वारा गुणा करने के लिए थ्रेड चलाना चाहिए। psutil.cpu_percent उसमें मदद करनी चाहिए। ध्यान दें कि उन्हें 100 गुणा करके प्रतिशत को विभाजित करने की आवश्यकता है (उन्हें 0 और 1 के बीच "प्रतिशत" प्राप्त करने के लिए) गुणा करने से पहले।

+0

यहां तक ​​कि अंतराल = 0 (eq 'cpu_perc = th.get_cpu_percent()') के साथ मुझे मिल गया: '# पीआईडी ​​10231 उपयोग% सीपीयू = 42.1 पीआईडी ​​10,681 उपयोग% सीपीयू = 29.3 पीआईडी ​​11,371 उपयोग% सीपीयू ./psutil_threads.py = 60.0 पीआईडी ​​11860% CPU = 41.0 पीआईडी ​​12 9 77% CPU = 40.0' – setevoy

+0

का उपयोग करें, ठीक है, मैंने शायद गलत हाइलाइटिंग चुना है, लेकिन यह एक ही बात है कि अंतराल == के संबंध में एक-दूसरे के साथ तुलना की जा रही है 0.0 या अंतराल> 0.0। * "जब अंतराल 0.0 या कोई नहीं होता है ** सिस्टम सीपीयू टाइम्स के लिए प्रक्रिया समय की तुलना करता है ** अंतिम कॉल के बाद से समाप्त हो गया, तुरंत लौट रहा है।" * – dom0

3

यह आप क्या जरूरत है और मैच शीर्ष देना चाहिए (आपके उपयोग के मामले के लिए अनुकूल):

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

@ फ्लोरेंट थियरी का जवाब देखें ... – zvi

1

Gabe है जवाब बढ़िया है, फिर ध्यान दें नए psutil संस्करण निम्न अद्यतन वाक्य रचना की आवश्यकता है कि:

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)) 
संबंधित मुद्दे