간단히 TcMalloc lib.에 대하여 소개를 해보자면!( 다음 정보는 펌! 출처는... ㄷㄷ )
1) 작동 방식(성능 향상 방식)
- 중앙 메모리 관리자와 쓰레드별 메모리 관리자를 구분하고 작은 크기(32K 이하)의 메모리 할당/해제 요청은
쓰레드별 메모리 관리자가 처리하고, 부족할 경우 중앙 메모리 관리자에서 얻어오는 방식으로 처리함.
- 큰 메모리(32K 이상)는 전역 관리자에서 페이지 크기(4K) 단위로 클래스를 나누어 mmap()을 이용하여 할당 함.
2) 지원 환경
- Linux (32 and 64 bit), Mac OSX, Windows (32 bit only), Solaris
- NUMA-aware TCMalloc(NUMA아키텍처 지원됨)
3) 사용 사례
- 구글 크롬, Webkit, MySQL, HyperTable, Memcached, Redis, Nginx
ref. keyword ) jemalloc / nedmalloc / ptmalloc
요놈을 내가 맡은 프로젝트에 적용해보려고 하였다.
참고로 적용시키려하는 프로젝트는 다년간 서비스 되어온 상용게임의 클라이언트이다.
1. library는 어디서 구하나? 그리고, 어떻게 적용시키나?
어디? : http://code.google.com/p/google-perftools/downloads/list
위 URL 내에서 Google Perftools 최신 버전을 받는다. 내가 받은건 google-perftools-1.7.zip !!!
어떻게?
1) perftools 솔루션 내의 'libtcmalloc_minimal' 프로젝트를 빌드하면 다음 결과물 생성.
결과물 : nedmalloc_ptchg_v110.dll / nedmalloc_ptchg_v110.lib
2) 적용하고자 하는 프로젝트 링커>>출력 파일에 dll 추가.( lib 파일이 프로젝트 폴더내에 필요함 )
3) #include "tcmalloc.h"
4) tc 함수 사용!!!
2. 적용 시키기전에 테스트는 어떻게 하나?
새로운 프로젝트를 만들어서 다음 항목으로 동적할당 테스트를 수행 함.
1) malloc
2) new
3) tc_malloc
4) tc_newarray
5) tc_new
수행방법.
가. 4(byte) ~ 131,072(byte) 16단계로 나누어 수행
나. '가' byte 단위로 각각 10,000 / 100,000 / 1,000,000 / 10,000,000 / 100,000,000 씩 할당/해제 반복!
3. 적용은 잘 되는가?
테스트 프로젝트에서는 적용 잘 됨.
4. 작업을 수행하기 위해서는 비용이 얼마나 드는가?
처음에는 전역으로 new 연산자를 오버로딩 해보았으나. link error 주구장창!!! ㅜ.ㅡ
게임 클라이언트 자체적으로 큰 프로젝트이기에 어디에다가 new 연산자를 넣어야 링크 에러가 안날까
고민하다가 보류!!
그래서, 클래스 내부적으로 new 연산자 오버로딩 시켜서 테스트 진행함.( ex. 케릭터 클래스, NPC 클래스 ... )
실제 적용하기 위해선 그 수백-수천개의 클래스에 일일이 오버로딩 해야할 feel;;;
고로, 지금 상태에선 비용은 '삽질'과 '노가다'가 조화를 이룰것으로 추정!
뭐, 실제 적용하려고 한다면 또 깊게 고민하겠지만, '그냥 테스트 해보기' 이기에 진지하게 고민 안 함.
5. 실제 클라이언트에 적용 후 문제점은 없는가?
테스트 프로젝트를 만들기전에, 실제 게임 클라이언트에 부분 적용해 보았다.
적용 방법은 new 연산자를 오버로딩하였다.
컴파일등은 잘 되었는데, 게임 진행중 클라이언트가 죽는 현상 발생!
정확한 원인은 기억이 안난다;;; 메모리 침범이였던거같다 ㅎㅎ
생각보다 쉽게 적용이 안되서 절망 ㅜ.ㅡ
6. 결론적으로 tcmalloc allocator를 적용하면 성능 향상이 되는가?
시간 측정 결과 매우 많이 비관적이게 나왔지만,
나의 테스트 환경이 최적화 되었다고 볼 수 없기에 다음과 같이 결론 내린다.
많은 스레드를 사용하지 않는 게임 클라이언트에서는 큰 효과를 보기 어렵다.!!!
7. 생각해볼 문제
1) 실제 프로젝트 전체적으로 적용시켜보지 못해봐서 아쉽다.
2) 클라이언트에서 실질적으로 동정할당이 얼마나 일어나는가?
3) 발생하는 동적할당의 평균적인 byte는 얼마가 되는가?
4) 안정성 검증은 어떻게 테스트 해보아야 하는가?
5) 테스트 방법이 적절한가?
6) 테스트 환경이 동등한가?
'비공개' 카테고리의 다른 글
[ Effective C++ ] Intro (0) | 2011.07.07 |
---|---|
표준 C++ 라이브러리의 주요 구성요소( C++98 에 명시 ) (0) | 2011.07.07 |
C++ 0x ( visual studio 2010 적용 ) (0) | 2011.06.17 |
CreateFile (0) | 2011.05.12 |
GetLastError() 활용 (0) | 2011.05.12 |