Tengo un kernel 2.6.35 PREEMPT ejecutándose en un procesador ARMv7 de velocidad moderada. Aproximadamente una vez cada 100-125, algo hace que el kernel no pueda procesar algunos controladores relacionados con el audio lo suficientemente rápido como para evitar subestimaciones. Los retrasos generalmente están en el rango de 15-30 ms, pero pueden ser mucho más largos. No está claro si la retención es totalmente en el núcleo o puede estar relacionada con la programación de un proceso de usuario que se ejecuta con prioridad en tiempo real (SCHED_RR, 2).
Supongo que hay un (al menos uno) controlador que no está jugando bien con preferencia.
Algunos resultados extraños del proceso del usuario ilustran algunos aspectos del comportamiento normal y anormal, aunque no estoy seguro de cómo interpretar los diversos informes de tiempo.
Caso normal:
0.000518 encuesta ([{fd = 10, eventos = POLLIN | POLLERR | POLLNVAL, revents = POLLIN}], 1, 3415) = 1 0.010202 encuesta ([{fd = 10, eventos = POLLIN | POLLERR | POLLNVAL}, {fd = 6, eventos = POLLOUT | POLLERR | POLLNVAL, revents = POLLOUT}], 2, 3404) = 1 0.000585 encuesta ([{fd = 10, eventos = POLLIN | POLLERR | POLLNVAL}, {fd = 6, eventos = POLLOUT | POLLERR | POLLNVAL, revents = POLLOUT}], 2, 3404) = 1 0.000302 encuesta ([{fd = 10, eventos = POLLIN | POLLERR | POLLNVAL, revents = POLLIN}], 1, 3404) = 1 0.010706 encuesta ([{fd = 10, eventos = POLLIN | POLLERR | POLLNVAL}, {fd = 6, eventos = POLLOUT | POLLERR | POLLNVAL, revents = POLLOUT}], 2, 3393) = 1 0.000480 encuesta ([{fd = 10, eventos = POLLIN | POLLERR | POLLNVAL}, {fd = 6, eventos = POLLOUT | POLLERR | POLLNVAL, revents = POLLOUT}], 2, 3392) = 1
No se produce bloqueo en el sondeo para la salida en fd6 y, cuando solo se sondea fd10 para la entrada, se produce un bloqueo de alrededor de 10 ms. Esto se refleja tanto en el informe de la duración de la llamada al sistema como en el intervalo entre las llamadas al sistema (son consistentes).
Caso de falla (ejemplo extremo):
0.000305 encuesta ([{fd = 10, eventos = POLLIN | POLLERR | POLLNVAL, revents = POLLIN}], 1, 3543) = 1 0.010730 encuesta ([{fd = 10, eventos = POLLIN | POLLERR | POLLNVAL}, {fd = 6, eventos = POLLOUT | POLLERR | POLLNVAL, revents = POLLOUT}], 2, 3533) = 1 0.000475 encuesta ([{fd = 10, eventos = POLLIN | POLLERR | POLLNVAL}, {fd = 6, eventos = POLLOUT | POLLERR | POLLNVAL, revents = POLLOUT}], 2, 3532) = 1 0.000329 encuesta ([{fd = 10, eventos = POLLIN | POLLERR | POLLNVAL, revents = POLLIN}], 1, 3532) = 1 0.953349 encuesta ([{fd = 10, eventos = POLLIN | POLLERR | POLLNVAL}, {fd = 6, eventos = POLLOUT | POLLERR | POLLNVAL, revents = POLLOUT | POLLERR}], 2, 2578) = 1
Observe en este caso que, a pesar de que la penúltima llamada se registra como de 10 ms (normal), es 953 ms antes de la última llamada.
¿Qué herramientas puedo usar para localizar al culpable?