ClickHouse uses jemalloc as its global allocator. Jemalloc comes with tools for allocation sampling and profiling. ClickHouse and Keeper allow you to control sampling using configs, query settings,Documentation Index
Fetch the complete documentation index at: https://private-7c7dfe99-page-updates.mintlify.app/llms.txt
Use this file to discover all available pages before exploring further.
SYSTEM commands and four letter word (4LW) commands in Keeper. There are several ways to inspect the results:
- Collect samples into
system.trace_logunder theJemallocSampletype for per-query analysis. - View live memory statistics and fetch heap profiles through the built-in jemalloc web UI (26.2+).
- Query the current heap profile directly from SQL using
system.jemalloc_profile_text(26.2+). - Flush heap profiles to disk and analyze them with
jeprof.
This guide is applicable for versions 25.9+.
For older versions, please check allocation profiling for versions before 25.9.
Sampling allocations
To sample and profile allocations, start ClickHouse/Keeper with thejemalloc_enable_global_profiler config enabled:
jemalloc will sample allocations and store the information internally.
You can also enable sampling per query using the jemalloc_enable_profiler setting.
Storing jemalloc samples in system.trace_log
You can store jemalloc samples in system.trace_log under the JemallocSample type.
To enable it globally, use the jemalloc_collect_global_profile_samples_in_trace_log config:
jemalloc_collect_profile_samples_in_trace_log setting.
Example: analyzing memory usage of a query
First, run a query with the jemalloc profiler enabled and collect the samples intosystem.trace_log:
If ClickHouse was started with
jemalloc_enable_global_profiler, you don’t have to enable jemalloc_enable_profiler.
Same is true for jemalloc_collect_global_profile_samples_in_trace_log and jemalloc_collect_profile_samples_in_trace_log.system.trace_log:
Jemalloc web UI
This section is applicable for versions 26.2+.
/jemalloc HTTP endpoint.
It displays live memory metrics with charts, including allocated, active, resident, and mapped memory, as well as per-arena and per-bin statistics.
You can also fetch global and per-query heap profiles directly from the UI.
- ClickHouse
- Keeper
Fetching heap profiles from SQL
This section is applicable for versions 26.2+.
system.jemalloc_profile_text system table lets you fetch and view the current jemalloc heap profile directly from SQL, without needing external tools or flushing to disk first.
The table has a single column:
| Column | Type | Description |
|---|---|---|
line | String | Line from the symbolized jemalloc heap profile. |
Output format
The output format is controlled by thejemalloc_profile_text_output_format setting, which supports three values:
raw— raw heap profile as produced by jemalloc.symbolized— jeprof-compatible format with embedded function symbols. Since symbols are already embedded,jeprofcan analyze the output without requiring the ClickHouse binary.collapsed(default) — FlameGraph-compatible collapsed stacks, one stack per line with the byte count.
Additional settings
jemalloc_profile_text_symbolize_with_inline(Bool, default:true) — Whether to include inline frames when symbolizing. Disabling this speeds up symbolization significantly but loses precision as inlined function calls will not appear in the stacks. Only affectssymbolizedandcollapsedformats.jemalloc_profile_text_collapsed_use_count(Bool, default:false) — When using thecollapsedformat, aggregate by allocation count instead of bytes.
Example: generating a flame graph from SQL
Since the default output format iscollapsed, you can pipe the output directly to FlameGraph:
Flushing heap profiles to disk
If you need to save heap profiles as files for offline analysis withjeprof, you can flush them to disk.
By default, the heap profile file will be generated in /tmp/jemalloc_clickhouse._pid_._seqnum_.heap where _pid_ is the PID of ClickHouse and _seqnum_ is the global sequence number for the current heap profile.
For Keeper, the default file is /tmp/jemalloc_keeper._pid_._seqnum_.heap, and follows the same rules.
To flush the current profile:
- ClickHouse
- Keeper
MALLOC_CONF environment variable with the prof_prefix option.
For example, if you want to generate profiles in the /data folder where the filename prefix will be my_current_profile, you can run ClickHouse/Keeper with the following environment variable:
Analyzing heap profile files with jeprof
After flushing heap profiles to disk, they can be analyzed using jemalloc’s tool called jeprof. It can be installed in multiple ways:
- Using the system’s package manager
- Cloning the jemalloc repo and running
autogen.shfrom the root folder. This will provide you with thejeprofscript inside thebinfolder
jeprof --help for the full list of options.
Symbolized heap profiles
Starting from version 26.1+, ClickHouse automatically generates symbolized heap profiles when you flush usingSYSTEM JEMALLOC FLUSH PROFILE.
The symbolized profile (with .symbolized extension) contains embedded function symbols and can be analyzed by jeprof without requiring the ClickHouse binary.
For example, when you run:
/tmp/jemalloc_clickhouse.12345.0.heap.symbolized).
You can then analyze it directly with jeprof:
No binary required: When using symbolized profiles (
.symbolized files), you don’t need to provide the ClickHouse binary path to jeprof. This makes it much easier to analyze profiles on different machines or after the binary has been updated.For non-symbolized profiles, Alternatively,
jeprof uses addr2line to generate stacktraces which can be really slow.
If that’s the case, it is recommended to install an alternative implementation of the tool.llvm-addr2line works equally well (But note, that llvm-objdump is not compatible with jeprof)And later use it like this jeprof --tools addr2line:/usr/bin/llvm-addr2line,nm:/usr/bin/llvm-nm,objdump:/usr/bin/objdump,c++filt:/usr/bin/llvm-cxxfilt--base argument:
Examples
Using symbolized profiles (recommended):- Generate a text file with each procedure written per line:
- Generate a PDF file with a call-graph:
- Generate a text file with each procedure written per line:
- Generate a PDF file with a call-graph:
Generating a flame graph
jeprof allows you to generate collapsed stacks for building flame graphs.
You need to use the --collapsed argument:
flamegraph.pl:
Additional options for the profiler
jemalloc has many different options available, which are related to the profiler. They can be controlled by modifying the MALLOC_CONF environment variable.
For example, the interval between allocation samples can be controlled with lg_prof_sample.
If you want to dump the heap profile every N bytes you can enable it using lg_prof_interval.
It is recommended to check jemallocs reference page for a complete list of options.
Other resources
ClickHouse/Keeper exposejemalloc related metrics in many different ways.
System table asynchronous_metrics
System table jemalloc_bins
Contains information about memory allocations done via the jemalloc allocator in different size classes (bins) aggregated from all arenas.
Reference
System table jemalloc_stats (26.2+)
Returns the full output of malloc_stats_print() as a single string. Equivalent to the SYSTEM JEMALLOC STATS command.
Prometheus
Alljemalloc related metrics from asynchronous_metrics are also exposed using the Prometheus endpoint in both ClickHouse and Keeper.
Reference
jmst 4LW command in Keeper
Keeper supports the jmst 4LW command which returns basic allocator statistics: