У мене ядро PREEMPT 2.6.35 працює на процесорі ARMv7 з помірною швидкістю. Приблизно кожні 100 - 125s щось спричиняє, що ядро не може досить швидко обробити деякі пов'язані зі звуком драйвери, щоб уникнути недоліків. Затримка, як правило, знаходиться в межах 15-30 мс, але може бути набагато довше. Незрозуміло, чи є затримка повністю в ядрі чи може стосуватися планування користувацького процесу, що працює з пріоритетом у режимі реального часу (SCHED_RR, 2).
Я здогадуюсь, що є (принаймні один) драйвер, який не грає добре з викупом.
Деякий вихід напруги з користувальницького процесу ілюструє певний аспект як нормальної, так і ненормальної поведінки, хоча я не впевнений, як інтерпретувати різні часові звіти?
Звичайний випадок:
0,000518 опитування ([{fd = 10, події = POLLIN | POLLERR | POLLNVAL, revents = POLLIN}], 1, 3415) = 1 0,010202 опитування ([{fd = 10, події = POLLIN | POLLERR | POLLNVAL}, {fd = 6, події = POLLOUT | POLLERR | POLLNVAL, revents = POLLOUT}], 2, 3404) = 1 0,000585 опитування ([{fd = 10, події = POLLIN | POLLERR | POLLNVAL}, {fd = 6, події = POLLOUT | POLLERR | POLLNVAL, revents = POLLOUT}], 2, 3404) = 1 0,000302 опитування ([{fd = 10, події = POLLIN | POLLERR | POLLNVAL, revents = POLLIN}], 1, 3404) = 1 0,010706 опитування ([{fd = 10, події = POLLIN | POLLERR | POLLNVAL}, {fd = 6, події = POLLOUT | POLLERR | POLLNVAL, revents = POLLOUT}], 2, 3393) = 1 0,000480 опитування ([{fd = 10, події = POLLIN | POLLERR | POLLNVAL}, {fd = 6, події = POLLOUT | POLLERR | POLLNVAL, revents = POLLOUT}], 2, 3392) = 1
Блокування в опитуванні для виведення на fd6 не відбувається, і, коли для введення запитується лише fd10, виникає блок близько 10 мс. Це відображається як у звіті про тривалість системного виклику, так і інтервал між системними дзвінками (вони відповідають).
Випадок відмови (крайній приклад):
Опитування 0,000305 ([{fd = 10, події = POLLIN | POLLERR | POLLNVAL, revents = POLLIN}], 1, 3543) = 1 0,010730 опитування ([{fd = 10, події = POLLIN | POLLERR | POLLNVAL}, {fd = 6, події = POLLOUT | POLLERR | POLLNVAL, revents = POLLOUT}], 2, 3533) = 1 Опитування 0,000475 ([{fd = 10, події = POLLIN | POLLERR | POLLNVAL}, {fd = 6, події = POLLOUT | POLLERR | POLLNVAL, revents = POLLOUT}], 2, 3532) = 1 0,000329 опитування ([{fd = 10, події = POLLIN | POLLERR | POLLNVAL, revents = POLLIN}], 1, 3532) = 1 0,953349 опитування ([{fd = 10, події = POLLIN | POLLERR | POLLNVAL}, {fd = 6, події = POLLOUT | POLLERR | POLLNVAL, revents = POLLOUT | POLLERR}], 2, 2578) = 1
Зауважте в цьому випадку, що, хоча другий останній дзвінок записується як 10 мс (звичайно), він становить 953 мс до останнього дзвінка.
Які інструменти я можу використовувати, щоб знайти винуватця?