メインコンテンツへスキップ

flameGraph

導入バージョン: v23.8.0 スタックトレースのリストを使ってフレームグラフを生成します。 flamegraph.pl ユーティリティでフレームグラフの SVG をレンダリングするために使用できる、文字列の配列を出力します。
ptr != 0 の場合、flameGraph は同じ size と ptr を持つ割り当て (size > 0) と解放 (size < 0) を対応付けます。 解放されていない割り当てのみが表示されます。 対応付けられない解放は無視されます。
構文
flameGraph(traces[, size[, ptr]])
引数
  • traces — スタックトレース。生のアドレス、またはすでにシンボル化された文字列 (例: arrayMap(addressToSymbol, trace)) として指定します。Array(UInt64) または Array(String)
  • size — オプション。メモリ profiling 用の割り当てサイズ (デフォルトは 1) 。UInt64
  • ptr — オプション。割り当てアドレス (デフォルトは 0) 。UInt64
戻り値 flamegraph.pl ユーティリティで使用する String の配列を返します。Array(String) CPU クエリプロファイラに基づくフレームグラフの作成
Query
SET query_profiler_cpu_time_period_ns=10000000;
SELECT SearchPhrase, COUNT(DISTINCT UserID) AS u FROM hits WHERE SearchPhrase <> '' GROUP BY SearchPhrase ORDER BY u DESC LIMIT 10;
Response
clickhouse client --allow_introspection_functions=1 -q "select arrayJoin(flameGraph(arrayReverse(trace))) from system.trace_log where trace_type = 'CPU' and query_id = 'xxx'" | ~/dev/FlameGraph/flamegraph.pl  > flame_cpu.svg
メモリクエリプロファイラに基づくフレームグラフ (すべての割り当てを表示)
Query
SET memory_profiler_sample_probability=1, max_untracked_memory=1;
SELECT SearchPhrase, COUNT(DISTINCT UserID) AS u FROM hits WHERE SearchPhrase <> '' GROUP BY SearchPhrase ORDER BY u DESC LIMIT 10;
Response
clickhouse client --allow_introspection_functions=1 -q "select arrayJoin(flameGraph(trace, size)) from system.trace_log where trace_type = 'MemorySample' and query_id = 'xxx'" | ~/dev/FlameGraph/flamegraph.pl --countname=bytes --color=mem > flame_mem.svg
メモリクエリプロファイラに基づいてフレームグラフを作成し、解放されなかった割り当てを表示する
Query
SET memory_profiler_sample_probability=1, max_untracked_memory=1, use_uncompressed_cache=1, merge_tree_max_rows_to_use_cache=100000000000, merge_tree_max_bytes_to_use_cache=1000000000000;
SELECT SearchPhrase, COUNT(DISTINCT UserID) AS u FROM hits WHERE SearchPhrase <> '' GROUP BY SearchPhrase ORDER BY u DESC LIMIT 10;
Response
clickhouse client --allow_introspection_functions=1 -q "SELECT arrayJoin(flameGraph(trace, size, ptr)) FROM system.trace_log WHERE trace_type = 'MemorySample' AND query_id = 'xxx'" | ~/dev/FlameGraph/flamegraph.pl --countname=bytes --color=mem > flame_mem_untracked.svg
メモリクエリプロファイラに基づくフレームグラフを作成し、特定時点でのアクティブな割り当てを表示する
Query
SET memory_profiler_sample_probability=1, max_untracked_memory=1;
SELECT SearchPhrase, COUNT(DISTINCT UserID) AS u FROM hits WHERE SearchPhrase <> '' GROUP BY SearchPhrase ORDER BY u DESC LIMIT 10;

-- 1. 1秒あたりのメモリ使用量
SELECT event_time, m, formatReadableSize(max(s) AS m) FROM (SELECT event_time, sum(size) OVER (ORDER BY event_time) AS s FROM system.trace_log WHERE query_id = 'xxx' AND trace_type = 'MemorySample') GROUP BY event_time ORDER BY event_time;

-- 2. メモリ使用量が最大となる時点を見つける
SELECT argMax(event_time, s), max(s) FROM (SELECT event_time, sum(size) OVER (ORDER BY event_time) AS s FROM system.trace_log WHERE query_id = 'xxx' AND trace_type = 'MemorySample');
Response
-- 3. 特定時点のアクティブな割り当てを固定する
clickhouse client --allow_introspection_functions=1 -q "SELECT arrayJoin(flameGraph(trace, size, ptr)) FROM (SELECT * FROM system.trace_log WHERE trace_type = 'MemorySample' AND query_id = 'xxx' AND event_time <= 'yyy' ORDER BY event_time\)\" | ~/dev/FlameGraph/flamegraph.pl --countname=bytes --color=mem > flame_mem_time_point_pos.svg

-- 4. 特定時点の解放を検出する
clickhouse client --allow_introspection_functions=1 -q "SELECT arrayJoin(flameGraph(trace, -size, ptr)) FROM (SELECT * FROM system.trace_log WHERE trace_type = 'MemorySample' AND query_id = 'xxx' AND event_time > 'yyy' ORDER BY event_time desc\)\" | ~/dev/FlameGraph/flamegraph.pl --countname=bytes --color=mem > flame_mem_time_point_neg.svg
最終更新日 2026年6月10日