이욱진님 - 메모리 관리자로부터 배우기

8,541 views

Published on

0 Comments
8 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
8,541
On SlideShare
0
From Embeds
0
Number of Embeds
5,317
Actions
Shares
0
Downloads
54
Comments
0
Likes
8
Embeds 0
No embeds

No notes for slide

이욱진님 - 메모리 관리자로부터 배우기

  1. 1. 메모리 관리자로부터 배우기 - google tcmalloc을 분석해보자 - 온라인서버제작자모임 / 이욱진 @novice81, minjin00 at gmail.com 주체 : 온라인 서버 개발자 모임 후원 : 넷텐션
  2. 2. 제3회 온라인서버제작자모임 공개강연회 2
  3. 3. 만들려고 검색이건 스샷을 위해 발표자료 만들 때 검색해본.. 제3회 온라인서버제작자모임 공개강연회 3
  4. 4. 사실 검색부터 하지는 않았어요.. 일단 그냥 처음부터 만들어보려고 했어요.. 제3회 온라인서버제작자모임 공개강연회 4
  5. 5. 제3회 온라인서버제작자모임 공개강연회 5
  6. 6. 제3회 온라인서버제작자모임 공개강연회 6
  7. 7. 이건 정말 옛날에 만들어봤어요..STL 기반 제3회 온라인서버제작자모임 공개강연회 7
  8. 8. STL 기반 Memory Manager Memory Chunk할당 요청 Memory Chunk Memory Block Chunk Memory 해제 . . Memory Block Chunk Memory . . . Memory Block . . . . . . . . 제3회 온라인서버제작자모임 공개강연회 8
  9. 9. STL 기반• 고정길이 메모리 관리자• queue / set / map 등을 이용• 주요 Logic – Chunk 내 Memory Block 존재 유무에 따라 Memory Block 반환 – 반환할 Memory Block이 없으면 새로운 Chunk 확보 후 확보된 Chunk 에서 Memory Block 반환 제3회 온라인서버제작자모임 공개강연회 9
  10. 10. STL 기반 - 장점• 구현하기 편함 – 고정길이여서 그럴 수도 있음• Logic이 명확함 제3회 온라인서버제작자모임 공개강연회 10
  11. 11. STL 기반 – 단점• 느림 – 우와 new / delete 보다 훨씬 느려 – 내부적 할당 / 해제 (워낙 당연하니 생략) 제3회 온라인서버제작자모임 공개강연회 11
  12. 12. 이것도 검색 좀 해보고 만들었으면 더 좋았을걸..FREE LIST 기반 제3회 온라인서버제작자모임 공개강연회 12
  13. 13. Free List 기반 Memory Manager Memory Chunk할당 요청 Memory Chunk Memory Block Chunk Memory 해제 . . Memory Block Chunk Memory . . . Memory Block . . . . . . . . 제3회 온라인서버제작자모임 공개강연회 13
  14. 14. Free List 기반• 고정길이 메모리 관리자• 직접 구현한 list (단방향) 으로 Free List 관리• 주요 Logic – Memory Block 을 직접 구현한 list 로 관리 – Memory Block 간 link 가 Memory Block 내부에 존재 제3회 온라인서버제작자모임 공개강연회 14
  15. 15. Free List 기반 다음실제 사용자에게 return 되는 메모리 Guard Memory 주소 다음실제 사용자에게 return 되는 메모리 Guard Memory 주소 다음실제 사용자에게 return 되는 메모리 Guard Memory 주소 다음실제 사용자에게 return 되는 메모리 Guard Memory 주소 제3회 온라인서버제작자모임 공개강연회 15
  16. 16. Free List 기반 - 장점• 빠름 – 내부적으로 할당도 안하고 하니 빠를 수밖에 제3회 온라인서버제작자모임 공개강연회 16
  17. 17. Free List 기반 - 단점• 구현하기 불편함 – List 를 직접 짜기도 하지만 가장 불편한건 포인터 연산! *(pMem + m_i32AllocationSize + m_i32DataGuard) = pNext; if ( *(pMem + m_i32AllocationSize) == GuardMagicNum ) 제3회 온라인서버제작자모임 공개강연회 17
  18. 18. Free List 기반 - 단점• 구현하기 불편함 – List 를 직접 짜기도 하지만 가장 불편한건 포인터 연산! *(pMem + m_i32AllocationSize + m_i32DataGuard) = pNext; if ( *(pMem + m_i32AllocationSize) == GuardMagicNum ) 제3회 온라인서버제작자모임 공개강연회 18
  19. 19. Free List 기반 - 반성• 포인터 연산이 많은 구조를 사용했다 다음 실제 사용자에게 return 되는 메모리 Guard Memory 주소 제3회 온라인서버제작자모임 공개강연회 19
  20. 20. Free List 기반 - 반성• 그지같이 포인터 연산이 많은 구조를 사용했다 다음 실제 사용자에게 return 되는 메모리 Guard Memory 주소 다음 Memory 주소 실제 사용자에게 return 되는 메모리 Guard 다음 Memory 주소 부가정보 실제 사용자에게 return 되는 메모리 Guard 제3회 온라인서버제작자모임 공개강연회 20
  21. 21. 이쯤해서 검색도 안하고 그냥 막 만드는건 그만 했어도 됐는데..FREE LIST 기반 가변 메모리 관리자 제3회 온라인서버제작자모임 공개강연회 21
  22. 22. Free List 기반 (가변) Memory Manager Memory Chunk - 32할당 요청 Memory Chunk --64 Memory Chunk -64 Memory Chunk 64 Memory Block Memory Chunk - 32 . Memory Chunk --128 Memory Chunk -128 Memory Chunk 128 해제 Memory Block . Memory Chunk - 32 . . Memory Block Memory Chunk --192 Memory Chunk -192 Memory Chunk 192 . . . Memory Chunk --256 Memory Chunk -256 Memory Chunk 256 . . Memory Chunk --N Memory Chunk -N Memory Chunk N 제3회 온라인서버제작자모임 공개강연회 22
  23. 23. Free List 기반 (가변)• 가변길이 메모리 관리자• 직접 구현한 고정길이 메모리 관리자의 확장판• 주요 Logic – 요청한 Memory Block Size 에 따라 그에 맞는 고정길이 Memory Chunk 에서 할당 제3회 온라인서버제작자모임 공개강연회 23
  24. 24. Free List 기반 (가변)• 준비된 Memory Chunk 의 구간이 성능과 공간 효율성을 결정 – 32 : 부가 정보와 pointer 저장 – 64 ~ 1024 : 작은 단위 Memory Block – 1024 ~ N : 큰 단위 Memory Block• 실제 돌려보면서 Memory Block 의 사용 현황을 확인하고 최적의 크기로 맞추면 좋을 것 같음 제3회 온라인서버제작자모임 공개강연회 24
  25. 25. 속이려고 그런건 아니예요 이 전까지는 싱글스레드용으로 만들었어요멀티코어 시대의 시작 제3회 온라인서버제작자모임 공개강연회 25
  26. 26. 만들고 싶 었던 것막연히 Thread 가 많아져도 성능이 저하되지 않는 Heap을 만들고 싶었어요.. 제3회 온라인서버제작자모임 공개강연회 26
  27. 27. 제3회 온라인서버제작자모임 공개강연회 27
  28. 28. 제3회 온라인서버제작자모임 공개강연회 28
  29. 29. 제3회 온라인서버제작자모임 공개강연회 29
  30. 30. 제3회 온라인서버제작자모임 공개강연회 30
  31. 31. 제3회 온라인서버제작자모임 공개강연회 31
  32. 32. 제3회 온라인서버제작자모임 공개강연회 32
  33. 33. 멀티스레드용 메모리 관리자 tcmalloc 제3회 온라인서버제작자모임 공개강연회 33
  34. 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
  35. 35. 다운로드제3회 온라인서버제작자모임 공개강연회 35
  36. 36. 무얼 사용하지?• google-perftools 폴더 하위의 vsprojects 폴더• 뭔가 상당히 많은데 대부분이 test project 임• libtcmalloc_minimal 이 library임 제3회 온라인서버제작자모임 공개강연회 36
  37. 37. Link 만으로 사용 가능• libtcmalloc_minimal 프로젝트 포함 후 링크• TCMallocGuard 에서 Window Function 을 Patch 해버림• Kernel32 모듈의 new / delete 등의 메모리 관련 함수들 변경 – 참고 : patch_functions.cc / WindowsInfo::Patch() 제3회 온라인서버제작자모임 공개강연회 37
  38. 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. 39. 더 나은 성능을 위한 여러 처리• 할당 요청 크기별 별도의 메모리 크기 사용 – 더 나은 성능과 더 적은 공간을 사용하기 위한 노력 – Size 별 Free List 가 별도로 존재, 작은 크기에서는 더 작은 단위로 분류 큰 단위에서는 좀더 큰 단위로 분류 (8, 16, 32, … bytes) • 참고 : common.cc / SizeMap::Init 제3회 온라인서버제작자모임 공개강연회 39
  40. 40. 더 나은 성능을 위한 여러 처리• 아주 큰 객체의 별도 처리 – 32Kb 이상의 큰 객체는 page 단위 (4Kb) 로 align 되어 처리 – 255 page 이상의 크기를 갖는 객체들은 256번째 entry 에 관리됨 • 참고 : tcmallo.cc / do_malloc, do_malloc_pages page_heap.cc / PageHeap::SearchFreeAndLargeLists 제3회 온라인서버제작자모임 공개강연회 40
  41. 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. 42. 그 외의 처리• Thread Cache 에서의 Garbage Collection – 메모리 해제시에만 처리 • 참고 : thread_cache.cc / ThreadCache::Scavenge• System 으로 주기적으로 메모리 반환• 큰 메모리 할당에 대한 보고• 메모리 사용량 확인 가능 등등등… 제3회 온라인서버제작자모임 공개강연회 42
  43. 43. 배운 것제3회 온라인서버제작자모임 공개강연회 43
  44. 44. 검색 해보고 만들자 제3회 온라인서버제작자모임 공개강연회 44
  45. 45. 범용 보다는 전용 제3회 온라인서버제작자모임 공개강연회 45
  46. 46. 가능하면 Caching 하자 제3회 온라인서버제작자모임 공개강연회 46
  47. 47. 결국은 설계 제3회 온라인서버제작자모임 공개강연회 47
  48. 48. 명품 (名品)은자원을 아낀다 제3회 온라인서버제작자모임 공개강연회 48
  49. 49. Q and A제3회 온라인서버제작자모임 공개강연회 49
  50. 50. 제3회 온라인서버제작자모임 공개강연회 50

×