Kernel marker

De Wikipedia, la enciclopedia libre

Kernel marker era un mecanismo de soporte de instrumentacón estática para el código fuente del núcleo Linux, permitiendo que las herramientas especiales, tales como LTTng[1]​ o SystemTap,[2]​ para rastrear la información expuesta por estos puntos de prueba. Los marcadores de kernel fueron declarados en el código del kernel por una sola línea de código:

trace_mark(name, format_string, ...);

Donde nombre es el nombre único del marcador, y formato_string describe los tipos de argumentos restantes. Un marcador puede estar activado o desactivado dependiendo de si una sonda está conectada a él o no. El código que quiere ver en un primer punto de rastreo de llamadas:

int marker_probe_register(const char *name, const char *format_string, marker_probe_func *probe, void *pdata);

para registrar su devolución de llamada de la sonda con el punto marcador (pdata es un valor de datos privados que el código quiere pasar a la sonda). Más tarde, la sonda se activa y desactiva usando:

int marker_arm(const char *name);
int marker_disarm(const char *name);

El uso de marcadores tiene una sobrecarga insignificante gracias en parte a los valores inmediatos,[3]​ otro mecanismo de soporte que incorpora interruptores en el código que se pueden activar y desactivar dinámicamente, sin usar una referencia de memoria y, por lo tanto, guardar las líneas de caché.[4]

La motivación inicial para crear esta infraestructura de instrumentación estática fue la gran sobrecarga de rendimiento inducida por el mecanismo de Kprobe, mecanismo de instrumentación dinámica anterior, que depende de los puntos de interrupción. La instrumentación estática también puede sobrevivir más fácilmente a los cambios en el código fuente porque los marcadores están en el código fuente.

Los marcadores de kernel consistían esencialmente en una macro de preprocesamiento de C que agregaba, en la función instrumentada, una rama sobre una llamada de función . Al hacerlo, ni la configuración de la pila ni la llamada a la función se ejecutan cuando la instrumentación no está habilitada. Al identificar la configuración de la pila de ejecución de la rama y la llamada a la función como improbable (al usar el gcc incorporado expect ()), se da una pista al compilador para ubicar las instrucciones de rastreo lejos de las líneas de caché involucradas en la ejecución estándar del kernel.[5]

Se identificaron dos inconvenientes de Kernel marker[5]​ que llevaron a su reemplazo por Tracepoints:

  • La verificación de tipo se limitó a tipos escalares porque la API se basa en cadenas de formato. Esto podría ser problemático si los punteros deben ser eliminados por el código trazador.
  • Los Marcadores "ocultan" la instrumentación en el código fuente, sin mantener un registro global de la instrumentación. Esto dificulta las convenciones de espacio de nombres y el seguimiento de la modificación de la instrumentación a menos que se supervise todo el árbol del núcleo.

Un conjunto de parches implementándolos se fusionó en la versión 2.6.24,[6]​ que se lanzó el 24 de enero de 2008. Para abordar los problemas relacionados con los marcadores del kernel, Mathieu Desnoyers, su autor original, implementó una versión más simple y más segura de tipos de los puntos de la sonda estática llamados Tracepoints. Un conjunto de parches que implementó Tracepoints se fusionó en la versión 2.6.28,[7]​ que se lanzó el 25 de diciembre de 2008. A partir de ese momento, los marcadores del kernel se eliminaron lentamente de las fuentes del kernel y finalmente se eliminaron completamente en el núcleo Linux 2.6.32,[8][9]​ que fue lanzado el 3 de diciembre de 2009.

Véase también[editar]

Referencias[editar]

  1. Tracepoints and Markers Archivado el 23 de septiembre de 2009 en Wayback Machine., LTTng's Tracing Wiki
  2. Using Markers, SystemTap Wiki
  3. Mathieu Desnoyers, [patch 08/10] Immediate Value - Documentation
  4. Mathieu Desnoyers, [patch 7/8] Immediate Values - Documentation
  5. a b Mathieu Desnoyers, Low-Impact Operating System Tracing, Ph. D. Dissertation, Département de génie informatique et génie logiciel, École Polytechnique de Montréal, Université de Montréal, December 2009
  6. Linux 2.6.24 Changelog, Linux Kernel Newbies
  7. Linux 2.6.28 Changelog, Linux Kernel Newbies
  8. Linux 2.6.32 Changelog, Linux Kernel Newbies
  9. Christoph Hellwig, fc537766 tracing: Remove markers, Torvalds' Linux git tree

Enlaces externos[editar]