Xác định vị trí nhân CPU CPU thỉnh thoảng


11

Tôi có kernel 2.6,35 PREEMPT chạy trên bộ xử lý ARMv7 tốc độ trung bình. Cứ sau khoảng 100 - 125 giây, một cái gì đó khiến kernel không thể xử lý một số trình điều khiển liên quan đến âm thanh đủ nhanh để tránh bị lép. Việc giữ máy thường trong khoảng 15-30ms, nhưng có thể lâu hơn rất nhiều. Không rõ liệu việc giữ lại hoàn toàn trong kernel hay có thể liên quan đến việc lập lịch trình cho quá trình người dùng đang chạy với mức độ ưu tiên theo thời gian thực (SCHED_RR, 2).

Tôi đoán là có một (ít nhất một) tài xế không chơi đẹp với sự ưu tiên.

Một số đầu ra bước từ quá trình người dùng minh họa một số khía cạnh của cả hành vi bình thường và bất thường, mặc dù tôi không chắc chắn làm thế nào để giải thích các báo cáo thời gian khác nhau?

Trường hợp bình thường:

     Thăm dò 0,000518 ([{fd = 10, sự kiện = POLLIN | POLLERR | POLLNVAL, revents = POLLIN}], 1, 3415) = 1 
     Thăm dò ý kiến ​​0,010202 ([{fd = 10, event = POLLIN | POLLERR | POLLNVAL}, {fd = 6, event = POLLOUT | POLLERR | POLLNVAL, revents = POLLOUT}], 2, 3404) = 1 
     Thăm dò 0,000585 ([{fd = 10, event = POLLIN | POLLERR | POLLNVAL}, {fd = 6, event = POLLOUT | POLLERR | POLLNVAL, revents = POLLOUT}], 2, 3404) = 1 
     Thăm dò ý kiến ​​0.000302 ([{fd = 10, sự kiện = POLLIN | POLLERR | POLLNVAL, revents = POLLIN}], 1, 3404) = 1 
     Thăm dò ý kiến ​​0,010706 ([{fd = 10, event = POLLIN | POLLERR | POLLNVAL}, {fd = 6, event = POLLOUT | POLLERR | POLLNVAL, revents = POLLOUT}], 2, 3393) = 1 
     Thăm dò 0,000480 ([{fd = 10, event = POLLIN | POLLERR | POLLNVAL}, {fd = 6, event = POLLOUT | POLLERR | POLLNVAL, revents = POLLOUT}], 2, 3392) = 1 

Không có chặn xảy ra trong cuộc thăm dò cho đầu ra trên fd6 và khi chỉ có fd10 được thăm dò cho đầu vào, một khối khoảng 10ms xảy ra. Điều này được phản ánh cả trong báo cáo về thời lượng của cuộc gọi hệ thống và khoảng thời gian giữa các cuộc gọi hệ thống (chúng là nhất quán).

Trường hợp thất bại (ví dụ cực đoan):

     Thăm dò ý kiến ​​0,000305 ([{fd = 10, sự kiện = POLLIN | POLLERR | POLLNVAL, revents = POLLIN}], 1, 3543) = 1 
     Cuộc thăm dò 0,010730 ([{fd = 10, event = POLLIN | POLLERR | POLLNVAL}, {fd = 6, event = POLLOUT | POLLERR | POLLNVAL, revents = POLLOUT}], 2, 3533) = 1 
     Thăm dò ý kiến ​​0,000485 ([{fd = 10, event = POLLIN | POLLERR | POLLNVAL}, {fd = 6, event = POLLOUT | POLLERR | POLLNVAL, revents = POLLOUT}], 2, 3532) = 1 
     Thăm dò ý kiến ​​0,000329 ([{fd = 10, sự kiện = POLLIN | POLLERR | POLLNVAL, revents = POLLIN}], 1, 3532) = 1 
     Cuộc thăm dò 0,953349 ([{fd = 10, sự kiện = POLLIN | POLLERR | POLLNVAL}, {fd = 6, sự kiện = POLLOUT | POLLERR | POLLNVAL, revents = POLLOUT | POLLERR}], 2, 2578) 

Lưu ý trong trường hợp này, mặc dù cuộc gọi cuối cùng thứ hai được ghi là mất 10ms (bình thường), nhưng đó là 953ms trước cuộc gọi cuối cùng.

Tôi có thể sử dụng công cụ nào để truy tìm thủ phạm?


2
Điểm thưởng cho câu hỏi thú vị. Tôi không chắc chắn làm thế nào để trả lời nó, nhưng tôi có một câu hỏi là làm thế nào để theo dõi nó trở lại sử dụng CPU (ví dụ như trái ngược với gai trong iowait)?
Bratchley

1
Đầu tiên là nếu bạn đang chạy JFFS2 hoặc YAFFS trên đèn flash NAND lớn, đặc biệt nếu bạn đang ghi. Vô hiệu hóa bất cứ điều gì ghi vào flash và xem nếu điều đó giúp. Bảng quy trình của bạn trông như thế nào? Bạn có thể sử dụng ftrace như là phương sách cuối cùng nếu bạn có một toolchain để xây dựng kernel.
Jonathan Ben-Avraham

sar -bu có thể làm điều đó .. linux.die.net/man/1/sar
Grizly

Có một số đèn flash được sử dụng; một thẻ SD với hệ thống tập tin ext4 được gắn kết. Và viết cho nó thực sự là một nguồn có thể của những vấn đề này (nhưng tại sao, chính xác?) Nhưng có lẽ không phải là vấn đề duy nhất.
khủng khiếp

Câu trả lời:


1

perfcó thể hữu ích cho bạn Nó là một phần của tiện ích kernel linux.

Ví dụ:

perf record -R -a -g fp -e cycles -e syscalls:sys_enter_poll -e syscalls:sys_exit_poll
#Just ctrl+c if you are done, and view ith
perf script 

Nó sẽ hiển thị tất cả các tham số và thời gian nhập / thoát của tòa nhà (như strace), cung cấp tên của nhị phân gọi tòa nhà và lấy mẫu cửa sổ của mỗi CPU ở một số tần số (bao gồm cả các ký hiệu nhân). Vì vậy, bạn thực sự có thể thấy những gì mã đã được thực thi trong tòa nhà. Trong hệ thống đa bộ xử lý, bạn cần chú ý đến id cpu (ví dụ [001]).


Tôi sẽ xem xét việc xây dựng hoàn hảo cho nền tảng - cảm ơn vì tiền boa.
khủng khiếp

0

Có lẽ atopcó thể làm sáng tỏ vấn đề của bạn.

Nó có thể hiển thị các quy trình đã thoát và nó có thể hiển thị việc sử dụng CPU , Bộ nhớ , ĐĩaMạng .

Bạn có thể chạy nó tương tác, để nó ghi vào một tệp văn bản hoặc chạy nó như sartrong một khoảng thời gian được xác định trước, tạo một tệp lịch sử nhị phân mà bạn có thể bước qua sau đó.

Tôi sử dụng nó để tìm những con lợn đủ loại khó tìm :-)

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.