2010-03-15 37 views
12

phiên bản ngắn:thời gian mẫu Linux dựa profiler

Có một thời điểm thích hợp dựa lấy mẫu hồ sơ cho Linux?

phiên bản dài:

Tôi thường sử dụng OProfile để tối ưu hóa các ứng dụng của tôi. Gần đây tôi đã tìm thấy một thiếu sót khiến tôi băn khoăn.

Vấn đề là một vòng lặp chặt chẽ, sinh sản C++ filt để gỡ rối tên C++. Tôi chỉ tình cờ gặp mã trong khi đuổi theo một nút cổ chai khác. OProfile không hiển thị bất cứ điều gì bất thường về mã nên tôi gần như bỏ qua nó nhưng cảm giác mã của tôi đã nói với tôi để tối ưu hóa cuộc gọi và xem những gì đã xảy ra. Tôi đã thay đổi số popen của C++ filt thành abi::__cxa_demangle. Thời gian chạy đã kéo dài từ hơn một phút đến một chút trong một giây. Tốc độ x60 tăng lên.

Có cách nào tôi có thể đã định cấu hình OProfile để gắn cờ cuộc gọi popen không? Vì dữ liệu hồ sơ bây giờ là OProfile nghĩ rằng cổ chai là đống và các cuộc gọi std::string (mà BTW một khi được tối ưu hóa đã giảm thời gian chạy xuống dưới một giây, tăng tốc hơn x2).

Dưới đây là cấu hình oprofile tôi:

$ sudo opcontrol --status 
Daemon not running 
Event 0: CPU_CLK_UNHALTED:90000:0:1:1 
Separate options: library 
vmlinux file: none 
Image filter: /path/to/executable 
Call-graph depth: 7 
Buffer size: 65536 

Có một hồ sơ cho Linux mà có thể đã tìm thấy các nút cổ chai?

Tôi nghi ngờ vấn đề là OProfile chỉ ghi nhật ký mẫu của nó vào quy trình hiện đang chạy. Tôi muốn nó luôn ghi lại các mẫu của nó cho quá trình tôi đang lược tả. Vì vậy, nếu quá trình hiện đang chuyển sang (chặn trên IO hoặc một cuộc gọi popen) OProfile sẽ chỉ đặt mẫu của nó tại cuộc gọi bị chặn.

Nếu tôi không thể sửa lỗi này, OProfile sẽ chỉ hữu ích khi thực thi đang đẩy gần CPU 100%. Nó không thể giúp với thực thi có các cuộc gọi chặn không hiệu quả.

Trả lời

6

Rất vui khi bạn hỏi. Tôi tin rằng OProfile có thể được thực hiện để làm những gì tôi xem xét đúng, đó là lấy mẫu ngăn xếp trên đồng hồ treo tường khi chương trình đang bị chậm và, nếu nó sẽ không cho phép bạn kiểm tra mẫu ngăn xếp riêng lẻ, ít nhất tóm tắt cho mỗi dòng mã xuất hiện trên các mẫu, phần trăm các mẫu dòng xuất hiện. Đó là số trực tiếp số liệu sẽ được lưu nếu dòng đó không có ở đó. Here's one discussion.Here's another,another. Và, như Paul đã nói, Zoom nên làm điều đó.

Nếu thời gian của bạn tăng từ 60 giây lên 1 giây, điều đó ngụ ý rằng mỗi mẫu ngăn xếp đơn lẻ sẽ có xác suất 59/60 cho bạn thấy sự cố.

+1

Mike, quan điểm của bạn rất hợp lệ, tôi đồng ý kỹ thuật với 100%. Bất kỳ ý tưởng về làm thế nào để cho phép lấy mẫu dựa trên thời gian thông qua OProfile hoặc trong một cách tiếp cận tự động hơn là chỉ phá vỡ trong trình gỡ rối? –

+0

@Caspin: Tôi đang sử dụng Windows và tôi không phải là người dùng OProfile, nhưng liên kết này (http://oprofile.sourceforge.net/doc/opreport.html) nói về việc sử dụng và trình bày dữ liệu mẫu ngăn xếp . Ngoài ra liên kết này (http://oprofile.sourceforge.net/doc/detailed-parameters.html#timer) nói về ngắt hẹn giờ. Tôi không thể biết nếu nó sẽ lấy mẫu trong I/O hoặc các cuộc gọi chặn khác. –

+0

... lưu ý rằng tần suất lấy mẫu không cần phải nhanh, nhưng nó cần phải có khả năng lấy mẫu trong khi chặn cuộc gọi trừ khi bạn muốn bị mù đối với những cuộc gọi đó. –

3

Hãy thử Zoom - Tôi tin rằng nó sẽ cho phép bạn cấu hình tất cả các quy trình - thật thú vị khi biết liệu nó có làm nổi bật vấn đề của bạn trong trường hợp này hay không.

+0

Phiên bản thu phóng 1.6.6 cũng không tìm thấy sự cố. Phiên bản Zoom tiếp theo được cho là có chế độ lấy mẫu (* "profile profiling time" *) có thể tìm ra vấn đề. –

1

Nhanh chóng hack lên profiler lấy mẫu tầm thường cho Linux: http://vi-server.org/vi/simple_sampling_profiler.html

Nó gắn backtrace(3) vào một tập tin trên SIGUSR1, và sau đó chuyển đổi nó để nguồn được chú thích.

+0

Hãy xem lsstack được triển khai. Nó không cần mã trình điều khiển đặc biệt để có được backtrace hiện tại. Cũng đặt mã của bạn ra trên bitbucket hoặc mã google. Nếu bạn nhận được một dự án đã hoàn thành, tôi sẽ đóng góp các bản sửa lỗi khi tôi sử dụng nó. –

+0

@caspin, OK, Bây giờ tôi đang tìm cách sử dụng gdb (http://stackoverflow.com/questions/3999464/how-to-make-gdb-get-stacktrace-repeatably) để làm điều tương tự. –

+0

Tôi đã thử mã của bạn, nhưng nó treo, bởi vì bạn đang sử dụng fopen từ một bộ xử lý tín hiệu, được biết là treo (bạn chỉ có thể sử dụng rất ít chức năng từ một bộ xử lý tín hiệu). –

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