25.9 이전 버전의 할당 프로파일링

25.9 이전 버전의 할당 프로파일링 (Allocation profiling for versions before 25.9)

ClickHouse는 전역 할당자로 jemalloc을 사용합니다. jemalloc에는 할당 샘플링과 프로파일링 도구가 함께 제공되어, 힙 프로필을 생성하고 분석해 메모리 할당을 진단할 수 있습니다. 이 문서는 25.9 이전 버전을 위한 내용입니다.

출처: 문서

본문

ClickHouse는 전역 할당자로 jemalloc을 사용합니다. Jemalloc은 할당 샘플링과 프로파일링을 위한 몇 가지 도구와 함께 제공됩니다. 할당 프로파일링을 더 편리하게 만들기 위해 Keeper의 4글자 단어(4LW) 명령과 함께 SYSTEM 명령이 제공됩니다.

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

jemalloc에서 할당을 샘플링하고 프로파일링하려면 환경 변수 MALLOC_CONF로 프로파일링을 활성화한 채 ClickHouse/Keeper를 시작해야 합니다:

MALLOC_CONF=background_thread:true,prof:true,prof_active: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이며, 같은 규칙을 따릅니다.

다른 위치는 MALLOC_CONF 환경 변수에 prof_prefix 옵션을 덧붙여 정의할 수 있습니다. 예를 들어 /data 폴더에서 파일 이름 접두사가 my_current_profile이 되도록 프로필을 생성하려면 다음 환경 변수로 ClickHouse/Keeper를 실행하면 됩니다:

MALLOC_CONF=background_thread:true,prof:true,prof_prefix:/data/my_current_profile

생성된 파일은 접두사에 PID와 시퀀스 번호가 덧붙여집니다.

힙 프로필 분석

힙 프로필이 생성된 후에는 분석해야 합니다. 이를 위해 jemalloc의 도구인 jeprof를 사용할 수 있습니다. 여러 방식으로 설치할 수 있습니다:

  • 시스템의 패키지 매니저 사용
  • jemalloc 저장소를 클론하고 루트 폴더에서 autogen.sh 실행. 이것은 bin 폴더 안에 jeprof 스크립트를 제공합니다.

jeprofaddr2line을 사용해 스택트레이스를 생성하는데, 이것은 매우 느릴 수 있습니다. 그렇다면 도구의 대체 구현을 설치하는 것이 좋습니다.

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 인자를 사용해야 합니다:

jeprof path/to/binary path/to/heap/profile --collapsed > result.collapsed

그 후 다양한 도구로 콜랩스된 스택을 시각화할 수 있습니다.

가장 인기 있는 것은 flamegraph.pl이라는 스크립트를 포함하는 FlameGraph입니다:

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 LIKE '%jemalloc%'
FORMAT Vertical

참조.

시스템 테이블 jemalloc_bins

jemalloc 할당자를 통해 서로 다른 크기 클래스(빈)로 이루어진 메모리 할당에 대한 정보를 모든 아레나에서 집계해 담고 있습니다.

참조.

Prometheus

asynchronous_metrics의 모든 jemalloc 관련 메트릭은 ClickHouse와 Keeper 모두에서 Prometheus 엔드포인트를 사용해 노출됩니다.

참조.

Keeper의 jmst 4LW 명령

Keeper는 기본 할당자 통계를 반환하는 jmst 4LW 명령을 지원합니다:

echo jmst | nc localhost 9181

더 알아보기 (Learn more)