...

Comprender y utilizar los puntos de seguimiento del núcleo para el análisis del rendimiento en Linux

Gracias a los puntos de seguimiento del núcleo (tracepoints), puedo comprender los problemas de rendimiento en Linux hasta el nivel del núcleo y medir de forma específica dónde se pierde tiempo. Utilizo estos Puntos de medición, para supervisar los procesos en el programador, en la pila de E/S y en la ruta de red, con un esfuerzo adicional mínimo y datos de eventos claros.

Puntos centrales

Los siguientes aspectos clave te ofrecen una visión general rápida de lo que tengo en cuenta al trabajar con puntos de traza.

  • Estática Los eventos «anclados» proporcionan datos fiables en puntos clave del código.
  • Baja sobrecarga hace que el trazado sea viable incluso bajo una carga elevada.
  • Un amplio ecosistema con ftrace, perf, LTTng y herramientas eBPF.
  • Activación selectiva y el filtrado evita la sobrecarga de datos.
  • Combinación Con los contadores de rendimiento se muestran las cadenas de causas.

Mantengo la lista concisa y me centro en las Prioridades del análisis. Así no pierdo tiempo en aspectos secundarios y no pierdo de vista las señales más importantes. Los puntos mencionados guían mi trabajo práctico desde la primera sospecha hasta la optimización verificada. De este modo consigo Transparencia y la reproducibilidad. Me baso siempre en los datos y controlo cada paso.

¿Qué son los puntos de seguimiento del núcleo?

Un punto de seguimiento es un punto de instrumentación estático en el código del núcleo que desencadena un evento con campos estructurados. Allí veo, entre otras cosas, PID, marcas de tiempo, CPU, códigos de estado o datos de tamaño, según el evento. Mediante macros como TRACE_EVENT, el núcleo define la ubicación, el formato y los datos proporcionados. Estos eventos se producen en interfaces relevantes como la programación, la E/S de bloques, los sistemas de archivos o la ruta de red. Puedo activarlos en cualquier momento sin necesidad de aplicar parches al núcleo ni poner en riesgo los sistemas de producción, lo que me Planificar la seguridad allí.

Por qué utilizar puntos de seguimiento para medir el rendimiento

Los puntos de seguimiento apenas suponen ningún coste cuando están inactivos y solo añaden una pequeña sobrecarga al activarse. Incluso con los eventos activados, normalmente solo mido una latencia adicional del orden de unas pocas decenas de nanosegundos, lo cual es suficiente para sistemas con estrictos Objetivos de latencia. Al estar firmemente integradas en el núcleo, puedo repetir los análisis de forma coherente en diferentes versiones del núcleo. Su salida estructurada se puede analizar y procesar de forma fiable. De este modo, obtengo fiable Mediciones en lugar de fragmentos de registro poco claros.

Marcas de tiempo, relojes y orden

Para interpretar correctamente las latencias, presto atención a la fuente de tiempo utilizada. Los relojes monótonos (por ejemplo, CLOCK_MONOTONIC) son más fiables para las mediciones que el tiempo real, ya que las correcciones NTP no se aplican de forma retroactiva. En los sistemas multinúcleo, los búferes por CPU proporcionan eventos cuyo orden es correcto a nivel local de la CPU, pero que solo se pueden comparar entre CPU mediante las marcas de tiempo. Por eso calibro la perspectiva: o bien ordeno los eventos por CPU, o bien utilizo herramientas que sincronizan los búferes y resuelven correctamente los conflictos en la línea temporal. Cuando el presupuesto es muy ajustado, compruebo si la base TSC es estable, para que las desviaciones no se interpreten erróneamente como fluctuaciones. De este modo evito interpretaciones erróneas cuando, por ejemplo, se producen activaciones en la CPU 3 y cambios de contexto en la CPU 7.

Resumen del ecosistema de rastreo de Linux

Utilizo varias herramientas que se basan todas en los mismos eventos de Tracepoint. ftrace permite activarlas rápidamente a través del sistema de archivos de rastreo y resulta adecuado para comprobaciones puntuales con Vista en directo. Con perf, conecto puntos de seguimiento, contadores de hardware y muestreo para hacer visibles las correlaciones. LTTng permite realizar registros prolongados con una alta frecuencia de eventos y una baja carga adicional, lo cual es fundamental para los análisis en profundidad. Las herramientas basadas en eBPF leen los puntos de traza, realizan agregaciones en el núcleo y, de este modo, reducen Tráfico de datos al espacio de usuario.

Búfer circular y control de pérdidas

Detrás de cada evento activo hay un búfer circular por CPU. Dimensiono estos búferes de tal forma que se amortigüen los picos de carga sin que se descarten eventos. Son importantes los contadores de pérdidas y las alertas de las herramientas: En perf, presto atención a los contadores de eventos perdidos; en ftrace, compruebo las estadísticas de eventos descartados en tracefs. LTTng también indica cuándo la ruta del consumidor no cumple con los requisitos. Si se producen pérdidas, aumento los búferes, aplico un filtrado más estricto o realizo una agregación temprana. Para los escenarios de „Flight Recorder“, utilizo instantáneas que conservan un intervalo de tiempo en torno a un disparador. De este modo, mantengo una alta calidad de los datos y evito hipótesis erróneas basadas en trazas incompletas.

Elección de herramientas: ftrace, perf, LTTng, eBPF

Suelo empezar con «perf», porque allí analizo conjuntamente el muestreo, los valores de recuento y los puntos de seguimiento. Para inspeccionar eventos rápidamente, utilizo «ftrace» y activo de forma selectiva Eventos Libre. Para sesiones complejas y prolongadas con muchas CPU, me gusta utilizar LTTng, ya que registra de forma fiable tasas elevadas. Si quiero realizar una agregación previa en el núcleo, utilizo rastreadores basados en eBPF para exportar únicamente métricas agregadas. Quien quiera profundizar en perf encontrará consejos prácticos en el artículo sobre el herramienta perf, lo que resulta útil tanto para principiantes como para usuarios avanzados.

Reproducibilidad y automatización de sesiones

Anoto los parámetros de las sesiones exitosas como una «receta»: eventos activados, filtros, tamaños de búfer, frecuencias de muestreo y tiempo de ejecución. Además, documento la versión del kernel, las versiones de las herramientas, la topología de la CPU y la configuración de energía, para que las mediciones posteriores sean comparables. De este modo, si es necesario, puedo repetir una sesión tal cual, transferirla a otros hosts o automatizarla en procesos de integración continua (CI). En el caso de análisis más largos, guardo los datos brutos y genero resúmenes (histogramas, percentiles, mapas de calor) inmediatamente después de la medición. Trabajo de forma iterativa: ejecuciones breves y específicas, evaluación, precisión de la hipótesis… y nueva medición. De esta manera, no me pierdo en los datos, sino que obtengo conclusiones sólidas con un tiempo de itero mínimo.

Casos prácticos de aplicación

En el programador, observo los cambios de contexto, las activaciones y las interacciones con las colas para detectar cambios excesivos o prioridades inadecuadas. En la pila de bloques, correlaciono el envío y la finalización de las solicitudes con la profundidad y el tamaño de las colas, de modo que detecto Almacenamiento-Identifico cuellos de botella. En la ruta de red, realizo un seguimiento de la entrada y salida de paquetes, así como de las colas, para comprender las cadenas de latencia por flujo. En el caso de las llamadas al sistema, compruebo la frecuencia y la latencia para detectar anomalías en las rutas críticas. Si es necesario, lo combino con contadores de hardware para que las fallos de caché, las predicciones erróneas de ramificación y los eventos de E/S tengan un cadena de causas resultado.

Nombres concretos de eventos e interpretación de campos

Elijo los eventos de tal forma que pueda reconstruir la trayectoria completa con pocos puntos de medición. Un conjunto básico que ha dado buenos resultados:

  • Programador: sched:sched_switch (prev/next_comm, prev_state), sched:sched_wakeup y sched:sched_wakeup_new (fuente de activación, CPU de destino)
  • E/S por bloques: block:block_rq_issue, block:block_rq_complete (sectores, tamaño, dispositivo, latencia mediante delta)
  • Red: net:net_dev_queue, net:netif_receive_skb (colas y recepción), tcp:tcp_retransmit_skb (retransmisiones)
  • Llamadas al sistema: syscalls:sys_enter_*, syscalls:sys_exit_* (tiempo por llamada, códigos de error)

Compruebo previamente el significado de los campos para poder establecer correlaciones correctas: en «prev_state» identifico las tareas inactivas y, en los campos de la CPU, detecto los desplazamientos entre sockets. En el caso de los eventos de red, si están disponibles, incluyo metadatos de flujo (por ejemplo, puertos) para agrupar las latencias por conexión. De este modo, obtengo rutas que coinciden realmente con el comportamiento observado en el servicio.

Paso a paso: de la pregunta a la sesión de Traces

Siempre empiezo con una pregunta clara, como por ejemplo: „¿Por qué aumentan los tiempos de respuesta en los picos de carga?“. Este paso me obliga a encontrar la respuesta correcta Subsistema Seleccionar: programador, red, bloque, sistema de archivos o gestión de memoria. A continuación, enumero los puntos de rastreo adecuados con „perf list“ o en el sistema de archivos de rastreo y anoto los campos relevantes. Configuraré la sesión, aplicaré filtros a los campos de PID, CPU o eventos, y estableceré el búfer y la duración. A continuación, ejecutaré el escenario de carga y analizaré las distribuciones de latencia, las secuencias y las correlaciones antes de comprobar una hipótesis y volver a medir el cambio para determinar el Efecto para confirmar.

Filtrado y correlación: PID, TID, cgroups y flujos

Los filtros precisos me ahorran tiempo. Dependiendo del objetivo, utilizo filtros PID/TID, selección de CPU o filtros cgroup para respetar los límites de los contenedores o servicios. Cuando quiero comprender la latencia de red, correlaciono los eventos mediante atributos de flujo (por ejemplo, puerto de origen/destino), para separar el tráfico masivo de los flujos sensibles a la latencia. En el caso de los archivos, los asigno por dispositivo o dirección de bloque, o los agrupo por punto de montaje, dependiendo de la herramienta. En lo que respecta al programador, mido el tiempo desde la activación hasta el primer sched_switch en la CPU de destino; así puedo distinguir el tiempo de espera en las colas de ejecución del tiempo de CPU real.

Gestión de los gastos generales: buenas prácticas

Solo activo los puntos de seguimiento que realmente necesito para mantener bajos los volúmenes de datos y la carga adicional. Los filtros por PID, CPU o campos reducen el ruido y protegen Tampón. Ajusto el tamaño del búfer en función de la frecuencia de los eventos para no perder ninguno. Limito claramente la duración de las sesiones y solo las repito cuando quiero comprobar una hipótesis. En el caso de eventos extremadamente frecuentes, recurro al muestreo o a la agregación en el núcleo mediante eBPF, para que el análisis en el espacio de usuario esbelto restos.

Comparación: puntos de seguimiento frente a eventos de rendimiento

Ambos enfoques se complementan. Los puntos de seguimiento explican sucesos concretos en los subsistemas y proporcionan información significativa Campos. Los eventos de rendimiento me ofrecen una visión estadística de los ciclos, las faltas de caché o las ramificaciones. Al analizarlos en conjunto, puedo identificar cuánto tiempo se pierde y en qué paso se produce el cuello de botella. La siguiente tabla me ayuda a elegir las herramientas y se centra en lo que necesito para la próxima ronda de mediciones. Me sirve como Lista de favoritos para la planificación de la sesión.

Aspecto Puntos de seguimiento Eventos de rendimiento (perf)
Estabilidad Eventos estáticos en puntos clave del núcleo, en gran medida compatibles con las versiones Depende de los contadores de hardware y de la implementación del núcleo
Sobrecarga Bajo, impulsado por eventos Muy bajo en el muestreo
Enfoque Eventos concretos de los subsistemas Indicadores a nivel de sistema
Formato de datos Estructurado, legible por máquina Valores de medición, muestras, perfiles
Uso típico „El “qué„ y el “cuándo» de una ruta „Cuánto“ y „A qué precio“

Me gusta empezar con pruebas de rendimiento para localizar un cuello de botella general y, a continuación, profundizar en los detalles con puntos de seguimiento. Por el contrario, si quiero comprender una ruta, activo primero los puntos de seguimiento y luego añado contadores para Cuantización. Este orden ahorra tiempo y permite que la recopilación de datos se realice de forma específica. Es importante vigilar la tasa de eventos para que no se pierdan datos. Así es como me mantengo al día con Disciplina de medición por buen camino.

Límites, validación y comprobaciones cruzadas

No todas las rutas de control están instrumentadas de forma completa, y algunas rutas de error poco frecuentes no aparecen en los registros. Por eso, comparo las mediciones con otras perspectivas: contadores, registros, pruebas sintéticas, pero también simples mediciones de tiempo en el propio servicio. Si las trazas y los contadores no coinciden, compruebo primero los filtros y las pérdidas de datos, y después la base de reloj. Además, presto atención a las interferencias: las compilaciones de depuración, las altas tasas de registro o los hooks de seguridad pueden desplazar las latencias. Solo mediante comprobaciones cruzadas puedo confirmar con certeza que una causa detectada es, de hecho, la clave para la optimización.

Ejemplo: medir las latencias de almacenamiento

Activo puntos de seguimiento en la pila de bloques para el envío y la finalización de las solicitudes de E/S. Mientras se ejecuta una prueba de carga, registro las marcas de tiempo, el tamaño de la solicitud, el dispositivo y el PID para Latencias por cada proceso. A continuación, ordeno los datos por duración y genero histogramas que muestran picos y valores atípicos. En una segunda ronda, añado además los contadores de la CPU para comprobar si existe una relación entre la carga computacional y las latencias de E/S. Al final, ajusto el programador de E/S, la profundidad de la cola o el backend de almacenamiento y repito la medición hasta que la Objetivos se hayan alcanzado de forma fiable.

Ejemplo: comprender las latencias del programador y de activación

Cuando los subprocesos muestran un comportamiento „irregular“, mido el tiempo que transcurre desde «sched:sched_wakeup» hasta el primer «sched:sched_switch» en la CPU de destino. De este modo, separo el tiempo de espera en las colas de ejecución del tiempo de ejecución real. Agrupo los datos por CPU, prioridad y política (CFS/RT) para detectar anomalías, como cuando los hilos con un alto consumo de CPU acaban en núcleos saturados, a pesar de que hay núcleos libres. Si observo muchas activaciones entre CPU, compruebo las afinidades y la asignación NUMA. En combinación con los contadores de rendimiento para fallos de LLC, compruebo si una ubicación incorrecta está aumentando las latencias de la caché. Un pequeño ajuste en la afinidad de los hilos o en los parámetros de programación suele aportar mejoras medibles de forma inmediata.

Consejos para crear entornos productivos

Solo activo el rastreo fuera de los periodos de mantenimiento utilizando filtros claros y intervalos de tiempo breves. Antes, compruebo las tasas de eventos de forma exemplificativa en un sistema de prueba, para poder Tampón lo configuro adecuadamente. En entornos de producción, utilizo agregaciones integradas en el núcleo para reducir la carga en el espacio de usuario. Para diagnósticos rápidos y puntuales, merece la pena echar un vistazo a bpftrace en el alojamiento web, porque así obtengo las primeras respuestas en cuestión de minutos. Documento cada serie de mediciones de inmediato, para poder Repetibilidad verdadero.

Seguridad, derechos y límites del aislamiento

El rastreo en el núcleo requiere los permisos adecuados. Me aseguro de que tracefs esté montado correctamente y compruebo los parámetros a nivel del sistema, como perf_event_paranoid o kptr_restrict, que pueden ocultar detalles. En entornos sensibles, limito quién puede activar el rastreo y establezco procedimientos para su autorización. Anonimizo los nombres de los procesos o las direcciones IP cuando es necesario compartir datos, y defino normas claras de conservación de los registros de rastreo. En los contenedores se aplica lo siguiente: el usuario root del contenedor no está autorizado automáticamente a leer los eventos del núcleo del host. Por lo tanto, prefiero realizar el rastreo desde el host o trabajar con filtros cgroup explícitos para capturar únicamente la carga de trabajo de destino.

Lista de comprobación y errores habituales

Primero defino la consulta, luego los subsistemas y, por último, los eventos, en ese orden. Compruebo si realmente estoy registrando todos los campos necesarios antes de iniciar la carga. No te olvides de aplicar filtros; las sesiones sin filtrar generan rápidamente un aluvión de datos y sobrecargan el sistema. Memoria. Comparo la versión del kernel, los nombres de los eventos y las opciones de las herramientas para evitar malentendidos. Para flujos de trabajo de eBPF más complejos, amplío la configuración con los Herramientas BCC, para preprocesar métricas complejas en el núcleo y exportar únicamente señales agregadas, lo que Claridad crea.

Rastreo en contenedores y máquinas virtuales

En configuraciones de contenedores, lo ideal es filtrar por cgroup para ver exactamente el servicio que me interesa. Así realizo mediciones en entornos multitenant sin registrar cargas de trabajo ajenas. En máquinas virtuales (VM), solo veo lo que ocurre en el kernel invitado. Las rutas Virtio/vhost y el lado del hipervisor permanecen invisibles sin el seguimiento del host. Por eso, para las latencias de extremo a extremo, correlaciono las mediciones del invitado y del host cuando quiero tener en cuenta ambas áreas de influencia. Además, tengo en cuenta la sincronización temporal entre el host y el invitado, para poder superponer de forma significativa los registros, las métricas y los rastros. Con esta disciplina, los análisis siguen siendo fiables incluso en entornos virtualizados.

Para recordar: principales conclusiones

Los puntos de traza me proporcionan puntos de anclaje estables en el núcleo y ofrecen eventos estructurados sin mucho lastre. Los utilizo para obtener datos exactos Procesos para comprender, aislar los cuellos de botella y comprobar los cambios de forma cuantificable. Con ftrace, perf, LTTng y eBPF, elijo la herramienta adecuada en función del objetivo y las combino cuando es necesario. Una formulación clara de la pregunta, filtros estrictos y tamaños de búfer adecuados mantienen baja la carga y los datos útiles. Así encuentro las causas más rápido, demuestro la eficacia de mis medidas y mantengo la Actuación bajo control permanente.

Artículos de actualidad