메인 콘텐츠로 건너뛰기
ClickHouse는 전역 메모리 할당자(allocator)로 jemalloc을 사용합니다. Jemalloc은 할당 샘플링과 프로파일링을 위한 몇 가지 도구를 제공합니다. 할당 프로파일링을 더 편리하게 사용할 수 있도록 Keeper의 4글자 단어(4LW) 명령과 함께 SYSTEM 명령도 제공합니다.

할당 샘플링 및 힙 프로필 플러시

jemalloc에서 할당을 샘플링하고 프로파일링하려면 환경 변수 MALLOC_CONF를 사용해 프로파일링을 활성화한 상태로 ClickHouse/Keeper를 시작해야 합니다:
MALLOC_CONF=background_thread:true,prof:true,prof_active:true
jemalloc은 메모리 할당을 샘플링하고 해당 정보를 내부에 저장합니다. 다음을 실행하면 jemalloc에서 현재 프로파일을 플러시하도록 할 수 있습니다.
SYSTEM JEMALLOC FLUSH PROFILE
기본적으로 힙 프로파일 파일은 /tmp/jemalloc_clickhouse._pid_._seqnum_.heap에 생성되며, 여기서 _pid_는 ClickHouse의 PID이고 _seqnum_는 현재 힙 프로파일의 전역 시퀀스 번호입니다. Keeper의 경우 기본 파일은 /tmp/jemalloc_keeper._pid_._seqnum_.heap이며 동일한 규칙을 따릅니다. MALLOC_CONF 환경 변수에 prof_prefix 옵션을 추가하여 다른 위치를 지정할 수 있습니다. 예를 들어, 파일 이름 접두사를 my_current_profile로 하여 /data 폴더에 프로파일을 생성하려면 다음 환경 변수로 ClickHouse/Keeper를 실행할 수 있습니다.
MALLOC_CONF=background_thread:true,prof:true,prof_prefix:/data/my_current_profile
생성된 파일 이름에는 접두사(prefix)인 PID와 시퀀스 번호가 추가됩니다.

힙 프로파일 분석

힙 프로파일이 생성되면 이를 분석해야 합니다. 이를 위해 jemallocjeprof라는 도구를 사용할 수 있습니다. 설치 방법은 여러 가지가 있습니다.
  • 시스템 패키지 관리자를 사용하는 방법
  • jemalloc 저장소를 클론한 뒤 루트 폴더에서 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]
두 프로파일 간에 어떤 메모리 할당이 발생했는지 비교하려면 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 stacks를 만들 수 있습니다. --collapsed 인수를 사용해야 합니다:
jeprof path/to/binary path/to/heap/profile --collapsed > result.collapsed
그 후에는 collapsed stacks를 시각화할 때 다양한 도구를 사용할 수 있습니다. 가장 널리 사용되는 도구는 FlameGraph이며, 여기에는 flamegraph.pl이라는 스크립트가 포함되어 있습니다:
cat result.collapsed | /path/to/FlameGraph/flamegraph.pl --color=mem --title="Allocation Flame Graph" --width 2400 > result.svg
또 다른 유용한 도구로는 수집된 스택을 더욱 대화형으로 분석할 수 있는 speedscope가 있습니다.

런타임 중 할당 프로파일러 제어

ClickHouse/Keeper를 프로파일러가 활성화된 상태로 시작한 경우, 런타임 중 할당 프로파일링을 비활성화하거나 활성화하는 추가 명령을 사용할 수 있습니다. 이 명령을 사용하면 특정 인터벌만 더 쉽게 프로파일링할 수 있습니다. 프로파일러를 비활성화하려면 다음 명령을 사용하십시오:
SYSTEM JEMALLOC DISABLE PROFILE
프로파일러를 활성화하려면 다음 명령을 사용하십시오:
SYSTEM JEMALLOC ENABLE PROFILE
기본적으로 활성화되어 있는 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 LIKE '%jemalloc%'
FORMAT Vertical
참고

시스템 테이블 jemalloc_bins

모든 아레나에서 집계한, jemalloc 메모리 할당자를 통해 여러 크기 클래스(bin)에서 수행된 메모리 할당 정보를 포함합니다. 참고

Prometheus

asynchronous_metrics의 모든 jemalloc 관련 메트릭은 ClickHouse와 Keeper 모두에서 Prometheus 엔드포인트를 통해서도 제공됩니다. 참고

Keeper의 jmst 4LW 명령

Keeper는 기본 메모리 할당자 통계를 반환하는 jmst 4LW 명령을 지원합니다:
echo jmst | nc localhost 9181
마지막 수정일 2026년 6월 10일