ClickHouse는 쿼리 실행을 분석할 수 있도록 샘플링 프로파일러를 실행합니다.
프로파일러를 사용하면 쿼리 실행 중 가장 자주 사용되는 소스 코드 루틴을 찾을 수 있습니다.
idle 시간을 포함해 사용된 CPU 시간과 실제 경과 시간을 추적할 수 있습니다.
쿼리 프로파일러는 ClickHouse Cloud에서 자동으로 활성화됩니다.
다음 예시 쿼리는 함수 이름과 소스 위치를 해석한 상태에서, 프로파일링된 쿼리의 가장 빈번한 스택 트레이스를 찾습니다.
팁
query_id 값을 프로파일링할 쿼리의 ID로 바꾸십시오.
ClickHouse Cloud
자가 관리형
ClickHouse Cloud에서는 쿼리 결과 테이블 위 막대의 맨 오른쪽(테이블/차트 전환 옆)에 있는 "..." 를 클릭하면 쿼리 ID를 얻을 수 있습니다. 그러면 컨텍스트 메뉴가 열리고, 여기서 "Copy query ID" 를 클릭할 수 있습니다.
클러스터의 모든 노드에서 선택하려면 clusterAllReplicas(default, system.trace_log)를 사용하십시오:
SELECT
count(),
arrayStringConcat(arrayMap(x -> concat(demangle(addressToSymbol(x)), '\n ', addressToLine(x)), trace), '\n') AS sym
FROM clusterAllReplicas(default, system.trace_log)
WHERE query_id = '<query_id>' AND trace_type = 'CPU' AND event_date = today()
GROUP BY trace
ORDER BY count() DESC
LIMIT 10
SETTINGS allow_introspection_functions = 1
SELECT
count(),
arrayStringConcat(arrayMap(x -> concat(demangle(addressToSymbol(x)), '\n ', addressToLine(x)), trace), '\n') AS sym
FROM system.trace_log
WHERE query_id = '<query_id>' AND trace_type = 'CPU' AND event_date = today()
GROUP BY trace
ORDER BY count() DESC
LIMIT 10
SETTINGS allow_introspection_functions = 1
<!-- 추적 로그. 쿼리 프로파일러가 수집한 스택 트레이스를 저장합니다.
query_profiler_real_time_period_ns 및 query_profiler_cpu_time_period_ns 설정을 참조하십시오. -->
<trace_log>
<database>system</database>
<table>trace_log</table>
<partition_by>toYYYYMM(event_date)</partition_by>
<flush_interval_milliseconds>7500</flush_interval_milliseconds>
<max_size_rows>1048576</max_size_rows>
<reserved_size_rows>8192</reserved_size_rows>
<buffer_size_rows_flush_threshold>524288</buffer_size_rows_flush_threshold>
<!-- 충돌 발생 시 로그를 디스크에 덤프할지 여부를 나타냅니다 -->
<flush_on_crash>false</flush_on_crash>
<symbolize>true</symbolize>
</trace_log>
이 섹션은 프로파일러 동작 결과가 저장되는 trace_log 시스템 테이블(system table)을 설정합니다.
이 테이블의 데이터는 서버가 실행 중인 동안에만 유효하다는 점에 유의하십시오.
서버를 재시작한 후에도 ClickHouse는 이 테이블을 정리하지 않으므로, 저장된 가상 메모리 주소는 모두 더 이상 유효하지 않을 수 있습니다.
이 설정을 사용하면 프로파일러 타이머를 설정할 수 있습니다.
이들은 세션 설정이므로 전체 서버, 개별 사용자 또는 사용자 프로필, 대화형 세션, 각 개별 쿼리에 서로 다른 샘플링 빈도를 적용할 수 있습니다.
기본 샘플링 빈도는 초당 샘플 1개이며, CPU 타이머와 실제 시간 타이머가 모두 활성화되어 있습니다.
이 빈도는 서버 성능에 영향을 주지 않으면서 ClickHouse 클러스터에 대한 충분한 정보를 수집할 수 있게 해줍니다.
개별 쿼리를 각각 프로파일링해야 한다면 더 높은 샘플링 빈도를 사용하십시오.
addressToLine, addressToLineWithInlines, addressToSymbol, demangle인트로스펙션 함수를 사용하여 ClickHouse 코드에서 함수 이름과 해당 위치를 확인하십시오.
특정 쿼리의 프로필을 얻으려면 trace_log 테이블의 데이터를 집계해야 합니다.
데이터는 개별 함수별로 또는 전체 스택 트레이스별로 집계할 수 있습니다.
SELECT
event_time,
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 = '<query_id>' AND trace_type = 'MemorySample'
)
GROUP BY event_time
ORDER BY event_time;
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 = '<query_id>' AND trace_type = 'MemorySample'
);
인트로스펙션 함수(introspection functions)를 사용하여 다음과 같은 보고서를 얻습니다:
심볼 이름과 해당하는 소스 코드 함수 이름
해당 함수들의 소스 코드 위치
SELECT
count(),
arrayStringConcat(arrayMap(x -> concat(demangle(addressToSymbol(x)), '\n ', addressToLine(x)), trace), '\n') AS sym
FROM system.trace_log
WHERE (query_id = '<query_id>') AND (event_date = today())
GROUP BY trace
ORDER BY count() DESC
LIMIT 10