[소개]
구글의 성능 측정 툴이 모태가 되어서 개발된 오픈소스 툴이다.
멀티스레드 환경에서 잘 동작한다고 주장하고 있으며 아래 세 가지가 메인 기능이라고 한다.
- malloc 성능향상 : tcmalloc
- heap-checker
- heap-profiler
- cpu-profiler
체커나 프로파일을 위한 리포트를 생성하기 위해서 pprof 라는 내부 툴이 있다.
다만 해당이 golang 버전으로 대체 되었다고 한다.
얼핏 살펴보니 perf 또한 지원하는 형태로 발전한 듯 하다.
나중에 시간나면 한번 살펴봐야지.
- https://github.com/google/pprof
[TCMALLOC]
간단하게 -ltcmalloc 또는 -ltcmalloc_minimal 을 링크하는 것으로 끝이다.
이렇게 하면 코드 상의 malloc 또는 new는 tcmalloc 버전으로 대체된다.
당연히 기존 malloc과 new에 비해서는 성능이 향상된다.
아래는 TCMALLOC과 다른 라이브러리의 성능을 비교한 링크이다.
- http://www.highlandsun.com/hyc/malloc/
- http://gaiacrtn.free.fr/articles/win32perftools.html
잠깐 확인해보니 전반적으로 TCMALLOC가 메모리 절약 및 성능이 뛰어나다는 것을 알 수 있다.
다만 해당 문서가 오래전에 만들어진 것 같으니 최신의 정보가 있으면 더 좋을 것 같다.
추가로 살펴보니 다른 재밌는 솔루션도 많다. 아래는 lockless allocator에 대한 성능 리포트를 보여준다.
- https://locklessinc.com/benchmarks_allocator.shtml
굉장히 높은 성능을 보여주는데 안타깝게도 size에 대한 정보는 없다.
TCMALLOC 보다 약간 성능이 좋은 것 같지만 크게 차이는 나지 않는다.
jemalloc이라고 FACEBOOK에서 개발한 솔루션도 있다. TCMALLOC과의 비교에 대한 이야기는 아래 링크에 조금 나온다.
- https://stackoverflow.com/questions/7852731/c-memory-allocation-mechanism-performance-comparison-tcmalloc-vs-jemalloc
정리하자면 일반적인 케이스에서는 TCMALLOC이 좀더 좋은 결과를 보여준다고 한다.
[HEAP PROFILER]
Heap 메모리 사용량을 분석하는 툴이다.
1) 실행파일에 -ltcmalloc 를 링크한다.
2) HEAPPROFILE 환경변수와 함께 실행한다.
$ HEAPPROFILE=/tmp/heapprof <path/to/binary> [binary args]
3) pprof 를 통해서 heap 사용량을 분석한다.
$ pprof <path/to/binary> /tmp/heapprof.0045.heap # run 'ls' to see options
$ pprof --gv <path/to/binary> /tmp/heapprof.0045.heap
-ltcmalloc으로 컴파일 되지 않은 실행파일의 경우, LD_PRELOAD를 통해서 테스트해 볼수도 있다.
[HEAP CHECKER]
메모리 릭을 잡아내는 툴이다. 중요한 점은 tcmalloc 라이브러리가 실행파일의 마지막에 링크되어야 한다는 점이다.
마지막에 링크되지 않으면 이전에 링크된 라이브러리의 메모리 릭을 확인하지 못할 수 있다.
1) 실행파일에 -ltcmalloc 를 마지막에 링크한다.
2) HEAPCHECK 환경변수와 함께 실행한다.
$ HEAPCHECK=1 <path/to/binary> [binary args]
-ltcmalloc으로 컴파일 되지 않은 실행파일의 경우, LD_PRELOAD를 통해서 테스트해 볼수도 있다.
[CPU PROFILER]
CPU 사용량을 프로파일링하는 툴이다.
1) 실행파일에 -lprofiler 를 링크한다.
2) CPUPROFILE 환경변수와 함께 실행한다
$ CPUPROFILE=/tmp/prof.out <path/to/binary> [binary args]
3) pprof 를 통해서 cpu 사용량을 분석한다.
$ pprof <path/to/binary> /tmp/prof.out # -pg-like text output
$ pprof --gv <path/to/binary> /tmp/prof.out # really cool graphical output
[ENVIRONMENT VARIABLES]
라이브러리를 링크하더라도 실제로 기능을 on하지 않으면 해당 라이브러리는 동작하지 않는다.
따라서 라이브러리 링크 자체는 안전하다고 한다.
기능을 on시키는 가장 간단한 방법은 이전에 표시했듯이 환경변수를 설정하는 것이다.
기본적인 환경변수들은 아래와 같다.
- HEAPPROFILE=<pre> : HEAP PROFILER 실행
- HEAPCHECK=<type> : HEAP CHECKER 실행
- CPUPROFILE=<file> : CPU PROFILER 실행
아래는 CPU PROFILER에 대한 추가적인 환경변수들이다.
- PROFILESELECTED=1 : 1일 경우, CPU PROFILER은 ProfilerEnable()와 ProfilerDisable()로 둘러쌓은 부분만 프로파일링
- CPUPROFILE_FREQUENCY=x : CPU PROFILER의 샘플링 기준을 설정한다
아래는 message 관련된 추가 환경변수들이다.
- PERFTOOLS_VERBOSE=<level> : malloc시 레벨에 해당하는 추가 메시지 제공
- MALLOCSTATS=<level> : 프로그램 종료시 메모리 사용정보 출력
[링크]
- 홈페이지 https://github.com/gperftools/gperftools
- 메일링 리스트 : https://groups.google.com/forum/#!forum/gperftools
'소프트웨어 > 툴 & 프로파일링' 카테고리의 다른 글
gprof 고급사용법 : call 그래프 결과 이미지로 변환하기 등 (0) | 2017.06.01 |
---|---|
예제와 함께하는 gprof를 이용한 기본적인 CPU 프로파일링 (0) | 2017.05.31 |