Mam jądro PREEMPT 2.6.35 działające na procesorze ARMv7 o średniej prędkości. Mniej więcej raz na 100 - 125s coś powoduje, że jądro nie przetwarza niektórych sterowników związanych z dźwiękiem wystarczająco szybko, aby uniknąć niedopełnienia. Napad jest zwykle w zakresie 15-30 ms, ale może być znacznie dłuższy. Nie jest jasne, czy zatrzymanie jest całkowicie w jądrze, czy może dotyczyć planowania procesu użytkownika działającego z priorytetem w czasie rzeczywistym (SCHED_RR, 2).
Domyślam się, że istnieje (co najmniej jeden) sterownik, który nie gra dobrze z uprzedzeniem.
Niektóre dane wyjściowe strace z procesu użytkownika ilustrują pewien aspekt zarówno normalnego, jak i nienormalnego zachowania, chociaż nie jestem pewien, jak interpretować różne raporty czasowe?
Normalny przypadek:
Ankieta 0,000518 ([{fd = 10, wydarzenia = POLLIN | POLLERR | POLLNVAL, revents = POLLIN}], 1, 3415) = 1 0,010202 ankieta ([{fd = 10, events = POLLIN | POLLERR | POLLNVAL}, {fd = 6, events = POLLOUT | POLLERR | POLLNVAL, revents = POLLOUT}], 2, 3404) = 1 Ankieta 0,000585 ([{fd = 10, events = POLLIN | POLLERR | POLLNVAL}, {fd = 6, events = POLLOUT | POLLERR | POLLNVAL, revents = POLLOUT}], 2, 3404) = 1 Ankieta 0,000302 ([{fd = 10, wydarzenia = POLLIN | POLLERR | POLLNVAL, revents = POLLIN}], 1, 3404) = 1 0,010706 ankieta ([{fd = 10, events = POLLIN | POLLERR | POLLNVAL}, {fd = 6, events = POLLOUT | POLLERR | POLLNVAL, revents = POLLOUT}], 2, 3393) = 1 Ankieta 0,000480 ([{fd = 10, wydarzenia = POLLIN | POLLERR | POLLNVAL}, {fd = 6, wydarzenia = POLLOUT | POLLERR | POLLNVAL, revents = POLLOUT}], 2, 3392) = 1
W ankiecie nie występuje blokowanie danych wyjściowych na fd6, a gdy tylko fd10 jest odpytywany o wejście, następuje blok około 10 ms. Znajduje to odzwierciedlenie zarówno w raporcie o czasie trwania wywołania systemowego, jak i odstępie czasu między wywołaniami systemowymi (są one spójne).
Przypadek awarii (przykład skrajny):
Ankieta 0,000305 ([{fd = 10, wydarzenia = POLLIN | POLLERR | POLLNVAL, revents = POLLIN}], 1, 3543) = 1 0,010730 ankieta ([{fd = 10, events = POLLIN | POLLERR | POLLNVAL}, {fd = 6, events = POLLOUT | POLLERR | POLLNVAL, revents = POLLOUT}], 2, 3533) = 1 Ankieta 0,000475 ([{fd = 10, wydarzenia = POLLIN | POLLERR | POLLNVAL}, {fd = 6, wydarzenia = POLLOUT | POLLERR | POLLNVAL, revents = POLLOUT}], 2, 3532) = 1 Ankieta 0,000329 ([{fd = 10, wydarzenia = POLLIN | POLLERR | POLLNVAL, revents = POLLIN}], 1, 3532) = 1 0,953349 ankieta ([{fd = 10, wydarzenia = POLLIN | POLLERR | POLLNVAL}, {fd = 6, wydarzenia = POLLOUT | POLLERR | POLLNVAL, revents = POLLOUT | POLLERR}], 2, 2578) = 1
Zauważ, że w tym przypadku, mimo że drugie przedostatnie połączenie jest nagrywane jako zajmujące 10 ms (normalnie), jest to 953 ms przed ostatnim połączeniem.
Jakich narzędzi mogę użyć do wyśledzenia winnego?