每个线程的CPU使用率

时间:2014-10-07 14:18:19

标签: python multithreading

我需要为每个进程线程获取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 ......

我在这里缺少什么?

4 个答案:

答案 0 :(得分:4)

  

get_cpu_percent(间隔= 0.1)

     

以百分比形式返回表示进程CPU利用率的浮点数。

     

当间隔> 0.0 将处理时间与间隔之前和之后经过的系统CPU时间进行比较(阻塞)。

     

当间隔为0.0或无将处理时间与上次调用后经过的系统CPU时间进行比较时,立即返回。在这种情况下,建议准确度,在调用之间调用此函数至少0.1秒。

这听起来很像它会告诉你返回非空闲花费了多少CPU时间(即:每个系统CPU时间的进程CPU时间量),top表示与真实时间相关的流程的CPU时间量。考虑到你的数字,这似乎是现实的。

要获得top值会显示,只需将每个线程的CPU使用率乘以线程运行的核心的CPU使用率即可。 psutil.cpu_percent应该对此有所帮助。请注意,在乘以之前,您需要将百分比除以100.0(在0和1之间得到“百分比”)。

答案 1 :(得分:3)

这应该可以满足您的需求并匹配top(适应您的使用案例):

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

答案 2 :(得分:2)

我对Florent Thiery and Gabe解决方案进行了改进,创建了一个小脚本,可用于监视任何进程的CPU使用率(按线程)。

python cpuusage.py

import psutil, sys, time, os

def clear():
    if os.name == "nt":
        _ = os.system("cls")
    else:
        _ = os.system("clear")

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

try:
    sys.argv[1]
except:
    sys.exit('Enter PID')

proc = psutil.Process(int(sys.argv[1]))

while True:
    clear()
    threads = get_threads_cpu_percent(proc)
    threads.sort(reverse=True)
    for line in threads:
       print(line)
    time.sleep(1)

答案 3 :(得分: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))