Localizar el kernel de CPU ocasional

11

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?

horrible
fuente
2
Puntos de bonificación para la pregunta interesante. No estoy seguro de cómo responderlo, pero tengo una pregunta sobre cómo rastrearlo hasta el uso de la CPU (a diferencia de los picos en iowait, por ejemplo).
Bratchley
1
La primera suposición es si está ejecutando JFFS2 o YAFFS en un gran flash NAND, especialmente si está grabando. Desactive cualquier cosa que escriba en flash y vea si eso ayuda. ¿Cómo es tu tabla de procesos? Puede usar ftrace como último recurso si tiene una cadena de herramientas para construir el núcleo.
Jonathan Ben-Avraham
sar -bu podría hacerlo ... linux.die.net/man/1/sar
Grizly
Hay algo de flash en uso; una tarjeta SD con un sistema de archivos ext4 montado. Y las escrituras son de hecho una posible fuente de estos problemas (pero ¿por qué, exactamente?), Pero probablemente no sea el único.
horrible

Respuestas:

1

perfpuede ser útil para usted Es parte de las utilidades del kernel de Linux.

Por ejemplo:

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 

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]).

Zulan
fuente
Investigaré para obtener un rendimiento construido para la plataforma, gracias por la sugerencia.
horrible
0

Tal vez atoppueda 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 saren 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 :-)

trapicki
fuente