SYSTEM y comandos de cuatro letras (4LW) en Keeper. Hay varias formas de inspeccionar los resultados:
- Recopilar muestras en
system.trace_logcon el tipoJemallocSamplepara analizar cada consulta. - Ver estadísticas de memoria en tiempo real y obtener perfiles de heap a través de la UI web de jemalloc integrada (26.2+).
- Consultar el perfil actual de heap directamente desde SQL mediante
system.jemalloc_profile_text(26.2+). - Analizar la fragmentación de memoria desde SQL mediante
system.jemalloc_sampled_allocations(26.9+). - Volcar perfiles de heap a disco y analizarlos con
jeprof.
Esta guía se aplica a las versiones 25.9+.
Para versiones anteriores, consulte el perfilado de asignaciones para versiones anteriores a la 25.9.
Muestreo de asignaciones
Para muestrear y perfilar las asignaciones, inicie ClickHouse/Keeper con la opción de configuraciónjemalloc_enable_global_profiler habilitada:
jemalloc realizará un muestreo de las asignaciones y almacenará la información internamente.
También puede habilitar el muestreo por consulta mediante la configuración jemalloc_enable_profiler.
Almacenar muestras de jemalloc en system.trace_log
Puede almacenar muestras de jemalloc en system.trace_log con el tipo JemallocSample.
Para habilitarlo globalmente, use la configuración jemalloc_collect_global_profile_samples_in_trace_log:
jemalloc_collect_profile_samples_in_trace_log.
Ejemplo: analizar el uso de memoria de una consulta
Primero, ejecute una consulta con el perfilador de jemalloc habilitado y recopile las muestras ensystem.trace_log:
Si ClickHouse se inició con
jemalloc_enable_global_profiler, no es necesario habilitar jemalloc_enable_profiler.
Lo mismo ocurre con jemalloc_collect_global_profile_samples_in_trace_log y jemalloc_collect_profile_samples_in_trace_log.system.trace_log:
UI web de jemalloc
Esta sección se aplica a las versiones 26.2 o posteriores.
/jemalloc.
Muestra métricas de memoria en tiempo real con gráficos, incluidas allocated, active, resident y mapped, así como estadísticas por arena y por bin.
También puedes obtener perfiles de heap globales y por consulta directamente desde la UI.
- ClickHouse
- Keeper
Obtención de perfiles de heap desde SQL
Esta sección se aplica a las versiones 26.2+.
system.jemalloc_profile_text permite obtener y ver el perfil de heap actual de jemalloc directamente desde SQL, sin necesidad de herramientas externas ni de volcarlo antes a disco.
La tabla tiene una sola columna:
Puede consultar la tabla directamente; no es necesario volcar antes un perfil de heap:
Formato de salida
El formato de salida se controla mediante la configuraciónjemalloc_profile_text_output_format, que admite tres valores:
raw— perfil de heap en bruto, tal como lo genera jemalloc.symbolized— formato compatible con jeprof con símbolos de función integrados. Como los símbolos ya están integrados,jeprofpuede analizar la salida sin necesidad del binario de ClickHouse.collapsed(predeterminado) — collapsed stacks compatibles con FlameGraph, una pila por línea con el recuento de bytes.
Ajustes adicionales
jemalloc_profile_text_symbolize_with_inline(Bool, valor predeterminado:true) — Indica si se deben incluir los frames inline al simbolizar. Desactivarlo acelera significativamente la simbolización, pero reduce la precisión, ya que las llamadas a funciones inline no aparecerán en los stacks. Solo afecta a los formatossymbolizedycollapsed.jemalloc_profile_text_collapsed_use_count(Bool, valor predeterminado:false) — Al usar el formatocollapsed, agrupa por número de asignaciones en lugar de por bytes.
Ejemplo: generar un flame graph desde SQL
Dado que el formato de salida predeterminado escollapsed, puedes redirigir la salida directamente a FlameGraph:
Análisis de la fragmentación desde SQL
Esta sección es aplicable a las versiones 26.9 y posteriores.
system.jemalloc_arena_binsmuestra cuánta memoria desperdicia cada size class en cada arena.wasteson los bytes retenidos en slabs pero no utilizados por asignaciones vivas.purposeidentifica las arenas dedicadas (mergetree,jit,cache); por diseño, estas contienen datos de larga duración, así que descártelas conpurpose = ''cuando busque fragmentación inesperada.system.jemalloc_binscontiene los mismos datos agregados sobre todas las arenas.system.jemalloc_sampled_allocationsenumera las asignaciones muestreadas que siguen vivas, una fila por sample: la traza inversa (trace), cuánto tiempo lleva viva (age_ns), el tamaño y la size class, y la arena. Leer la table provoca el flush de un nuevo perfil de heap.
- Solo los threads con el profiler activado generan samples (
jemalloc_enable_global_profileren la config o el SETTINGjemalloc_enable_profiler). - Cada fila representa aproximadamente
weightasignaciones reales, y las asignaciones pequeñas se muestrean con poca frecuencia. Ajustejemalloc_profiler_sampling_ratesi las size classes que le interesan no tienen samples. - Las asignaciones muestreadas no se almacenan en slabs, por lo que no contribuyen por sí mismas a
waste. Solo indican qué código asigna en esa size class. - Cada sample vivo cuesta dos páginas adicionales (128 KiB en builds con páginas de 64 KiB) hasta que la asignación se libera. Desactivar el profiler impide que se generen nuevos samples, pero no libera los existentes.
Example: generación de un flame graph de fragmentación
La misma consulta puede repartir el desperdicio de cada size class entre sus trazas inversas, en proporción a su número de asignaciones antiguas, e imprimir el resultado en el formato collapsed paraflamegraph.pl. Las size classes con desperdicio pero sin samples suficientemente antiguos se agrupan bajo un frame [unattributed], de modo que el total del flame graph equivale al desperdicio total. Lea system.jemalloc_sampled_allocations una sola vez por consulta: cada lectura hace flush de un nuevo profile, por lo que dos subqueries verían datos distintos.
Volcado de perfiles de heap a disco
Si necesitas guardar perfiles de heap como archivos para analizarlos sin conexión conjeprof, puedes volcarlos a disco.
De forma predeterminada, el archivo del 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.
Para volcar el perfil actual:
- ClickHouse
- Keeper
prof_prefix a la variable de entorno MALLOC_CONF.
Por ejemplo, si quieres generar perfiles en la carpeta /data, donde el prefijo del nombre de archivo será my_current_profile, puedes ejecutar ClickHouse/Keeper con la siguiente variable de entorno:
Análisis de archivos de perfiles de heap con jeprof
Después de volcar los perfiles de heap en disco, se pueden analizar con la herramienta de jemalloc llamada jeprof. Se puede instalar de varias maneras:
- 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
jeprof --help para ver la lista completa de opciones.
Perfiles de heap simbolizados
A partir de la versión 26.1+, ClickHouse genera automáticamente perfiles de heap simbolizados al ejecutarSYSTEM JEMALLOC FLUSH PROFILE.
El perfil simbolizado (con la extensión .symbolized) contiene símbolos de función integrados y puede analizarse con jeprof sin necesidad del binario de ClickHouse.
Por ejemplo, cuando ejecutas:
/tmp/jemalloc_clickhouse.12345.0.heap.symbolized).
Luego puedes analizarlo directamente con jeprof:
No se requiere el binario: Al usar perfiles simbolizados (archivos
.symbolized), no necesitas proporcionar a jeprof la ruta del binario de ClickHouse. Esto facilita mucho el análisis de perfiles en distintas máquinas o después de actualizar el binario.Para perfiles no simbolizados, Como alternativa,
jeprof usa addr2line para generar stacktraces, lo que puede ser bastante lento.
Si es así, se recomienda instalar una implementación alternativa de la herramienta.llvm-addr2line funciona igual de bien (pero tenga en cuenta que llvm-objdump no es compatible con jeprof).Y después úselo así: jeprof --tools addr2line:/usr/bin/llvm-addr2line,nm:/usr/bin/llvm-nm,objdump:/usr/bin/objdump,c++filt:/usr/bin/llvm-cxxfilt--base:
Ejemplos
Con perfiles simbolizados (recomendado):- Genere un archivo de texto con cada procedimiento en una línea:
- Genera un archivo PDF con el grafo de llamadas:
- Genere un archivo de texto con un procedimiento por línea:
- Genera un archivo PDF con un grafo de llamadas:
Generar un flame graph
jeprof permite generar collapsed stacks para crear flame graphs.
Debe usar el argumento --collapsed:
flamegraph.pl:
Opciones adicionales para el perfilador
jemalloc ofrece muchas opciones relacionadas con el perfilador. Se pueden controlar modificando la variable de entorno MALLOC_CONF.
Por ejemplo, el intervalo entre 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 conjemalloc de muchas formas distintas.
Tabla del sistema asynchronous_metrics
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), agregadas de todas las arenas.
Referencia
Tabla del sistema jemalloc_stats (26.2+)
Devuelve la salida completa de malloc_stats_print() en una sola cadena. Equivale al comando SYSTEM JEMALLOC STATS.
Prometheus
Todas las métricas relacionadas conjemalloc de asynchronous_metrics también están expuestas a través del endpoint de Prometheus tanto en ClickHouse como en Keeper.
Referencia
Comando 4LW jmst de Keeper
Keeper admite el comando 4LW jmst, que devuelve estadísticas básicas del asignador de memoria: