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.
SYSTEM INSTRUMENT ADD 'sleepForNanoseconds' PROFILELuego, lo dejamos en ejecución durante el tiempo que queramos perfilar y lo detenemos.
SYSTEM INSTRUMENT REMOVE ALLConvertimos 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:
#include <chrono>
#include <cstdio>
#include <thread>
void one()
{
std::this_thread::sleep_for(std::chrono::milliseconds(10));
}
void two()
{
std::this_thread::sleep_for(std::chrono::milliseconds(5));
}
int main()
{
printf("Start\n");
for (int i = 0; i < 10; ++i)
{
one();
two();
}
printf("Finish\n");
}Para instrumentar con XRay, debemos añadir algunas opciones como estas:
clang++ -o test test.cpp -fxray-instrument -fxray-instruction-threshold=1-fxray-instrumentes necesario para instrumentar el código.-fxray-instruction-threshold=1se 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:
objdump -h -j xray_instr_map test
test: file format elf64-x86-64
Sections:
Idx Name Size VMA LMA File off Algn
17 xray_instr_map 000005c0 000000000002f91c 000000000002f91c 0002f91c 2**0
CONTENTS, ALLOC, LOAD, READONLY, DATAEjecutar 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.
XRAY_OPTIONS="patch_premain=true xray_mode=xray-basic verbosity=1" ./test
==74394==XRay: Log file in 'xray-log.test.14imlN'
Start
Finish
==74394==Cleaned up log for TID: 74394Convertir 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:
llvm-xray convert --symbolize --instr_map=./test --output-format=trace_event xray-log.test.14imlN | gzip > test-trace.txt.gzVisualiza 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 temporal

Cargado a la izquierda

Sándwich

Consulta la documentación
- SYSTEM INSTRUMENT — Añade o elimina puntos de instrumentación.
- system.instrumentation — Inspecciona los puntos instrumentados.
- system.symbols — Inspecciona los símbolos para añadir puntos de instrumentación.
- system.trace_log — Inspecciona los datos recopilados mediante puntos de instrumentación.
- XRay Instrumentation
- Documentación de Debugging with XRay para obtener más información.