9. STL 기반
• 고정길이 메모리 관리자
• queue / set / map 등을 이용
• 주요 Logic
– Chunk 내 Memory Block 존재 유무에 따라 Memory Block 반환
– 반환할 Memory Block이 없으면 새로운 Chunk 확보 후
확보된 Chunk 에서 Memory Block 반환
제3회 온라인서버제작자모임 공개강연회 9
10. STL 기반 - 장점
• 구현하기 편함
– 고정길이여서 그럴 수도 있음
• Logic이 명확함
제3회 온라인서버제작자모임 공개강연회 10
11. STL 기반 – 단점
• 느림
– 우와 new / delete 보다 훨씬 느려
– 내부적 할당 / 해제 (워낙 당연하니 생략)
제3회 온라인서버제작자모임 공개강연회 11
12. 이것도 검색 좀 해보고 만들었으면 더 좋았을걸..
FREE LIST 기반
제3회 온라인서버제작자모임 공개강연회 12
14. Free List 기반
• 고정길이 메모리 관리자
• 직접 구현한 list (단방향) 으로 Free List 관리
• 주요 Logic
– Memory Block 을 직접 구현한 list 로 관리
– Memory Block 간 link 가 Memory Block 내부에 존재
제3회 온라인서버제작자모임 공개강연회 14
15. Free List 기반
다음
실제 사용자에게 return 되는 메모리 Guard Memory 주소
다음
실제 사용자에게 return 되는 메모리 Guard Memory 주소
다음
실제 사용자에게 return 되는 메모리 Guard Memory 주소
다음
실제 사용자에게 return 되는 메모리 Guard Memory 주소
제3회 온라인서버제작자모임 공개강연회 15
16. Free List 기반 - 장점
• 빠름
– 내부적으로 할당도 안하고 하니 빠를 수밖에
제3회 온라인서버제작자모임 공개강연회 16
17. Free List 기반 - 단점
• 구현하기 불편함
– List 를 직접 짜기도 하지만 가장 불편한건 포인터 연산!
*(pMem + m_i32AllocationSize + m_i32DataGuard) = pNext;
if ( *(pMem + m_i32AllocationSize) == GuardMagicNum )
제3회 온라인서버제작자모임 공개강연회 17
18. Free List 기반 - 단점
• 구현하기 불편함
– List 를 직접 짜기도 하지만 가장 불편한건 포인터 연산!
*(pMem + m_i32AllocationSize + m_i32DataGuard) = pNext;
if ( *(pMem + m_i32AllocationSize) == GuardMagicNum )
제3회 온라인서버제작자모임 공개강연회 18
19. Free List 기반 - 반성
• 포인터 연산이 많은 구조를 사용했다
다음
실제 사용자에게 return 되는 메모리 Guard Memory 주소
제3회 온라인서버제작자모임 공개강연회 19
20. Free List 기반 - 반성
• 그지같이 포인터 연산이 많은 구조를 사용했다
다음
실제 사용자에게 return 되는 메모리 Guard Memory 주소
다음
Memory 주소
실제 사용자에게 return 되는 메모리 Guard
다음
Memory 주소
부가정보 실제 사용자에게 return 되는 메모리 Guard
제3회 온라인서버제작자모임 공개강연회 20
21. 이쯤해서 검색도 안하고 그냥 막 만드는건 그만 했어도 됐는데..
FREE LIST 기반 가변 메모리 관리자
제3회 온라인서버제작자모임 공개강연회 21
23. Free List 기반 (가변)
• 가변길이 메모리 관리자
• 직접 구현한 고정길이 메모리 관리자의 확장판
• 주요 Logic
– 요청한 Memory Block Size 에 따라
그에 맞는 고정길이 Memory Chunk 에서 할당
제3회 온라인서버제작자모임 공개강연회 23
24. Free List 기반 (가변)
• 준비된 Memory Chunk 의 구간이 성능과 공간 효율성을 결정
– 32 : 부가 정보와 pointer 저장
– 64 ~ 1024 : 작은 단위 Memory Block
– 1024 ~ N : 큰 단위 Memory Block
• 실제 돌려보면서 Memory Block 의 사용 현황을 확인하고
최적의 크기로 맞추면 좋을 것 같음
제3회 온라인서버제작자모임 공개강연회 24
25. 속이려고 그런건 아니예요 이 전까지는 싱글스레드용으로 만들었어요
멀티코어 시대의 시작
제3회 온라인서버제작자모임 공개강연회 25
26. 만들고 싶 었던 것
막연히 Thread 가 많아져도 성능이 저하되지 않는 Heap을 만들고 싶었어요..
제3회 온라인서버제작자모임 공개강연회 26
34. tcmalloc
• Thread – Caching Malloc
by Sanjay Ghemawat
• http://gperftools.googlecode.com/svn/trunk/doc/tcmalloc.html
• http://research.google.com/people/sanjay/
• I have been working at Google since late 1999 on distributed systems, performance
tools, indexing systems, compression schemes, memory management, data
representation languages, RPC systems, and other systems infrastructure projects. I
graduated with a Ph.D. in Computer Science from MIT. Before joining Google, I was
a member of the research staff at DEC Systems Research Center in Palo Alto, CA.
제3회 온라인서버제작자모임 공개강연회 34
36. 무얼 사용하지?
• google-perftools 폴더 하위의
vsprojects 폴더
• 뭔가 상당히 많은데 대부분이 test project 임
• libtcmalloc_minimal 이 library임
제3회 온라인서버제작자모임 공개강연회 36
37. Link 만으로 사용 가능
• libtcmalloc_minimal 프로젝트 포함 후 링크
• TCMallocGuard 에서 Window Function 을 Patch 해버림
• Kernel32 모듈의 new / delete 등의 메모리 관련 함수들 변경
– 참고 : patch_functions.cc / WindowsInfo::Patch()
제3회 온라인서버제작자모임 공개강연회 37
38. Multi-thread 환경에서 좋은 성능
• Thread 단위 Cache 존재
• Thread Cache 에
할당할 여유가 없으면
Central Heap 에서 할당
– 참고 : thread_cache.h / ThreadCache::Allocate
• Central Heap 에서도 적절한 개수만큼 한번에 Fetch 해옴
max( 이미 준비된 개수, 32개 ) 만큼 – 개수 결정도 쉽게 하지 않음
– 참고 : common.cc / SizeMap::NumMoveSize
제3회 온라인서버제작자모임 공개강연회 38
39. 더 나은 성능을 위한 여러 처리
• 할당 요청 크기별 별도의 메모리 크기 사용
– 더 나은 성능과 더 적은 공간을 사용하기 위한 노력
– Size 별 Free List 가 별도로 존재, 작은 크기에서는 더 작은 단위로 분류
큰 단위에서는 좀더 큰 단위로 분류 (8, 16, 32, … bytes)
• 참고 : common.cc / SizeMap::Init
제3회 온라인서버제작자모임 공개강연회 39
40. 더 나은 성능을 위한 여러 처리
• 아주 큰 객체의 별도 처리
– 32Kb 이상의 큰 객체는 page 단위 (4Kb) 로 align 되어 처리
– 255 page 이상의 크기를 갖는 객체들은 256번째 entry 에 관리됨
• 참고 : tcmallo.cc / do_malloc, do_malloc_pages
page_heap.cc / PageHeap::SearchFreeAndLargeLists
제3회 온라인서버제작자모임 공개강연회 40
41. 더 나은 성능을 위한 여러 처리
• 할당이 아닌 해제시점의 고려
– 우선 Central Heap 에 해제하는데,
해제 시점에 작은 객체라고 판단되면 해당 Thread Cache 에 삽입
이때, Thread Cache가 미리 정해진 크기 이상이면 Garbage Collection 작동
• 참고 : tcmalloc.cc / do_free_with_callback
thread_cache.h / ThreadCache::Deallocate
– 큰 객체의 경우 span 정보를 통해 해당 객체를 담은 page 범위를 찾아
주변 span 과 합체하고 page heap의 해당 free list 에 등록
• 참고 : page_heap.cc / PageHeap::Delete
제3회 온라인서버제작자모임 공개강연회 41
42. 그 외의 처리
• Thread Cache 에서의 Garbage Collection
– 메모리 해제시에만 처리
• 참고 : thread_cache.cc / ThreadCache::Scavenge
• System 으로 주기적으로 메모리 반환
• 큰 메모리 할당에 대한 보고
• 메모리 사용량 확인 가능
등등등…
제3회 온라인서버제작자모임 공개강연회 42