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:
jemalloc muestreará las asignaciones y almacenará la información internamente.
Puede indicarle a jemalloc que vuelque el perfil actual ejecutando:
De 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:
Al 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.sh desde la carpeta raíz. Esto le proporcionará el script jeprof dentro de la carpeta bin
jeprof usa addr2line para generar trazas de pila, lo que puede resultar muy lento.
Si es así, se recomienda instalar una implementación alternativa de la herramienta.
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í:
Si quieres comparar qué asignaciones se produjeron entre dos perfiles, puedes definir el argumento base:
- si quieres generar un archivo de texto con cada procedimiento en una línea:
- si quieres generar un archivo PDF con un grafo de llamadas:
Generación de un flame graph
jeprof permite generar stacks colapsados para crear flame graphs.
Debe usar el argumento --collapsed:
Despué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:
Otra 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:
Para activar el perfilador:
Tambié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:
El 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.
ClickHouse/Keeper exponen métricas relacionadas con jemalloc de muchas maneras distintas.
AdvertenciaEs importante tener en cuenta que ninguna de estas métricas está sincronizada con las demás y que sus valores pueden desviarse.
Tabla del sistema asynchronous_metrics
Referencia
Tabla 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.
Referencia
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.
Referencia
Comando 4LW jmst en Keeper
Keeper admite el comando 4LW jmst, que devuelve estadísticas básicas del asignador: