サンプリングクエリプロファイラ
ClickHouse には、クエリ実行を分析するためのサンプリングプロファイラがあります。 このプロファイラを使用すると、クエリ実行中に最も頻繁に使用されるソースコード中のルーチンを特定できます。 CPU 時間と、アイドル時間を含む経過時間を追跡できます。
ClickHouse Cloud では、クエリプロファイラは自動的に有効になります。 次のクエリ例では、関数名とソース位置を解決したうえで、プロファイル対象のクエリについて最も頻出するスタックトレースを特定します。
query_id の値は、プロファイルしたいクエリの ID に置き換えてください。
- ClickHouse Cloud
- セルフマネージド
ClickHouse Cloud では、クエリ結果テーブルの上にあるバーの右端 (テーブル/チャート切り替えの横) にある "..." をクリックすると、クエリ ID を取得できます。コンテキストメニューが開くので、"Copy query ID" をクリックしてください。
クラスター内のすべてのノードから選択するには、clusterAllReplicas(default, system.trace_log) を使用します。
セルフマネージド環境でクエリプロファイラを使用する
セルフマネージド環境でクエリプロファイラを使用するには、以下の手順に従ってください。
デバッグ情報付きの ClickHouse をインストールする
clickhouse-common-static-dbg パッケージをインストールします。
- 「Debian リポジトリをセットアップする」 の手順に従います
sudo apt-get install clickhouse-server clickhouse-client clickhouse-common-static-dbgを実行し、デバッグ情報付きでビルドされた ClickHouse のバイナリをインストールしますsudo service clickhouse-server startを実行してサーバーを起動しますclickhouse-clientを実行します。clickhouse-common-static-dbgのデバッグシンボルはサーバーによって自動的に使用されるため、有効化のための特別な操作は不要です
サーバー設定を確認する
サーバー設定ファイルの trace_log セクションがセットアップされていることを確認してください。これはデフォルトで有効です。
このセクションでは、プロファイラの実行結果を含む trace_log system テーブルを設定します。 このテーブル内のデータは、サーバーの稼働中にのみ有効であることに注意してください。 サーバーを再起動しても ClickHouse はこのテーブルをクリーンアップしないため、保存されている仮想メモリアドレスは無効になる可能性があります。
プロファイラのタイマーを設定する
query_profiler_cpu_time_period_ns または query_profiler_real_time_period_ns を設定します。
これら 2 つの設定は同時に使用できます。
これらの設定により、プロファイラのタイマーを構成できます。 これらはセッション設定であるため、サーバー全体、個々のユーザーやユーザープロファイル、対話セッション、さらには個々のクエリごとに異なるサンプリング頻度を設定できます。
デフォルトのサンプリング頻度は 1 秒あたり 1 サンプルで、CPU タイマーと実時間タイマーの両方が有効です。 この頻度であれば、サーバーのパフォーマンスに影響を与えずに、ClickHouse クラスターに関する十分な情報を収集できます。 個々のクエリをそれぞれプロファイルする必要がある場合は、より高いサンプリング頻度を使用してください。
trace_log system テーブルを分析する
trace_log system テーブルを分析するには、allow_introspection_functions 設定でイントロスペクション関数を有効にします。
セキュリティ上の理由により、イントロスペクション関数はデフォルトで無効になっています
addressToLine、addressToLineWithInlines、addressToSymbol、demangle のイントロスペクション関数を使用して、関数名と ClickHouse コード内の位置を取得します。
特定のクエリのプロファイルを取得するには、trace_log テーブルのデータを集約する必要があります。
データは個々の関数単位でも、スタックトレース全体単位でも集約できます。
trace_log の情報を可視化する必要がある場合は、flamegraph と speedscope を試してください。
flameGraph 関数でフレームグラフを作成する
ClickHouse には、trace_log に保存されたスタックトレースから直接フレームグラフを生成する flameGraph 集約関数があります。
出力は、flamegraph.pl と互換性のあるフォーマットの文字列配列です。
構文:
引数:
traces— スタックトレース。Array(UInt64)。size— メモリ性能分析用の割り当てサイズ。Int64。ptr— 割り当てアドレス。UInt64。
ptr が 0 以外の場合、flameGraph は同じサイズとポインタを持つ割り当て (size > 0) と解放 (size < 0) を対応付けます。
解放されていない割り当てだけが表示されます。
対応しない解放は無視されます。
CPUフレームグラフ
以下のクエリを実行するには、flamegraph.pl がインストールされている必要があります。
インストールするには、次を実行します。
以下のクエリ内の flamegraph.pl を、お使いのマシン上での flamegraph.pl のパスに置き換えてください
クエリを実行し、続いてフレームグラフを生成します:
メモリのフレームグラフ — すべての割り当て
クエリを実行し、続いてフレームグラフを生成します。
メモリフレームグラフ — 未解放の割り当て
このバリアントでは、ポインタ単位で割り当てと解放を対応付け、クエリの実行中に解放されなかったメモリのみを表示します。
フレームグラフを作成するには、次のクエリを実行します。
メモリフレームグラフ — ある時点で有効なメモリ割り当て
この方法では、ピーク時のメモリ使用量を特定し、その時点で何が割り当てられていたかを可視化できます。
時系列でメモリ使用量を確認する
メモリ使用量が最大の時点を見つける
その時点におけるアクティブな割り当てのフレームグラフを作成する
その時点以降のメモリ解放のフレームグラフを作成する (後から何が解放されたかを把握するため)
例
以下のコードスニペットでは:
- クエリ識別子と現在の日付で
trace_logデータをフィルタリングします。 - スタックトレース単位で集計します。
- イントロスペクション関数を使用して、次の内容を含むレポートを取得します。
- シンボル名と、それに対応するソースコード上の関数名
- これらの関数が記述されているソースコード上の位置