Saltar al contenido principal

Tipos de profilers

LLVM ya incluye una herramienta que instrumenta el código y nos permite realizar perfilado por instrumentación. A diferencia del muestreo o perfilado estadístico, es muy preciso y no pierde ninguna llamada, a costa de tener que instrumentar el código y de consumir más recursos. En pocas palabras, un profiler por instrumentación introduce código nuevo para rastrear las llamadas a todas las funciones. Los profilers estadísticos nos permiten ejecutar el código sin necesidad de hacer cambios, tomando instantáneas periódicamente para ver el estado de la aplicación. Por lo tanto, solo se tienen en cuenta las funciones que se están ejecutando cuando se toma la instantánea. perf es un profiler estadístico muy conocido.

Perfilado de ClickHouse con la integración de XRay

En ClickHouse 25.12, XRay viene integrado para añadir de forma transparente nuevos puntos de instrumentación a las funciones. Así, cualquier versión oficial ya incluye esta funcionalidad, que puede activarse bajo demanda sin afectar al rendimiento general cuando no está habilitada. La idea es habilitar el menor número posible de puntos de instrumentación para obtener información valiosa. Podemos añadir un nuevo punto de instrumentación de perfil mediante la sentencia SYSTEM INSTRUMENT ADD PROFILE. Las funciones que se van a instrumentar pueden obtenerse de la tabla del sistema system.symbols. Supongamos que queremos perfilar la función sleepForNanoseconds, que es una función práctica para comprobar cuánto tarda en ejecutarse.
Luego, lo dejamos en ejecución durante el tiempo que queramos perfilar y lo detenemos.
Convertimos los datos recopilados en system.trace_log al formato de Chrome para visualizarlos en Perfetto. Observe el query_id, cpu_id y la traza de pila de cada registro.

Perfilado de una aplicación nativa con XRay

La siguiente sección se incluye como referencia para comprender cómo funciona XRay internamente y cómo puede utilizarse sin configuración adicional para perfilar una aplicación nativa.

Instrumentar el código

Supongamos el siguiente código fuente:
Para instrumentar con XRay, debemos añadir algunas opciones como estas:
  • -fxray-instrument es necesario para instrumentar el código.
  • -fxray-instruction-threshold=1 se usa para instrumentar todas las funciones, aunque sean muy pequeñas, como en nuestro ejemplo. De forma predeterminada, instrumenta las funciones con al menos 200 instrucciones.
Podemos comprobar que el código se ha instrumentado correctamente verificando que hay una nueva sección en el binario:

Ejecutar el proceso con los valores adecuados de las variables de entorno para recopilar la traza

De forma predeterminada, no se recopilan datos del profiler a menos que se solicite explícitamente. En otras palabras, salvo que estemos haciendo perfilado, la sobrecarga es insignificante. Podemos establecer distintos valores para XRAY_OPTIONS para configurar cuándo el profiler empieza a recopilar datos y cómo lo hace.

Convertir la traza

Las trazas de XRay se pueden convertir a varios formatos. El formato trace_event es muy útil porque es fácil de analizar y ya existen varias herramientas compatibles con él, así que usaremos ese:

Visualiza la traza

Podemos usar interfaces web como speedscope.app o Perfetto. Aunque Perfetto facilita la visualización de varios hilos y la realización de consultas sobre los datos, speedscope es mejor para generar un flamegraph y una vista tipo sándwich de tus datos.

Orden cronológico

Cargado a la izquierda

Sándwich

Consulta la documentación

Última modificación el 12 de junio de 2026