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?
Respuestas:
perf
puede ser útil para usted Es parte de las utilidades del kernel de Linux.Por ejemplo:
Mostrará todos los parámetros y tiempos de entrada / salida de syscall (como strace), proporcionará el nombre del binario que invoca la syscall y muestreará la pila de llamadas de cada CPU con cierta frecuencia (incluidos los símbolos del kernel). Para que pueda ver qué código se ejecutó durante la llamada al sistema. En un sistema multiprocesador, debe prestar atención a la identificación de la CPU (por ejemplo, [001]).
fuente
Tal vez
atop
pueda arrojar algo de luz sobre su problema.Puede mostrar procesos que ya salieron, y puede mostrar la utilización de CPU , memoria , disco y red .
Puede ejecutarlo de forma interactiva, dejarlo escribir en un archivo de texto o ejecutarlo como
sar
en un intervalo predefinido, creando un archivo de historial binario que puede recorrer después.Lo uso para encontrar cerdos de todo tipo que son difíciles de encontrar :-)
fuente