2010-05-10 35 views
7

Sự hiểu biết của tôi là theo mặc định, gprof tính đến thời gian CPU. Có cách nào để đưa nó vào hồ sơ dựa trên thời gian đồng hồ treo tường không?Nhận gprof cho tiểu sử dựa trên thời gian trên đồng hồ treo tường?

Chương trình của tôi có rất nhiều đĩa i/o, do đó, thời gian CPU mà nó chỉ sử dụng đại diện cho một phần nhỏ thời gian thực thi thực tế. Tôi cần biết phần nào của đĩa i/o chiếm nhiều thời gian nhất.

+3

Bạn có thể muốn một cái gì đó khác hơn là gprof cho việc này. – WhirlWind

+1

Chẳng hạn như ví dụ gì? – jetwolf

+1

hãy xem dtrace, tùy thuộc vào kiến ​​trúc của bạn. – WhirlWind

Trả lời

1

gprof sẽ không thực hiện việc này. Nhìn at this.

And this.

Tóm lại: Theo gdb, làm cho nó chạy và làm Ctrl-Break hoặc Ctrl-C 10 lần một cách ngẫu nhiên, và hiển thị các cuộc gọi stack. Nếu I/O của bạn đang dùng (ví dụ) 60% thời gian, sau đó trên (khoảng) 6 trong số 10 lần tạm dừng, bạn sẽ thấy nó trong writebuf hoặc thói quen readbuf, và các dòng mã yêu cầu I/O sẽ được hiển thị rõ ràng trên ngăn xếp.

Bạn cũng có thể sử dụng lsstack để nhận thông tin tương tự.

+0

Hmm ... không phải phương pháp này rất thống kê không chính xác? Có cách tự động thực hiện việc này, tốn hơn 10 mẫu, nói 1000 mẫu, nhưng trong khoảng thời gian thống nhất, và sau đó báo cáo các hàm nào đã gặp phải thường xuyên nhất? – jetwolf

+0

@jetwolf: Zoom là một ví dụ về profiler thực hiện với 10^3 mẫu, nhưng kiểm tra liên kết đầu tiên, đặc biệt là các mục 5, 2, 7 và 9. –

+0

@jetwolf: Ví dụ: giả sử I/O chính xác là 60 %. Độ lệch chuẩn của số lượng mẫu để hiển thị nó là sqrt (NF (1-F)). Đối với 10 mẫu là +/- 1.55, cho 1000, là 15,5. Vì vậy, trong 10 mẫu bạn sẽ thấy nó khoảng 4,45 - 7,55 lần. Trong 1000 mẫu, bạn sẽ thấy nó khoảng 584,5 - 615,5 lần. Dù bằng cách nào, bạn sẽ thấy chính xác những gì gây ra nó để nếu nó có thể sửa chữa được, bạn có thể sửa chữa nó. –

1

Bạn có thể sử dụng strace hoặc cachegrind để cấu hình mã đúng cách. strace sẽ cung cấp cho bạn thông tin chi tiết về thời gian dành cho các cuộc gọi hệ thống và cachegrind sẽ cung cấp phân tích chi tiết về việc sử dụng tài nguyên.

0

Rất dễ thay đổi gprof để lập hồ sơ đồng hồ treo tường. Đã có 8 ký tự chỉ để thay thế là:

ITIMER_PROF -> ITIMER_REAL 

SIGPROF -> SIGALRM 

trong file glibc/sysdeps/posix/profil.c, hoạt __profil, gần các cuộc gọi đến setitimersigaction (chính xác hơn __Setitimer__sigaction)

Sau khi thay đổi bất kỳ chương trình trong đó sử dụng SIGALRM sẽ bị hỏng và bất kỳ chương trình nào không có mã khởi động lại chặn-syscall có thể cho kết quả sai.

Ngoài ra, bạn có thể trực tiếp thay đổi giá trị int trong hệ nhị phân glibc (xin vui lòng, không làm điều này trên hệ thống rộng libc.so, tạo một bản sao riêng biệt và cung cấp cho nó để chương trình với LD_LIBRARY_PATH)

Đối vá nhị phân, ITIMER_PROF là 2 ; ITIMER_REAL là 0; SIGPROF là 27 (0x1b); SIGALRM là 14 (0x0e). Có hai vị trí cho mỗi hằng số trong hàm profil của glibc.

Cách khác là viết trình gỡ lỗi ptrace, sẽ thay đổi đối số của hàm setitimer và sigaction tại thời gian chạy.

+0

Thật không may, sau khi thay đổi một nhị phân libc, phương pháp này không thành công. Bộ đếm thời gian và tín hiệu được thay đổi, nhưng .. 'profil()' (được sử dụng bởi gmon, được kích hoạt bởi '-pg') không thể cấu hình các thư viện động (nơi hầu hết các chức năng chặn cư trú). Ngoài ra, 'eip', nhìn từ bộ xử lý tín hiệu khi chặn syscall đang hoạt động, là sai đối với các lib động (các điểm vào glibc, nhưng không phải trong trình bao bọc syscall) và là NULL cho liên kết tĩnh. – osgx

4

Bạn có thể đo thời gian đồng hồ treo tường bằng cách sử dụng profiler từ google-perftools. Để chuyển đổi google profiler sang chế độ đồng hồ treo tường, hãy đặt biến môi trường CPUPROFILE_REALTIME = 1.

+0

404 trên liên kết đó. Bạn có thể cập nhật nó không? –

Các vấn đề liên quan