2009-09-23 32 views
6

Tôi muốn báo cáo số lượng thời gian CPU được sử dụng cho mỗi luồng trong một quy trình máy chủ (được viết bằng C/C++ trên Linux). Tôi không thể tìm thấy tương đương với GetThreadTimes() trên Windows, nhưng đó là những gì tôi đang tìm kiếm.Theo thống kê CPU luồng trong Linux

Có ai có thể chỉ cho tôi đúng hướng không?

+0

tập hợp con của câu hỏi này? http://stackoverflow.com/questions/1431569/tracking-threads-memory-and-cpu-consumption –

Trả lời

6

getrusage (2) với RUSAGE_THREAD. Từ trang người đàn ông:

int getrusage(int who, struct rusage *usage); 

getrusage() returns resource usage measures for who, which can be one of the following: 

[...] 

     RUSAGE_THREAD (since Linux 2.6.26) 
      Return resource usage statistics for the calling thread. 
+0

Phiên bản Linux này là gì? Tôi đã làm một "người đàn ông rusage" trên Ubuntu 8.04 (với tất cả các tài liệu phát triển được cài đặt) và nó đã không trả lại bất cứ điều gì. Nếu nó thường có sẵn, sau đó nó có thể là một giải pháp tốt hơn so với một trong tôi đăng. – kdgregory

+0

Hãy chắc chắn rằng bạn a) có các gói 'manpages-dev' và 'manpages-posix-dev' được cài đặt và b) nói 'man getrusage' –

+0

Lạ, tôi có nó trên thử nghiệm Debian. Đó là từ gói manpages-dev phiên bản 3.22-1. – tsg

3

Giao diện chuẩn cho số liệu thống kê hạt nhân mỗi quá trình là hệ thống tệp /proc. Nếu bạn thực hiện "man proc", bạn có thể xem thông tin nào được lưu trữ, nhưng đối với mức tiêu thụ tài nguyên trên mỗi luồng, bạn sẽ muốn /proc/PID/task/TID/stat, trong đó PID là ID tiến trình và TID là ID luồng.

Dưới đây là một số đầu ra mẫu cho trình bao hiện tại của tôi; bạn sẽ cần xem manpage để giải mã nó:

> more /proc/25491/task/25491/stat 
25491 (bash) R 25490 25491 25491 34820 25515 4194304 955 5748 0 0 0 0 19 4 20 0 
1 0 67845700 4792320 505 4294967295 134512640 135194160 3216008544 3216007164 30 
86844944 0 65536 3686404 1266761467 0 0 0 17 0 0 0 0 0 0 
0

clock_gettime (2) với CLOCK_THREAD_CPUTIME_ID. Dưới đây là ví dụ để có được thời gian CPU trên mỗi giây:

struct timespec ts; 
if (clock_gettime(CLOCK_THREAD_CPUTIME_ID, &ts) == 0) { 
    return (double)ts.tv_sec + (double)ts.tv_nsec/1000000000; 
} 
return 0; 
Các vấn đề liên quan