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스크립트를 제공합니다.
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 인자를 사용해야 합니다:
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