2014-10-07 6 views
5

각 프로세스 스레드마다 CPU %를 얻어야합니다.스레드 당 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)) 

는 TOP이 과정에 대한 같은 모습입니다 :

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 %의 CPU를 사용하고, 부모 PID는 - 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%의 CPU 같은데?

+0

컴퓨터에 몇 개의 코어가 있습니까? – dano

+0

또한, 스크립트의 결과에 나타나는 pid가'top'의 pid와 일치하지 않습니다. 다른 실행에서 로그를 보여 주시겠습니까? – dano

+0

멀티 코어 머신을 사용하고 있습니까? 툴은 멀티 코어 아키텍처를위한 CPU %를 제시하는 다양한 접근 방식을 가지고 있습니다. 일부는 100 %가 전체로드시 전체 시스템이고 100 %가 100 %가 전체 코어 일 뿐이라는 것을 고려하면 100 %를 초과하는 프로세스 또는 스레드가있을 수 있습니다 ([this example] (http : //s24.postimg 참조)). .org/c4he1p9et/image.png)). – jdehesa

답변

4

get_cpu_percent (간격 = 0.1)

복귀 백분율 프로세스 CPU 사용률을 나타내는 로트.

간격이> 0.0 인 경우 은 간격 (차단) 전후로 경과 한 시스템 CPU 시간 인과 프로세스 시간을 비교합니다.

간격이 0.0 또는 없음 은 마지막 호출 이후 경과 된 시스템 CPU 시간 인과 프로세스 시간을 비교하여 즉시 반환됩니다. 이 경우 통화 간 최소 0.1 초 동안이 기능을 호출하는 것이 좋습니다. 이이 같은 많은비 유휴 상태가 반환 소비하는 방법 CPU의 많은 시간을 줄 것이다 소리

은 (즉 : 시스템 CPU 시간
당 프로세스 CPU 시간의 양), 최고는 표시하면서 에 대한 프로세스의 CPU 시간 양이 실제 시간입니다. 이것은 당신의 숫자가 현실적으로 보인다.

top 값을 얻으려면 단순히 각 스레드의 CPU 사용량에 스레드가 실행되는 코어의 CPU 사용량을 곱하면됩니다. psutil.cpu_percent 도와주세요. 곱하기 전에 백분율을 100.0으로 나누어야합니다 (0과 1 사이의 "백분율"을 얻기 위해).

+0

Even 간격 = 0 (EQ'cpu_perc = th.get_cpu_percent()')와 내가 가지고 : '번호가 PID 10231 사용 %의 CPU = 42.1 PID 10681 사용 %의 CPU = 29.3 PID 11371 사용 %의 CPU를 ./psutil_threads.py = 60.0 PID 11860 % CPU = 41.0을 사용합니다. PID 12977 % CPU = 40.0'을 사용합니다. – setevoy

+0

글쎄, 나는 아마도 잘못된 강조 표시를 선택했을 것입니다. 그러나 그것은 서로 비교되는 시간과 정확히 똑같은 것을 의미합니다. 0.0 또는 간격> 0.0. * "간격이 0.0 또는 없음 **은 마지막 호출 이후 경과 된 시스템 CPU 시간 **과 프로세스 시간을 비교하여 즉시 반환됩니다."* – 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

@Florent Thiery의 대답 참조 ... – zvi

1

게이브의 대답은 큰 반면, 새로운 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))