O ClickHouse usa o jemalloc como alocador global. O jemalloc inclui algumas ferramentas para amostragem e profiling de alocação.
Para tornar o profiling de alocação mais prático, são fornecidos comandos SYSTEM junto com comandos de quatro letras (4LW) no Keeper.
Amostragem de alocações e gravação de perfis de heap
Se você quiser fazer amostragem e profiling de alocações no jemalloc, precisará iniciar o ClickHouse/Keeper com o profiling ativado usando a variável de ambiente MALLOC_CONF:
MALLOC_CONF=background_thread:true,prof:true,prof_active:truejemalloc amostrará as alocações e armazenará as informações internamente.
Você pode instruir o jemalloc a gravar o perfil atual executando:
SYSTEM JEMALLOC FLUSH PROFILEecho jmfp | nc localhost 9181Por 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.
Para o Keeper, o arquivo padrão é /tmp/jemalloc_keeper._pid_._seqnum_.heap e segue as mesmas regras.
Um local diferente pode ser definido adicionando a opção 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:
MALLOC_CONF=background_thread:true,prof:true,prof_prefix:/data/my_current_profileO arquivo gerado será acrescido do prefixo PID e do número de sequência.
Analisando perfis de heap
Depois que os perfis de heap forem gerados, eles precisam ser analisados.
Para isso, pode-se usar a ferramenta do jemalloc chamada jeprof. Ela pode ser instalada de várias maneiras:
- Usando o gerenciador de pacotes do sistema
- Clonando o repositório do jemalloc e executando
autogen.sha partir da pasta raiz. Isso disponibilizará o scriptjeprofdentro da pastabin
Há vários formatos diferentes que podem ser gerados a partir do perfil de heap usando jeprof.
Recomenda-se executar jeprof --help para obter informações sobre o uso e as várias opções oferecidas pela ferramenta.
Em geral, o comando jeprof é usado da seguinte forma:
jeprof path/to/binary path/to/heap/profile --output_format [ > output_file]Se quiser comparar quais alocações ocorreram entre dois perfis, pode definir o argumento base:
jeprof path/to/binary --base path/to/first/heap/profile path/to/second/heap/profile --output_format [ > output_file]Exemplos
- se você quiser gerar um arquivo de texto com cada procedimento escrito em uma linha:
jeprof path/to/binary path/to/heap/profile --text > result.txt- se você quiser gerar um arquivo PDF com um gráfico de chamadas:
jeprof path/to/binary path/to/heap/profile --pdf > result.pdfGerando um flame graph
jeprof permite gerar stacks colapsadas para criar flame graphs.
Você precisa usar o argumento --collapsed:
jeprof path/to/binary path/to/heap/profile --collapsed > result.collapsedDepois disso, você pode usar várias ferramentas para visualizar pilhas colapsadas.
A mais popular é FlameGraph, que contém um script chamado flamegraph.pl:
cat result.collapsed | /path/to/FlameGraph/flamegraph.pl --color=mem --title="Allocation Flame Graph" --width 2400 > result.svgOutra ferramenta interessante é o speedscope, que permite analisar os stacks coletados de forma mais interativa.
Controlando o profiler de alocação em tempo de execução
Se o ClickHouse/Keeper for iniciado com o profiler habilitado, haverá suporte a comandos adicionais para desabilitar/habilitar o profiling de alocação em tempo de execução. Usando esses comandos, fica mais fácil fazer profiling apenas em intervalos específicos.
Para desabilitar o profiler:
SYSTEM JEMALLOC DISABLE PROFILEecho jmdp | nc localhost 9181Para habilitar o profiler:
SYSTEM JEMALLOC ENABLE PROFILEecho jmep | nc localhost 9181Também é possível controlar o estado inicial do profiler definindo a opção prof_active, que vem habilitada por padrão.
Por exemplo, se você não quiser coletar amostras de alocação durante a inicialização, mas apenas depois, poderá habilitar o profiler. Você pode iniciar o ClickHouse/Keeper com a seguinte variável de ambiente:
MALLOC_CONF=background_thread:true,prof:true,prof_active:falseO profiler pode ser ativado mais tarde.
Opções adicionais para o profiler
O jemalloc oferece várias 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 quiser gerar o perfil de heap a cada N bytes, você pode habilitá-lo com lg_prof_interval.
Recomenda-se consultar a página de referência do jemalloc para obter a lista completa de opções.
Outros recursos
ClickHouse/Keeper expõem métricas relacionadas ao jemalloc de várias formas.
Tabela do sistema asynchronous_metrics
SELECT *
FROM system.asynchronous_metrics
WHERE metric LIKE '%jemalloc%'
FORMAT VerticalTabela do sistema jemalloc_bins
Contém informações sobre alocações de memória feitas pelo alocador jemalloc em diferentes classes de tamanho (bins), agregadas de todas as arenas.
Prometheus
Todas as métricas relacionadas ao jemalloc de asynchronous_metrics também são expostas por meio do endpoint Prometheus, tanto no ClickHouse quanto no Keeper.
Comando 4LW jmst no Keeper
O Keeper é compatível com o comando 4LW jmst, que retorna estatísticas básicas do alocador:
echo jmst | nc localhost 9181