SYSTEM e comandos de quatro letras (4LW) no Keeper. Há várias maneiras de inspecionar os resultados:
- Coletar amostras em
system.trace_logsob o tipoJemallocSamplepara análise por consulta. - Visualizar estatísticas de memória em tempo real e obter perfis de heap por meio da interface web integrada do jemalloc (26.2+).
- Consultar o perfil de heap atual diretamente via SQL usando
system.jemalloc_profile_text(26.2+). - Analisar a fragmentação de memória via SQL usando
system.jemalloc_sampled_allocations(26.9+). - Gravar perfis de heap em disco e analisá-los com
jeprof.
Este guia se aplica às versões 25.9+.
Para versões anteriores, consulte o perfil de alocação para versões anteriores à 25.9.
Amostragem de alocações
Para fazer a amostragem e traçar o perfil das alocações, inicie o ClickHouse/Keeper com a configuraçãojemalloc_enable_global_profiler habilitada:
jemalloc fará a amostragem das alocações e armazenará as informações internamente.
Você também pode ativar a amostragem por consulta usando a configuração jemalloc_enable_profiler.
Armazenando amostras do jemalloc em system.trace_log
Você pode armazenar amostras do jemalloc em system.trace_log como o tipo JemallocSample.
Para habilitar isso globalmente, use a configuração jemalloc_collect_global_profile_samples_in_trace_log:
jemalloc_collect_profile_samples_in_trace_log.
Exemplo: analisando o uso de memória de uma consulta
Primeiro, execute uma consulta com o profiler do jemalloc habilitado e colete as amostras emsystem.trace_log:
Se o ClickHouse foi iniciado com
jemalloc_enable_global_profiler, você não precisa habilitar jemalloc_enable_profiler.
O mesmo vale para jemalloc_collect_global_profile_samples_in_trace_log e jemalloc_collect_profile_samples_in_trace_log.system.trace_log:
Interface web do jemalloc
Esta seção se aplica às versões 26.2+.
/jemalloc.
Ela exibe métricas de memória em tempo real com gráficos, incluindo memória alocada, ativa, residente e mapeada, além de estatísticas por arena e por bin.
Você também pode buscar perfis de heap globais e por consulta diretamente pela interface web.
- ClickHouse
- Keeper
Obtendo perfis de heap por SQL
Esta seção se aplica às versões 26.2+.
system.jemalloc_profile_text permite obter e visualizar o perfil de heap atual do jemalloc diretamente por SQL, sem precisar de ferramentas externas nem de gravá-lo em disco antes.
A tabela tem uma única coluna:
Você pode consultar a tabela diretamente — não é necessário gravar um perfil de heap antes:
Formato de saída
O formato de saída é controlado pela configuraçãojemalloc_profile_text_output_format, que oferece suporte a três valores:
raw— perfil de heap bruto, gerado pelo jemalloc.symbolized— formato compatível com o jeprof, com símbolos de função incorporados. Como os símbolos já estão incorporados, ojeprofpode analisar a saída sem precisar do binário do ClickHouse.collapsed(padrão) — pilhas colapsadas compatíveis com FlameGraph, uma pilha por linha com a contagem de bytes.
Configurações adicionais
jemalloc_profile_text_symbolize_with_inline(Bool, padrão:true) — Define se frames inline devem ser incluídos na simbolização. Desabilitar isso acelera significativamente a simbolização, mas reduz a precisão, pois chamadas de função inline não aparecerão nas stacks. Afeta apenas os formatossymbolizedecollapsed.jemalloc_profile_text_collapsed_use_count(Bool, padrão:false) — Ao usar o formatocollapsed, agrega por contagem de alocações em vez de bytes.
Exemplo: gerando um flame graph com SQL
Como o formato de saída padrão écollapsed, você pode passar a saída diretamente para o FlameGraph:
Analisando a fragmentação a partir do SQL
Esta seção se aplica às versões 26.9+.
system.jemalloc_arena_binsmostra quanta memória cada size class desperdiça em cada arena.wastesão os bytes retidos em slabs, mas não utilizados por alocações vivas.purposeidentifica arenas dedicadas (mergetree,jit,cache); elas guardam dados de vida longa por design, então filtre-as compurpose = ''ao investigar fragmentação inesperada.system.jemalloc_binstraz os mesmos dados somados entre as arenas.system.jemalloc_sampled_allocationslista as alocações amostradas que estão vivas no momento, uma linha por sample: o backtrace (trace), há quanto tempo está viva (age_ns), o tamanho e a size class, e a arena. Ler a tabela provoca o flush de um novo perfil de heap.
- Apenas threads com o profiler enabled produzem samples (
jemalloc_enable_global_profilerna config ou a configuraçãojemalloc_enable_profiler). - Cada linha representa cerca de
weightalocações reais, e alocações pequenas são amostradas raramente. Ajustejemalloc_profiler_sampling_ratese as size classes que lhe interessam não tiverem samples. - Alocações amostradas não são armazenadas em slabs, portanto não contribuem para
wastepor si mesmas. Elas apenas indicam qual código aloca naquela size class. - Cada sample vivo custa duas páginas extras (128 KiB em builds com pages de 64 KiB) até que a alocação seja liberada. Desabilitar o profiler impede novos samples, mas não libera os existentes.
Exemplo: gerando um flame graph de fragmentação
A mesma consulta pode distribuir o desperdício de cada size class entre seus backtraces, proporcionalmente ao número de alocações antigas, e imprimir o resultado no formatocollapsed para o flamegraph.pl. As size classes que apresentam desperdício, mas não têm samples suficientemente antigos, ficam sob um frame [unattributed], de modo que o total do flame graph corresponde ao desperdício total. Leia system.jemalloc_sampled_allocations apenas uma vez por consulta: cada leitura faz o flush de um novo profile, portanto duas subqueries veriam dados diferentes.
Gravando perfis de heap no disco
Se você precisar salvar perfis de heap como arquivos para análise offline comjeprof, poderá gravá-los no disco.
Por padrão, o arquivo de perfil de heap será gerado em /tmp/jemalloc_clickhouse._pid_._seqnum_.heap, em que _pid_ é o PID do ClickHouse e _seqnum_ é o número de sequência global do perfil de heap atual.
No Keeper, o arquivo padrão é /tmp/jemalloc_keeper._pid_._seqnum_.heap e segue as mesmas regras.
Para gravar o perfil atual:
- ClickHouse
- Keeper
prof_prefix à variável de ambiente MALLOC_CONF.
Por exemplo, se você quiser gerar perfis na pasta /data, em que o prefixo do nome do arquivo será my_current_profile, poderá executar o ClickHouse/Keeper com a seguinte variável de ambiente:
Analisando arquivos de perfil de heap com jeprof
Após gravar os perfis de heap em disco, eles podem ser analisados usando a ferramenta do jemalloc chamada jeprof. Ela pode ser instalada de várias formas:
- Usando o gerenciador de pacotes do sistema
- Clonando o repositório do jemalloc e executando
autogen.sha partir da pasta raiz. Isso disponibilizará o scriptjeprofna pastabin
jeprof --help para ver a lista completa de opções.
Perfis de heap simbolizados
A partir da versão 26.1+, o ClickHouse gera automaticamente perfis de heap simbolizados quando você executaSYSTEM JEMALLOC FLUSH PROFILE.
O perfil simbolizado (com a extensão .symbolized) contém símbolos de função incorporados e pode ser analisado com o jeprof sem exigir o binário do ClickHouse.
Por exemplo, quando você executa:
/tmp/jemalloc_clickhouse.12345.0.heap.symbolized).
Em seguida, você poderá analisá-lo diretamente com jeprof:
Nenhum binário necessário: Ao usar perfis simbolizados (arquivos
.symbolized), você não precisa fornecer o caminho do binário do ClickHouse ao jeprof. Isso facilita muito a análise de perfis em máquinas diferentes ou depois que o binário tiver sido atualizado.Para perfis não simbolizados, Como alternativa,
jeprof usa addr2line para gerar stacktraces, o que pode ser bem lento.
Se esse for o caso, recomenda-se instalar uma implementação alternativa da ferramenta.llvm-addr2line funciona igualmente bem (mas observe que llvm-objdump não é compatível com jeprof)Depois, use-o assim: jeprof --tools addr2line:/usr/bin/llvm-addr2line,nm:/usr/bin/llvm-nm,objdump:/usr/bin/objdump,c++filt:/usr/bin/llvm-cxxfilt--base:
Exemplos
Usando perfis simbolizados (recomendado):- Gere um arquivo de texto com cada procedimento em uma linha:
- Gere um arquivo PDF com o grafo de chamadas:
- Gere um arquivo de texto com cada procedimento em uma linha:
- Gere um arquivo PDF com um grafo de chamadas:
Gerando um flame graph
jeprof permite gerar pilhas colapsadas para criar flame graphs.
Você precisa usar o argumento --collapsed:
flamegraph.pl:
Opções adicionais para o profiler
Ojemalloc oferece muitas opções relacionadas ao profiler. Elas podem ser controladas modificando a variável de ambiente MALLOC_CONF.
Por exemplo, o intervalo entre as amostras de alocação pode ser controlado com lg_prof_sample.
Se você quiser gerar o heap profile a cada N bytes, pode ativá-lo usando lg_prof_interval.
Recomenda-se consultar a página de referência do jemalloc para obter uma lista completa das opções.
Outros recursos
ClickHouse/Keeper expõem métricas relacionadas aojemalloc de várias formas.
Tabela de sistema asynchronous_metrics
Tabela de sistema jemalloc_bins
Contém informações sobre alocações de memória feitas pelo alocador jemalloc em diferentes classes de tamanho (bins), agregadas a partir de todas as arenas.
Referência
Tabela do sistema jemalloc_stats (26.2+)
Retorna toda a saída de malloc_stats_print() como uma única string. Equivalente ao comando SYSTEM JEMALLOC STATS.
Prometheus
Todas as métricas relacionadas aojemalloc de asynchronous_metrics também são expostas por meio do endpoint do Prometheus, tanto no ClickHouse quanto no Keeper.
Referência
Comando 4LW jmst no Keeper
O Keeper é compatível com o comando 4LW jmst, que retorna estatísticas básicas do alocador: