2014-10-07 24 views
5

Tôi cần lấy CPU% cho mỗi luồng quy trình.Sử dụng CPU cho mỗi chủ đề

Vì vậy, tôi có thể tạo kịch bản đơn giản:

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

Sau đây là cách TOP trông giống như cho quá trình này:

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 

Chủ đề sử dụng 2,6-5,9% CPU, và phụ huynh PID - sử dụng 33,3.

Nhưng - đây là kết quả kịch bản của:

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

Hình như mỗi thread 'ăn' 56-88% CPU ...

Những gì tôi đang thiếu ở đây?

+0

Máy tính có bao nhiêu lõi? – dano

+0

Ngoài ra, các pids hiển thị trong kết quả của tập lệnh không khớp với các pids từ 'top'. Bạn có đang hiển thị nhật ký từ các lần chạy khác nhau không? – dano

+0

Bạn đang sử dụng máy đa lõi? Các công cụ có các cách tiếp cận khác nhau để trình bày CPU% cho các kiến ​​trúc đa lõi; một số người cho rằng 100% là toàn bộ hệ thống ở mức đầy tải và những người khác 100% chỉ là một lõi đầy đủ, vì vậy bạn có thể có các quy trình hoặc chủ đề sử dụng hơn 100% (xem [ví dụ này] (http: //s24.postimg .org/c4he1p9et/image.png)). – jdehesa

Trả lời

4

get_cpu_percent (khoảng = 0,1)

Return một phao đại diện cho sử dụng CPU quá trình theo phần trăm.

Khi khoảng thời gian> 0.0 so sánh thời gian xử lý với thời gian CPU hệ thống trôi qua trước và sau khoảng thời gian (chặn).

Khi khoảng thời gian là 0.0 hoặc None so sánh thời gian xử lý với thời gian CPU hệ thống trôi qua kể từ lần gọi cuối cùng, quay lại ngay lập tức. Trong trường hợp này được khuyến nghị cho độ chính xác mà chức năng này được gọi với ít nhất 0,1 giây giữa các cuộc gọi.

này nghe có vẻ rất giống nó sẽ cho bạn có bao nhiêu thời gian CPU dành không nhàn rỗi được trả lại (có nghĩa là: lượng của quá trình CPU thời gian cho mỗi hệ thống CPU thời gian), trong khi đầu cho thấy lượng thời gian CPU của quá trình liên quan đến thời gian thực. Điều này có vẻ thực tế cho số của bạn.

Để nhận được các giá trị trên cùng sẽ hiển thị cho bạn, chỉ cần nhân mức sử dụng CPU của mỗi luồng bằng cách sử dụng CPU của lõi mà chuỗi chạy sẽ hoạt động. psutil.cpu_percent cần trợ giúp về điều đó. Lưu ý rằng bạn cần phải chia tỷ lệ phần trăm cho 100.0 (để có được một "tỷ lệ phần trăm" giữa 0 và 1) trước khi nhân chúng.

+0

Thậm chí với Interval = 0 (eq 'cpu_perc = th.get_cpu_percent()') Tôi nhận được: '# ./psutil_threads.py PID 10231 sử dụng% CPU = 42.1 PID 10681 sử dụng% CPU = 29.3 PID 11371 sử dụng% CPU = 60.0 PID 11860 sử dụng% CPU = 41.0 PID 12977 sử dụng% CPU = 40.0' – setevoy

+0

Vâng, tôi có thể chọn làm nổi bật sai, nhưng nó nói chính xác điều tương tự về những gì lần so sánh với nhau, kính của khoảng thời gian == 0.0 hoặc khoảng> 0.0. * "Khi khoảng thời gian là 0.0 hoặc Không ** so sánh thời gian xử lý với thời gian CPU hệ thống ** đã trôi qua kể từ lần gọi cuối cùng, hãy quay lại ngay lập tức." * – dom0

3

này sẽ cho bạn những gì bạn cần và phù hợp nhất (thích ứng với trường hợp sử dụng của bạn):

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

Xem câu trả lời của @Florent Thiery ... – zvi

1

Trong khi câu trả lời Gabe của là rất tốt, lưu ý rằng phiên bản psutil mới hơn đòi hỏi cú pháp cập nhật sau:

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)) 
Các vấn đề liên quan