Usar ftrace

ftrace es una herramienta de depuración para comprender lo que sucede dentro del Kernel de Linux En las siguientes secciones, se detalla la funcionalidad básica de ftrace, ftrace con atrace (que captura eventos del kernel) y ftrace dinámico.

Para obtener detalles sobre la funcionalidad avanzada de ftrace que no está disponible en Systrace, consulta la documentación de ftrace en <kernel tree>/Documentation/trace/ftrace.txt

Cómo capturar eventos del kernel con atrace

atrace (frameworks/native/cmds/atrace) usa ftrace para capturar eventos de kernel. A su vez, systrace.py (o run_systrace.py en versiones posteriores de Catapult) usa adb. para ejecutar atrace en el dispositivo. atrace hace lo siguiente:

  • Configura una propiedad para configurar el seguimiento en modo de usuario. (debug.atrace.tags.enableflags).
  • Habilita la funcionalidad de ftrace deseada escribiendo en el nombre de ftrace sysfs. Sin embargo, como ftrace admite más funciones, puedes establecer algunos nodos sysfs, luego, usa atrace.

A excepción del seguimiento durante el inicio, usa atrace para establecer la al valor adecuado. La propiedad es una máscara de bits y no hay manera de determinar los valores correctos, no solo mediante el encabezado adecuado (que podría cambiar entre las versiones de Android).

Habilitar eventos de ftrace

Los nodos ftrace sysfs están en /sys/kernel/tracing y realizan seguimiento los eventos se dividen en categorías en /sys/kernel/tracing/events.

Para habilitar eventos por categoría, usa lo siguiente:

echo 1 > /sys/kernel/tracing/events/irq/enable

Para habilitar eventos por evento, usa lo siguiente:

echo 1 > /sys/kernel/tracing/events/sched/sched_wakeup/enable

Si se han habilitado eventos adicionales escribiendo en nodos sysfs, estos no puede restablecerse con atrace. Un patrón común para la introducción de dispositivos Qualcomm es habilitar kgsl (GPU) y mdss (canalización de muestra) puntos de seguimiento y, luego, usa atrace o Systrace:

adb shell "echo 1 > /sys/kernel/tracing/events/mdss/enable"
adb shell "echo 1 > /sys/kernel/tracing/events/kgsl/enable"
./systrace.py sched freq idle am wm gfx view binder_driver irq workq ss sync -t 10 -b 96000 -o full_trace.html

También puedes usar ftrace sin atrace o systrace, que es útil cuando quieres seguimientos solo de kernel (o si te tomaste el tiempo para escribir la propiedad de seguimiento de modo de usuario manualmente). Para ejecutar solo ftrace, haz lo siguiente:

  1. Configura el tamaño del búfer en un valor lo suficientemente grande para el seguimiento:
    echo 96000 > /sys/kernel/tracing/buffer_size_kb
    
  2. Habilita el seguimiento:
    echo 1 > /sys/kernel/tracing/tracing_on
    
  3. Ejecuta la prueba y, luego, inhabilita el seguimiento:
    echo 0 > /sys/kernel/tracing/tracing_on
    
  4. Vuelca el registro:
    cat /sys/kernel/tracing/trace > /data/local/tmp/trace_output
    

trace_output proporciona el registro en forma de texto. Para visualizarlos usando Con la catapulta, toma el Catapult desde GitHub y ejecuta trace2html:

catapult/tracing/bin/trace2html ~/path/to/trace_file

De forma predeterminada, esto escribe trace_file.html en la misma .

Correlaciona eventos

A menudo, resulta útil observar la visualización de Catapult y la función ftrace registrar simultáneamente; por ejemplo, algunos eventos ftrace (especialmente específicos del proveedor uno) no se visualizan con Catapult. Sin embargo, las marcas de tiempo de Catapult en relación con el primer evento del seguimiento o con una marca de tiempo específica atrace se vuelcan, mientras que las marcas de tiempo de ftrace sin procesar se basan en un fuente de reloj absoluta en el kernel de Linux.

Para encontrar un evento ftrace determinado a partir de un evento Catapult:

  1. Abre el registro ftrace sin procesar. Los seguimientos en versiones recientes de Systrace son se comprime de forma predeterminada:
    • Si capturaste tu Systrace con --no-compress, este se encuentra en el archivo html en la sección que comienza con COMENZAR TRACE.
    • De lo contrario, ejecuta html2trace desde Catapult árbol (tracing/bin/html2trace) para descomprimir el seguimiento.
  2. Busca la marca de tiempo relativa en la visualización de Catapult.
  3. Busca una línea al comienzo del seguimiento que contenga tracing_mark_sync Debería ser similar a lo siguiente:
    <5134>-5134  (-----) [003] ...1    68.104349: tracing_mark_write: trace_event_clock_sync: parent_ts=68.104286
    

    Si esta línea no existe (o si usaste ftrace sin atrace), entonces los tiempos serán relativos al primer evento en el registro de ftrace.
    1. Agrega la marca de tiempo relativa (en milisegundos) al valor en parent_ts (en segundos).
    2. Busca la nueva marca de tiempo.

Estos pasos deberían posicionarte en el evento (o, al menos, muy cerca de él).

Cómo usar ftrace dinámico

Cuando Systrace y ftrace estándar no son suficientes, hay un último recurso disponible: dynamic ftrace. El ftrace dinámico incluye la reescritura código del kernel después del inicio y, como resultado, no está disponible en la producción kernels por motivos de seguridad. Sin embargo, cada error de rendimiento difícil en Entre 2015 y 2016, se usó ftrace dinámico. Es especialmente potente para depurar suspensiones sin interrupciones porque puedes obtener un seguimiento de pila en el kernel cada vez que presionas la función que activa la suspensión sin interrupciones. También puedes depurar secciones con interrupciones y interrupciones inhabilitadas, serán muy útiles para demostrar problemas.

Para activar ftrace dinámico, edita la defconfig de tu kernel:

  1. Quita CONFIG_STRICT_MEMORY_RWX (si está presente). Si tienes la versión 3.18 o más nueva y arm64, no está allí.
  2. Agrega lo siguiente: CONFIG_DYNAMIC_FTRACE=y, CONFIG_FUNCTION_TRACER=y, CONFIG_IRQSOFF_TRACER=y, CONFIG_FUNCTION_PROFILER=y y CONFIG_PREEMPT_TRACER=y
  3. Vuelve a compilar e inicia el kernel nuevo.
  4. Ejecuta el siguiente comando para buscar rastreadores disponibles:
    cat /sys/kernel/tracing/available_tracers
    
  5. Confirma que el comando muestre function, irqsoff. preemptoff y preemptirqsoff.
  6. Ejecuta el siguiente comando para asegurarte de que ftrace dinámico funcione:
    cat /sys/kernel/tracing/available_filter_functions | grep <a function you care about>
    

Luego de completar estos pasos, tendrás ftrace dinámico, el generador de perfiles de funciones, el generador de perfiles irqsoff y el generador de perfiles de interrupción disponible. Nosotros sólidamente recomienda que leas la documentación de ftrace sobre estos temas antes de ya que son potentes pero complejas. irqsoff y preventoff son principalmente útiles para confirmar que los conductores pueden estar dejando interrupciones o interrupciones se desactivó demasiado tiempo.

El generador de perfiles de funciones es la mejor opción para los problemas de rendimiento y, a menudo, que se usa para averiguar dónde se llama a una función.


Si los datos del generador de perfiles de funciones no son lo suficientemente específicos, puedes combinarlos ftracepoints con el generador de perfiles de funciones. los eventos de ftrace pueden habilitarse como de costumbre y se intercalarán con tu registro. Esto es muy útil si hay un sueño largo y ocasional en un período específico función que quieres depurar: establece el filtro ftrace en la función que desees habilitar puntos de seguimiento, hacer un seguimiento. Puedes analizar el seguimiento resultante con trace2html, encuentra el evento que deseas y, luego, obtén seguimientos de pila cercanos en el seguimiento sin procesar.

Cómo usar la estadística de bloqueo

A veces, ftrace no es suficiente y debes depurar lo que parece contención de bloqueo de kernel. Hay una opción más de kernel que vale la pena probar: CONFIG_LOCK_STAT Este es un último recurso, ya que es muy difícil de poner en funcionamiento en dispositivos Android, ya que aumenta el tamaño más allá de lo que pueden manejar la mayoría de los dispositivos.

Sin embargo, Lockstat usa el modelo de bloqueando la infraestructura, que es útil para muchas otras apps. Todos Cuando trabajas con la carga del dispositivo, deberías encontrar la manera de hacer que esa opción funcione. en todos los dispositivos, ya que habrá algún momento en que pienses "Si tan solo pudiera activar LOCK_STAT, podría confirmar o refutar esto como el problema en cinco minutos en lugar de cinco días".


Si puedes iniciar un kernel con la opción de configuración, el seguimiento de bloqueo es similar a ftrace:

  1. Habilita el seguimiento:
    echo 1 > /proc/sys/kernel/lock_stat
    
  2. Ejecuta la prueba.
  3. Inhabilita el seguimiento:
    echo 0 > /proc/sys/kernel/lock_stat
    
  4. Vuelca el registro:
    cat /proc/lock_stat > /data/local/tmp/lock_stat
    

Para obtener ayuda en la interpretación del resultado resultante, consulta la documentación de Lockstat en <kernel>/Documentation/locking/lockstat.txt.

Usar puntos de seguimiento del proveedor

Usa puntos de seguimiento ascendentes primero, aunque a veces deberás usar puntos de seguimiento del proveedor:

  { "gfx",        "Graphics",         ATRACE_TAG_GRAPHICS, {
        { OPT,      "events/mdss/enable" },
        { OPT,      "events/sde/enable" },
        { OPT,      "events/mali_systrace/enable" },
    } },

El servicio de HAL puede extender los puntos de seguimiento, lo que te permite agregar un seguimiento específico del dispositivo. puntos/categorías. Los puntos de seguimiento están integrados en perfetto, atrace/systrace y en el sistema integrado en el dispositivo app de seguimiento de conversiones.

Las APIs para implementar puntos de seguimiento o categorías son las siguientes:

  • listCategories() genera (vec<TracingCategory>>).
  • enableCategories(vec<string> categories) genera (Estado de estado);
  • inhabilitarAllCategories() genera (estado de estado);
Para obtener más información, consulta la definición y la implementación predeterminada de HAL en AOSP: