SlideShare a Scribd company logo
1 of 50
Download to read offline
메모리 관리자로부터 배우기
   - google tcmalloc을 분석해보자 -

    온라인서버제작자모임 / 이욱진
  @novice81, minjin00 at gmail.com



                       주체 : 온라인 서버 개발자 모임
                       후원 : 넷텐션
제3회 온라인서버제작자모임 공개강연회   2
만들려고 검색




이건 스샷을 위해 발표자료 만들 때 검색해본..

                   제3회 온라인서버제작자모임 공개강연회   3
사실 검색부터 하지는 않았어요..




   일단 그냥 처음부터 만들어보려고 했어요..




         제3회 온라인서버제작자모임 공개강연회   4
제3회 온라인서버제작자모임 공개강연회   5
제3회 온라인서버제작자모임 공개강연회   6
이건 정말 옛날에 만들어봤어요..

STL 기반


              제3회 온라인서버제작자모임 공개강연회   7
STL 기반

                    Memory Manager

         Memory Chunk
할당 요청                                Memory Chunk
          Memory Block Chunk
             Memory

 해제
               .                          .
               Memory Block Chunk
                  Memory
               .
                    .
               .    Memory Block          .
                    .
                         .
                    .                     .
                         .
                         .
                                          .




        제3회 온라인서버제작자모임 공개강연회                        8
STL 기반
• 고정길이 메모리 관리자

• queue / set / map 등을 이용

• 주요 Logic
   – Chunk 내 Memory Block 존재 유무에 따라 Memory Block 반환

   – 반환할 Memory Block이 없으면 새로운 Chunk 확보 후
     확보된 Chunk 에서 Memory Block 반환




                     제3회 온라인서버제작자모임 공개강연회             9
STL 기반 - 장점
• 구현하기 편함
  – 고정길이여서 그럴 수도 있음


• Logic이 명확함




                 제3회 온라인서버제작자모임 공개강연회   10
STL 기반 – 단점
• 느림
  – 우와 new / delete 보다 훨씬 느려
  – 내부적 할당 / 해제 (워낙 당연하니 생략)




                  제3회 온라인서버제작자모임 공개강연회   11
이것도 검색 좀 해보고 만들었으면 더 좋았을걸..

FREE LIST 기반


               제3회 온라인서버제작자모임 공개강연회   12
Free List 기반

                      Memory Manager

           Memory Chunk
할당 요청                                  Memory Chunk
            Memory Block Chunk
               Memory

 해제
                 .                          .
                 Memory Block Chunk
                    Memory
                 .
                      .
                 .    Memory Block          .
                      .
                           .
                      .                     .
                           .
                           .
                                            .




          제3회 온라인서버제작자모임 공개강연회                        13
Free List 기반
• 고정길이 메모리 관리자

• 직접 구현한 list (단방향) 으로 Free List 관리

• 주요 Logic
   – Memory Block 을 직접 구현한 list 로 관리

   – Memory Block 간 link 가 Memory Block 내부에 존재




                       제3회 온라인서버제작자모임 공개강연회      14
Free List 기반

                                              다음
실제 사용자에게 return 되는 메모리             Guard   Memory 주소



                                              다음
실제 사용자에게 return 되는 메모리             Guard   Memory 주소



                                              다음
실제 사용자에게 return 되는 메모리             Guard   Memory 주소



                                              다음
실제 사용자에게 return 되는 메모리             Guard   Memory 주소




            제3회 온라인서버제작자모임 공개강연회                       15
Free List 기반 - 장점
• 빠름
  – 내부적으로 할당도 안하고 하니 빠를 수밖에




                제3회 온라인서버제작자모임 공개강연회   16
Free List 기반 - 단점
• 구현하기 불편함
  – List 를 직접 짜기도 하지만 가장 불편한건 포인터 연산!



     *(pMem + m_i32AllocationSize + m_i32DataGuard) = pNext;

     if ( *(pMem + m_i32AllocationSize) == GuardMagicNum )




                         제3회 온라인서버제작자모임 공개강연회                  17
Free List 기반 - 단점
• 구현하기 불편함
  – List 를 직접 짜기도 하지만 가장 불편한건 포인터 연산!



     *(pMem + m_i32AllocationSize + m_i32DataGuard) = pNext;

     if ( *(pMem + m_i32AllocationSize) == GuardMagicNum )




                         제3회 온라인서버제작자모임 공개강연회                  18
Free List 기반 - 반성
• 포인터 연산이 많은 구조를 사용했다


                                                   다음
     실제 사용자에게 return 되는 메모리             Guard   Memory 주소




                 제3회 온라인서버제작자모임 공개강연회                       19
Free List 기반 - 반성
•   그지같이 포인터 연산이 많은 구조를 사용했다


                                                          다음
       실제 사용자에게 return 되는 메모리                  Guard   Memory 주소




        다음
     Memory 주소
                    실제 사용자에게 return 되는 메모리                 Guard



        다음
     Memory 주소
                 부가정보        실제 사용자에게 return 되는 메모리        Guard


                        제3회 온라인서버제작자모임 공개강연회                       20
이쯤해서 검색도 안하고 그냥 막 만드는건 그만 했어도 됐는데..

FREE LIST 기반 가변 메모리 관리자


              제3회 온라인서버제작자모임 공개강연회    21
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
Free List 기반 (가변)
• 가변길이 메모리 관리자

• 직접 구현한 고정길이 메모리 관리자의 확장판

• 주요 Logic
   – 요청한 Memory Block Size 에 따라
     그에 맞는 고정길이 Memory Chunk 에서 할당




                   제3회 온라인서버제작자모임 공개강연회   23
Free List 기반 (가변)
• 준비된 Memory Chunk 의 구간이 성능과 공간 효율성을 결정
  – 32 : 부가 정보와 pointer 저장
  – 64 ~ 1024 : 작은 단위 Memory Block
  – 1024 ~ N : 큰 단위 Memory Block


• 실제 돌려보면서 Memory Block 의 사용 현황을 확인하고
  최적의 크기로 맞추면 좋을 것 같음




                      제3회 온라인서버제작자모임 공개강연회   24
속이려고 그런건 아니예요 이 전까지는 싱글스레드용으로 만들었어요

멀티코어 시대의 시작


             제3회 온라인서버제작자모임 공개강연회     25
만들고 싶      었던               것




막연히 Thread 가 많아져도 성능이 저하되지 않는 Heap을 만들고 싶었어요..




                제3회 온라인서버제작자모임 공개강연회             26
제3회 온라인서버제작자모임 공개강연회   27
제3회 온라인서버제작자모임 공개강연회   28
제3회 온라인서버제작자모임 공개강연회   29
제3회 온라인서버제작자모임 공개강연회   30
제3회 온라인서버제작자모임 공개강연회   31
제3회 온라인서버제작자모임 공개강연회   32
멀티스레드용 메모리 관리자


   tcmalloc



    제3회 온라인서버제작자모임 공개강연회   33
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
다운로드




제3회 온라인서버제작자모임 공개강연회   35
무얼 사용하지?
• google-perftools 폴더 하위의
  vsprojects 폴더

• 뭔가 상당히 많은데 대부분이 test project 임

• libtcmalloc_minimal 이 library임




                        제3회 온라인서버제작자모임 공개강연회   36
Link 만으로 사용 가능
• libtcmalloc_minimal 프로젝트 포함 후 링크

• TCMallocGuard 에서 Window Function 을 Patch 해버림

• Kernel32 모듈의 new / delete 등의 메모리 관련 함수들 변경
   – 참고 : patch_functions.cc / WindowsInfo::Patch()




                          제3회 온라인서버제작자모임 공개강연회        37
Multi-thread 환경에서 좋은 성능
• Thread 단위 Cache 존재

• Thread Cache 에
  할당할 여유가 없으면
  Central Heap 에서 할당
   – 참고 : thread_cache.h / ThreadCache::Allocate


• Central Heap 에서도 적절한 개수만큼 한번에 Fetch 해옴
  max( 이미 준비된 개수, 32개 ) 만큼 – 개수 결정도 쉽게 하지 않음
   – 참고 : common.cc / SizeMap::NumMoveSize




                         제3회 온라인서버제작자모임 공개강연회      38
더 나은 성능을 위한 여러 처리
• 할당 요청 크기별 별도의 메모리 크기 사용
  – 더 나은 성능과 더 적은 공간을 사용하기 위한 노력
  – Size 별 Free List 가 별도로 존재, 작은 크기에서는 더 작은 단위로 분류
    큰 단위에서는 좀더 큰 단위로 분류 (8, 16, 32, … bytes)
     • 참고 : common.cc / SizeMap::Init




                         제3회 온라인서버제작자모임 공개강연회         39
더 나은 성능을 위한 여러 처리
• 아주 큰 객체의 별도 처리
  – 32Kb 이상의 큰 객체는 page 단위 (4Kb) 로 align 되어 처리
  – 255 page 이상의 크기를 갖는 객체들은 256번째 entry 에 관리됨
     • 참고 : tcmallo.cc / do_malloc, do_malloc_pages
       page_heap.cc / PageHeap::SearchFreeAndLargeLists




                         제3회 온라인서버제작자모임 공개강연회             40
더 나은 성능을 위한 여러 처리
• 할당이 아닌 해제시점의 고려
  – 우선 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
그 외의 처리
• Thread Cache 에서의 Garbage Collection
   – 메모리 해제시에만 처리
      • 참고 : thread_cache.cc / ThreadCache::Scavenge


• System 으로 주기적으로 메모리 반환

• 큰 메모리 할당에 대한 보고

• 메모리 사용량 확인 가능

  등등등…




                          제3회 온라인서버제작자모임 공개강연회         42
배운 것



제3회 온라인서버제작자모임 공개강연회   43
검색 해보고 만들자



   제3회 온라인서버제작자모임 공개강연회   44
범용 보다는 전용



  제3회 온라인서버제작자모임 공개강연회   45
가능하면 Caching 하자



     제3회 온라인서버제작자모임 공개강연회   46
결국은 설계



 제3회 온라인서버제작자모임 공개강연회   47
명품 (名品)은
자원을 아낀다


 제3회 온라인서버제작자모임 공개강연회   48
Q and A



제3회 온라인서버제작자모임 공개강연회   49
제3회 온라인서버제작자모임 공개강연회   50

More Related Content

Viewers also liked

SDC 3rd 최흥배님 - Boost.multi_index 사용하기
SDC 3rd 최흥배님 - Boost.multi_index 사용하기SDC 3rd 최흥배님 - Boost.multi_index 사용하기
SDC 3rd 최흥배님 - Boost.multi_index 사용하기OnGameServer
 
Microsoft SharePoint를 활용한 개발환경 구축
Microsoft SharePoint를 활용한 개발환경 구축Microsoft SharePoint를 활용한 개발환경 구축
Microsoft SharePoint를 활용한 개발환경 구축OnGameServer
 
해외 취업 이야기
해외 취업 이야기해외 취업 이야기
해외 취업 이야기OnGameServer
 
Multi thread game server
Multi thread game serverMulti thread game server
Multi thread game serverOnGameServer
 
IPv6 이론과 소켓 프로그래밍
IPv6 이론과 소켓 프로그래밍IPv6 이론과 소켓 프로그래밍
IPv6 이론과 소켓 프로그래밍OnGameServer
 
초보자를 위한 분산 캐시 이야기
초보자를 위한 분산 캐시 이야기초보자를 위한 분산 캐시 이야기
초보자를 위한 분산 캐시 이야기OnGameServer
 
Mongo db 시작하기
Mongo db 시작하기Mongo db 시작하기
Mongo db 시작하기OnGameServer
 
임영기님 - 코드 리뷰 시스템 도입하기
임영기님 - 코드 리뷰 시스템 도입하기임영기님 - 코드 리뷰 시스템 도입하기
임영기님 - 코드 리뷰 시스템 도입하기OnGameServer
 
20150305 스마트한 데이터모델링 with ER/Studio
20150305 스마트한 데이터모델링 with ER/Studio20150305 스마트한 데이터모델링 with ER/Studio
20150305 스마트한 데이터모델링 with ER/StudioDevgear
 
[C++ lab] 10. 메모리 누수 체크
[C++ lab] 10. 메모리 누수 체크[C++ lab] 10. 메모리 누수 체크
[C++ lab] 10. 메모리 누수 체크MinGeun Park
 
[Sdc 3rd] Boost multi_index
[Sdc 3rd] Boost multi_index[Sdc 3rd] Boost multi_index
[Sdc 3rd] Boost multi_index흥배 최
 
왜 애플리케이션이 Hang 되어도 OS는 괜찮을까?
왜 애플리케이션이 Hang 되어도 OS는 괜찮을까?왜 애플리케이션이 Hang 되어도 OS는 괜찮을까?
왜 애플리케이션이 Hang 되어도 OS는 괜찮을까?흥배 최
 
Twitter에 있어서 대규모 시스템 구성, 3개의 원칙과 시스템
Twitter에 있어서 대규모 시스템 구성, 3개의 원칙과 시스템Twitter에 있어서 대규모 시스템 구성, 3개의 원칙과 시스템
Twitter에 있어서 대규모 시스템 구성, 3개의 원칙과 시스템흥배 최
 
Facebook이 대규모 확장성 도전에서 배운 것
Facebook이 대규모 확장성 도전에서 배운 것Facebook이 대규모 확장성 도전에서 배운 것
Facebook이 대규모 확장성 도전에서 배운 것흥배 최
 
프로그래머가 몰랐던 멀티코어 CPU 이야기 - 15, 16장
프로그래머가 몰랐던 멀티코어  CPU 이야기 - 15, 16장프로그래머가 몰랐던 멀티코어  CPU 이야기 - 15, 16장
프로그래머가 몰랐던 멀티코어 CPU 이야기 - 15, 16장JangHyuk You
 
XML, NoSQL, 빅데이터, 클라우드로 옮겨가는 시장 상황 속, 데이터모델링 여전히 중요한가
XML, NoSQL, 빅데이터, 클라우드로 옮겨가는 시장 상황 속, 데이터모델링 여전히 중요한가XML, NoSQL, 빅데이터, 클라우드로 옮겨가는 시장 상황 속, 데이터모델링 여전히 중요한가
XML, NoSQL, 빅데이터, 클라우드로 옮겨가는 시장 상황 속, 데이터모델링 여전히 중요한가Devgear
 
노후 서버 교체 필요성
노후 서버 교체 필요성노후 서버 교체 필요성
노후 서버 교체 필요성YeonJi Yoon
 
V05 254491 sms시스템
V05 254491 sms시스템V05 254491 sms시스템
V05 254491 sms시스템Charlie Lee
 
1 mysql아키텍쳐 v1
1 mysql아키텍쳐 v11 mysql아키텍쳐 v1
1 mysql아키텍쳐 v1resoliwan
 
06_게임엔진구성
06_게임엔진구성06_게임엔진구성
06_게임엔진구성noerror
 

Viewers also liked (20)

SDC 3rd 최흥배님 - Boost.multi_index 사용하기
SDC 3rd 최흥배님 - Boost.multi_index 사용하기SDC 3rd 최흥배님 - Boost.multi_index 사용하기
SDC 3rd 최흥배님 - Boost.multi_index 사용하기
 
Microsoft SharePoint를 활용한 개발환경 구축
Microsoft SharePoint를 활용한 개발환경 구축Microsoft SharePoint를 활용한 개발환경 구축
Microsoft SharePoint를 활용한 개발환경 구축
 
해외 취업 이야기
해외 취업 이야기해외 취업 이야기
해외 취업 이야기
 
Multi thread game server
Multi thread game serverMulti thread game server
Multi thread game server
 
IPv6 이론과 소켓 프로그래밍
IPv6 이론과 소켓 프로그래밍IPv6 이론과 소켓 프로그래밍
IPv6 이론과 소켓 프로그래밍
 
초보자를 위한 분산 캐시 이야기
초보자를 위한 분산 캐시 이야기초보자를 위한 분산 캐시 이야기
초보자를 위한 분산 캐시 이야기
 
Mongo db 시작하기
Mongo db 시작하기Mongo db 시작하기
Mongo db 시작하기
 
임영기님 - 코드 리뷰 시스템 도입하기
임영기님 - 코드 리뷰 시스템 도입하기임영기님 - 코드 리뷰 시스템 도입하기
임영기님 - 코드 리뷰 시스템 도입하기
 
20150305 스마트한 데이터모델링 with ER/Studio
20150305 스마트한 데이터모델링 with ER/Studio20150305 스마트한 데이터모델링 with ER/Studio
20150305 스마트한 데이터모델링 with ER/Studio
 
[C++ lab] 10. 메모리 누수 체크
[C++ lab] 10. 메모리 누수 체크[C++ lab] 10. 메모리 누수 체크
[C++ lab] 10. 메모리 누수 체크
 
[Sdc 3rd] Boost multi_index
[Sdc 3rd] Boost multi_index[Sdc 3rd] Boost multi_index
[Sdc 3rd] Boost multi_index
 
왜 애플리케이션이 Hang 되어도 OS는 괜찮을까?
왜 애플리케이션이 Hang 되어도 OS는 괜찮을까?왜 애플리케이션이 Hang 되어도 OS는 괜찮을까?
왜 애플리케이션이 Hang 되어도 OS는 괜찮을까?
 
Twitter에 있어서 대규모 시스템 구성, 3개의 원칙과 시스템
Twitter에 있어서 대규모 시스템 구성, 3개의 원칙과 시스템Twitter에 있어서 대규모 시스템 구성, 3개의 원칙과 시스템
Twitter에 있어서 대규모 시스템 구성, 3개의 원칙과 시스템
 
Facebook이 대규모 확장성 도전에서 배운 것
Facebook이 대규모 확장성 도전에서 배운 것Facebook이 대규모 확장성 도전에서 배운 것
Facebook이 대규모 확장성 도전에서 배운 것
 
프로그래머가 몰랐던 멀티코어 CPU 이야기 - 15, 16장
프로그래머가 몰랐던 멀티코어  CPU 이야기 - 15, 16장프로그래머가 몰랐던 멀티코어  CPU 이야기 - 15, 16장
프로그래머가 몰랐던 멀티코어 CPU 이야기 - 15, 16장
 
XML, NoSQL, 빅데이터, 클라우드로 옮겨가는 시장 상황 속, 데이터모델링 여전히 중요한가
XML, NoSQL, 빅데이터, 클라우드로 옮겨가는 시장 상황 속, 데이터모델링 여전히 중요한가XML, NoSQL, 빅데이터, 클라우드로 옮겨가는 시장 상황 속, 데이터모델링 여전히 중요한가
XML, NoSQL, 빅데이터, 클라우드로 옮겨가는 시장 상황 속, 데이터모델링 여전히 중요한가
 
노후 서버 교체 필요성
노후 서버 교체 필요성노후 서버 교체 필요성
노후 서버 교체 필요성
 
V05 254491 sms시스템
V05 254491 sms시스템V05 254491 sms시스템
V05 254491 sms시스템
 
1 mysql아키텍쳐 v1
1 mysql아키텍쳐 v11 mysql아키텍쳐 v1
1 mysql아키텍쳐 v1
 
06_게임엔진구성
06_게임엔진구성06_게임엔진구성
06_게임엔진구성
 

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

  • 1. 메모리 관리자로부터 배우기 - google tcmalloc을 분석해보자 - 온라인서버제작자모임 / 이욱진 @novice81, minjin00 at gmail.com 주체 : 온라인 서버 개발자 모임 후원 : 넷텐션
  • 3. 만들려고 검색 이건 스샷을 위해 발표자료 만들 때 검색해본.. 제3회 온라인서버제작자모임 공개강연회 3
  • 4. 사실 검색부터 하지는 않았어요.. 일단 그냥 처음부터 만들어보려고 했어요.. 제3회 온라인서버제작자모임 공개강연회 4
  • 7. 이건 정말 옛날에 만들어봤어요.. STL 기반 제3회 온라인서버제작자모임 공개강연회 7
  • 8. STL 기반 Memory Manager Memory Chunk 할당 요청 Memory Chunk Memory Block Chunk Memory 해제 . . Memory Block Chunk Memory . . . Memory Block . . . . . . . . 제3회 온라인서버제작자모임 공개강연회 8
  • 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
  • 13. Free List 기반 Memory Manager Memory Chunk 할당 요청 Memory Chunk Memory Block Chunk Memory 해제 . . Memory Block Chunk Memory . . . Memory Block . . . . . . . . 제3회 온라인서버제작자모임 공개강연회 13
  • 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
  • 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. 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
  • 33. 멀티스레드용 메모리 관리자 tcmalloc 제3회 온라인서버제작자모임 공개강연회 33
  • 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
  • 44. 검색 해보고 만들자 제3회 온라인서버제작자모임 공개강연회 44
  • 45. 범용 보다는 전용 제3회 온라인서버제작자모임 공개강연회 45
  • 46. 가능하면 Caching 하자 제3회 온라인서버제작자모임 공개강연회 46
  • 47. 결국은 설계 제3회 온라인서버제작자모임 공개강연회 47
  • 48. 명품 (名品)은 자원을 아낀다 제3회 온라인서버제작자모임 공개강연회 48
  • 49. Q and A 제3회 온라인서버제작자모임 공개강연회 49