DHAT - 동적 힙 분석 도구 치트시트
DHAT - 동적 힙 분석 도구 치트시트
DHAT (동적 힙 분석 도구)는 대부분의 메모리 프로파일러와 다른 질문에 답하는 Valgrind 도구입니다. “할당한 메모리가 얼마나 많은가”보다는 그 메모리가 실제로 어떻게 사용되었는가를 보고합니다: 할당되었지만 읽지 않은 블록, 한 번 기록되고 다시 건드리지 않은 블록, 매우 단기 할당, 그리고 할당이 실제로 접근한 바이트보다 훨씬 큰 할당. 그 사용 보기는 크기 만으로 프로파일러가 볼 수 없는 낭비를 종종 드러냅니다.
설치
| 플랫폼 | 명령어 |
|---|---|
| Debian/Ubuntu | sudo apt install valgrind |
| Fedora/RHEL | sudo dnf install valgrind |
| Arch Linux | sudo pacman -S valgrind |
| macOS | 제한된 지원; Linux 선호 |
| 확인 | valgrind --tool=dhat --version |
유용한 스택 추적을 위해
-g로 프로그램을 구축합니다. DHAT는 Valgrind에서 실행되므로 상당한 느림을 예상합니다 — 이것은 분석 도구입니다, 프로덕션 프로파일러가 아닙니다.
DHAT 실행
valgrind --tool=dhat ./my-program
# → dhat.out.<pid> 생산
| 옵션 | 목적 |
|---|---|
--dhat-out-file=FILE | 출력 경로 |
--mode=heap | 기본 힙 프로파일링 |
--mode=copy | 메모리 복사 프로파일 (memcpy 등.) |
--mode=ad-hoc | 사용자 정의 계측 포인트 |
--num-callers=N | 보고서의 스택 깊이 |
결과 보기
DHAT 출력은 JSON이며 번들로 제공되는 HTML 뷰어에서 봅니다:
# 뷰어를 열고 dhat.out.<pid>를 로드합니다
firefox /usr/libexec/valgrind/dh_view.html
| UI 요소 | 표시 |
|---|---|
| 할당 지점의 트리 | 호출 스택으로 그룹화 |
| 총 / 최대 바이트 | 사이트당 부피 |
| 읽기 / 쓰기 | 메모리가 실제로 접근된 정도 |
| 수명 | 블록이 살아 있었던 기간 |
| 정렬 | 가장 나쁜 범죄자를 찾기 위해 모든 메트릭 |
중요한 메트릭
| 메트릭 | 드러냄 |
|---|---|
| 총 바이트 | 이 사이트에서 할당 부피 |
| 최대 바이트 | 최고 동시 사용 |
| 읽기 / 쓰기 | 접근 강도 |
| 읽기 = 0 | 할당되었지만 읽지 않음 — 순수 낭비 |
| 쓰기 = 0 | 초기화되지 않음 — 가능한 버그 또는 낭비 |
| 짧은 수명 | 변화; 스택/풀링의 후보 |
| 접근 비율 | 할당된 vs 접근한 바이트 |
“읽기 = 0” 경우는 고전적인 DHAT 발견입니다: 프로그램이 성실하게 할당, 채우기, 해제하는 메모리로, 아무도 그것을 읽지 않습니다.
일반적인 발견 및 수정
| 발견 | 가능한 수정 |
|---|---|
| 많은 작은 단기 할당 | 스택 할당, 아레나, 또는 객체 풀 |
| 큰 블록, 작은 접근 부분 | 사용하는 것만 할당; 지연 로드 |
| 읽지 않은 할당 | 작업을 완전히 삭제 |
| 같은 크기의 반복 할당/해제 | 버퍼 재사용 |
| 과도한 컨테이너 | 정확한 용량 예약 |
복사 모드
valgrind --tool=dhat --mode=copy ./my-program
복사 모드는 호출 사이트별 memcpy/memmove 부피를 프로파일하며 — 프로파일링이 복사에서 시간을 표시하고 어느 코드가 책임이 있는지 알아야 할 때 유용합니다.
애드혹 모드
애드혹 모드를 사용하면 DHAT 클라이언트 요청으로 코드에 주석을 달아 임의의 이벤트를 세거나, DHAT를 “어느 호출 스택이 가장 많이” 카운터로 전환할 수 있습니다.
DHAT vs 관련 도구
| 측면 | DHAT | massif | heaptrack | Bytehound |
|---|---|---|---|---|
| 초점 | 메모리가 사용되는 방법 | 시간에 따른 최고 사용 | 할당 프로파일링 | 대화형 탐색 |
| 오버헤드 | 높음 (Valgrind) | 높음 (Valgrind) | 낮음 | 낮음 |
| 고유 통찰 | 읽지 않음/미달성 블록 | 최고 스냅샷 | 변화 + 누수 | 풍부한 필터링 |
| 최적 대상 | 낭비된 일 찾기 | 최고 감소 | 빠른 현실적 실행 | 심층 대화형 분석 |
현실적인 실행의 낮은 오버헤드 프로파일링을 위해 heaptrack 또는 Bytehound를 사용합니다; 할당 메모리가 실제로 사용되었는지 알아야 할 때 DHAT을 참고합니다.