ClickHouse usa jemalloc como asignador global de memoria. Jemalloc incluye algunas herramientas para el muestreo y el perfilado de asignaciones.
Para facilitar el perfilado de asignaciones, se proporcionan comandos SYSTEM junto con comandos de cuatro letras (4LW) en Keeper.
Muestreo de asignaciones y vaciado de perfiles de heap
Si quieres realizar muestreo y perfilado de asignaciones en jemalloc, debes iniciar ClickHouse/Keeper con el perfilado habilitado mediante la variable de entorno MALLOC_CONF:
MALLOC_CONF=background_thread:true,prof:true,prof_active:truejemalloc muestreará las asignaciones y almacenará la información internamente.
Puede indicarle a jemalloc que vuelque el perfil actual ejecutando:
SYSTEM JEMALLOC FLUSH PROFILEecho jmfp | nc localhost 9181De forma predeterminada, el archivo de perfil de heap se generará en /tmp/jemalloc_clickhouse._pid_._seqnum_.heap, donde _pid_ es el PID de ClickHouse y _seqnum_ es el número de secuencia global del perfil de heap actual.
Para Keeper, el archivo predeterminado es /tmp/jemalloc_keeper._pid_._seqnum_.heap y sigue las mismas reglas.
Se puede definir una ubicación distinta añadiendo la opción prof_prefix a la variable de entorno MALLOC_CONF.
Por ejemplo, si desea generar perfiles en la carpeta /data, donde el prefijo del nombre de archivo será my_current_profile, puede ejecutar ClickHouse/Keeper con la siguiente variable de entorno:
MALLOC_CONF=background_thread:true,prof:true,prof_prefix:/data/my_current_profileAl archivo generado se le añadirán el prefijo, el PID y el número de secuencia.
Análisis de perfiles de heap
Una vez generados los perfiles de heap, es necesario analizarlos.
Para ello, puede utilizarse la herramienta de jemalloc llamada jeprof. Puede instalarse de varias formas:
- Usando el gestor de paquetes del sistema
- Clonando el repositorio de jemalloc y ejecutando
autogen.shdesde la carpeta raíz. Esto le proporcionará el scriptjeprofdentro de la carpetabin
Con jeprof, pueden generarse muchos formatos distintos a partir del perfil de heap.
Se recomienda ejecutar jeprof --help para obtener información sobre su uso y las distintas opciones que ofrece la herramienta.
En general, el comando jeprof se usa así:
jeprof path/to/binary path/to/heap/profile --output_format [ > output_file]Si quieres comparar qué asignaciones se produjeron entre dos perfiles, puedes definir el argumento base:
jeprof path/to/binary --base path/to/first/heap/profile path/to/second/heap/profile --output_format [ > output_file]Ejemplos
- si quieres generar un archivo de texto con cada procedimiento en una línea:
jeprof path/to/binary path/to/heap/profile --text > result.txt- si quieres generar un archivo PDF con un grafo de llamadas:
jeprof path/to/binary path/to/heap/profile --pdf > result.pdfGeneración de un flame graph
jeprof permite generar stacks colapsados para crear flame graphs.
Debe usar el argumento --collapsed:
jeprof path/to/binary path/to/heap/profile --collapsed > result.collapsedDespués de eso, puedes usar muchas herramientas distintas para visualizar stacks colapsados.
La más popular es FlameGraph, que incluye un script llamado flamegraph.pl:
cat result.collapsed | /path/to/FlameGraph/flamegraph.pl --color=mem --title="Allocation Flame Graph" --width 2400 > result.svgOtra herramienta interesante es speedscope, que permite analizar los stacks recopilados de forma más interactiva.
Controlar el perfilador de asignaciones en tiempo de ejecución
Si ClickHouse/Keeper se inicia con el perfilador habilitado, se admiten comandos adicionales para desactivar o activar el perfilado de asignaciones en tiempo de ejecución. Con estos comandos, resulta más fácil perfilar solo intervalos específicos.
Para desactivar el perfilador:
SYSTEM JEMALLOC DISABLE PROFILEecho jmdp | nc localhost 9181Para activar el perfilador:
SYSTEM JEMALLOC ENABLE PROFILEecho jmep | nc localhost 9181También es posible controlar el estado inicial del perfilador configurando la opción prof_active, que está activada de forma predeterminada.
Por ejemplo, si no desea muestrear asignaciones durante el inicio, sino solo después, puede activar el perfilador. Puede iniciar ClickHouse/Keeper con la siguiente variable de entorno:
MALLOC_CONF=background_thread:true,prof:true,prof_active:falseEl perfilador se puede habilitar más adelante.
Opciones adicionales para el perfilador
jemalloc dispone de muchas opciones relacionadas con el perfilador. Se pueden controlar modificando la variable de entorno MALLOC_CONF.
Por ejemplo, el intervalo entre las muestras de asignación puede controlarse con lg_prof_sample.
Si desea volcar el perfil de heap cada N bytes, puede habilitarlo con lg_prof_interval.
Se recomienda consultar la página de referencia de jemalloc para ver la lista completa de opciones.
Otros recursos
ClickHouse/Keeper exponen métricas relacionadas con jemalloc de muchas maneras distintas.
Tabla del sistema asynchronous_metrics
SELECT *
FROM system.asynchronous_metrics
WHERE metric LIKE '%jemalloc%'
FORMAT VerticalTabla del sistema jemalloc_bins
Contiene información sobre las asignaciones de memoria realizadas mediante el asignador jemalloc en distintas clases de tamaño (bins), agregada a partir de todas las arenas.
Prometheus
Todas las métricas relacionadas con jemalloc de asynchronous_metrics también se exponen a través del endpoint de Prometheus tanto en ClickHouse como en Keeper.
Comando 4LW jmst en Keeper
Keeper admite el comando 4LW jmst, que devuelve estadísticas básicas del asignador:
echo jmst | nc localhost 9181