分配分析
ClickHouse 使用 jemalloc 作为其全局分配器,它带有一些用于分配采样和分析的工具。
为了使分配分析更加方便,在 Keeper 中,除了 4LW 命令外,还提供了 SYSTEM
命令。
采样分配和刷新堆配置文件
如果我们想要在 jemalloc
中采样和分析分配,我们需要使用环境变量 MALLOC_CONF
启用分析来启动 ClickHouse/Keeper。
MALLOC_CONF=background_thread:true,prof:true
jemalloc
将采样分配并在内部存储信息。
我们可以通过运行以下命令告诉 jemalloc
刷新当前配置文件
- ClickHouse
- Keeper
SYSTEM JEMALLOC FLUSH PROFILE
echo jmfp | nc localhost 9181
默认情况下,堆配置文件将在 /tmp/jemalloc_clickhouse._pid_._seqnum_.heap
中生成,其中 _pid_
是 ClickHouse 的 PID,_seqnum_
是当前堆配置文件的全局序列号。
对于 Keeper,默认文件是 /tmp/jemalloc_keeper._pid_._seqnum_.heap
,遵循相同的规则。
可以通过将 prof_prefix
选项附加到 MALLOC_CONF
环境变量来定义不同的位置。
例如,如果我们想要在 /data
文件夹中生成配置文件,其中文件名的前缀将是 my_current_profile
,我们可以使用以下环境变量运行 ClickHouse/Keeper
MALLOC_CONF=background_thread:true,prof:true,prof_prefix:/data/my_current_profile
生成的文件将附加到前缀 PID 和序列号。
分析堆配置文件
在我们生成堆配置文件之后,我们需要分析它们。
为此,我们需要使用 jemalloc
的名为 jeprof 的工具,该工具可以通过多种方式安装
- 使用系统的包管理器安装
jemalloc
- 克隆 jemalloc repo 并从根文件夹运行 autogen.sh,这将为您提供
bin
文件夹内的jeprof
脚本
jeprof
使用 addr2line
生成堆栈跟踪,这可能非常慢。
如果是这种情况,我们建议安装该工具的 替代实现。
git clone https://github.com/gimli-rs/addr2line.git --depth=1 --branch=0.23.0
cd addr2line
cargo build --features bin --release
cp ./target/release/addr2line path/to/current/addr2line
有许多不同的格式可以从使用 jeprof
的堆配置文件生成。我们建议运行 jeprof --help
来检查用法和该工具提供的许多不同选项。
一般来说,jeprof
命令看起来像这样
jeprof path/to/binary path/to/heap/profile --output_format [ > output_file]
如果我们想要比较 2 个配置文件之间发生了哪些分配,我们可以设置 base 参数
jeprof path/to/binary --base path/to/first/heap/profile path/to/second/heap/profile --output_format [ > output_file]
例如
- 如果我们想要生成一个文本文件,其中每行写入一个过程
jeprof path/to/binary path/to/heap/profile --text > result.txt
- 如果我们想要生成一个带有调用图的 PDF 文件
jeprof path/to/binary path/to/heap/profile --pdf > result.pdf
生成火焰图
jeprof
允许我们生成折叠堆栈以构建火焰图。
我们需要使用 --collapsed
参数
jeprof path/to/binary path/to/heap/profile --collapsed > result.collapsed
之后,我们可以使用许多不同的工具来可视化折叠堆栈。
最受欢迎的是 FlameGraph,其中包含一个名为 flamegraph.pl
的脚本
cat result.collapsed | /path/to/FlameGraph/flamegraph.pl --color=mem --title="Allocation Flame Graph" --width 2400 > result.svg
另一个有趣的工具是 speedscope,它允许您以更交互的方式分析收集的堆栈。
在运行时控制分配分析器
如果 ClickHouse/Keeper 在启动时启用了分析器,它们支持用于在运行时禁用/启用分配分析的其他命令。使用这些命令,可以更轻松地仅分析特定间隔。
禁用分析器
- ClickHouse
- Keeper
SYSTEM JEMALLOC DISABLE PROFILE
echo jmdp | nc localhost 9181
启用分析器
- ClickHouse
- Keeper
SYSTEM JEMALLOC ENABLE PROFILE
echo jmep | nc localhost 9181
也可以通过设置 prof_active
选项来控制分析器的初始状态,默认情况下该选项是启用的。
例如,如果我们不想在启动期间采样分配,而只想在启用分析器之后进行采样,我们可以使用以下环境变量启动 ClickHouse/Keeper
MALLOC_CONF=background_thread:true,prof:true,prof_active:false
并在稍后启用分析器。
分析器的其他选项
jemalloc
有许多与分析器相关的不同选项,可以通过修改 MALLOC_CONF
环境变量来控制。例如,分配样本之间的间隔可以使用 lg_prof_sample
来控制。
如果您想要每 N 个字节转储堆配置文件,您可以使用 lg_prof_interval
启用它。
我们建议查看 jemalloc
的 参考页面 以获取此类选项。
其他资源
ClickHouse/Keeper 以多种不同的方式公开 jemalloc
相关指标。
重要的是要注意,这些指标彼此之间都未同步,并且值可能会漂移。
系统表 asynchronous_metrics
SELECT *
FROM system.asynchronous_metrics
WHERE metric ILIKE '%jemalloc%'
FORMAT Vertical
系统表 jemalloc_bins
包含有关通过 jemalloc 分配器在不同大小类(bins)中完成的内存分配的信息,这些信息是从所有 arena 聚合而来的。
Prometheus
来自 asynchronous_metrics
的所有 jemalloc
相关指标也使用 ClickHouse 和 Keeper 中的 Prometheus 端点公开。
Keeper 中的 jmst
4LW 命令
Keeper 支持 jmst
4LW 命令,该命令返回 基本分配器统计信息。
示例
echo jmst | nc localhost 9181