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

50
메모리 관리자로부터 배우기 - google tcmalloc을 분석해보자 - 온라인서버제작자모임 / 이욱진 @novice81, minjin00 at gmail.com 주체 : 온라인 서버 개발자 모임 후원 : 넷텐션

Upload: ongameserver

Post on 16-May-2015

7.365 views

Category:

Documents


4 download

TRANSCRIPT

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

메모리 관리자로부터 배우기

- google tcmalloc을 분석해보자 -

온라인서버제작자모임 / 이욱진

@novice81, minjin00 at gmail.com

주체 : 온라인 서버 개발자 모임 후원 : 넷텐션

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

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

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

만들려고 검색

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

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

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

사실 검색부터 하지는 않았어요..

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

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

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

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

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

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

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

STL 기반

이건 정말 옛날에 만들어봤어요..

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

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

STL 기반

Memory Manager

Memory Chunk

Memory Block

.

.

.

Memory Chunk

Memory Block

.

.

.

Memory Chunk

Memory Block

.

.

.

Memory Chunk

.

.

.

.

할당 요청

해제

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

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

STL 기반

• 고정길이 메모리 관리자

• queue / set / map 등을 이용

• 주요 Logic

– Chunk 내 Memory Block 존재 유무에 따라 Memory Block 반환

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

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

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

STL 기반 - 장점

• 구현하기 편함

– 고정길이여서 그럴 수도 있음

• Logic이 명확함

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

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

STL 기반 – 단점

• 느림

– 우와 new / delete 보다 훨씬 느려

– 내부적 할당 / 해제 (워낙 당연하니 생략)

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

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

FREE LIST 기반

이것도 검색 좀 해보고 만들었으면 더 좋았을걸..

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

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

Free List 기반

Memory Manager

Memory Chunk

Memory Block

.

.

.

Memory Chunk

Memory Block

.

.

.

Memory Chunk

Memory Block

.

.

.

Memory Chunk

.

.

.

.

할당 요청

해제

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

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

Free List 기반

• 고정길이 메모리 관리자

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

• 주요 Logic

– Memory Block 을 직접 구현한 list 로 관리

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

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

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

Free List 기반

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

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

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

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

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

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

Free List 기반 - 장점

• 빠름

– 내부적으로 할당도 안하고 하니 빠를 수밖에

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

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

Free List 기반 - 단점

• 구현하기 불편함

– List 를 직접 짜기도 하지만 가장 불편한건 포인터 연산!

*(pMem + m_i32AllocationSize + m_i32DataGuard) = pNext; if ( *(pMem + m_i32AllocationSize) == GuardMagicNum )

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

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

Free List 기반 - 단점

• 구현하기 불편함

– List 를 직접 짜기도 하지만 가장 불편한건 포인터 연산!

*(pMem + m_i32AllocationSize + m_i32DataGuard) = pNext; if ( *(pMem + m_i32AllocationSize) == GuardMagicNum )

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

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

Free List 기반 - 반성

• 포인터 연산이 많은 구조를 사용했다

다음

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

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

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

Free List 기반 - 반성

• 그지같이 포인터 연산이 많은 구조를 사용했다

다음

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

다음 Memory 주소

실제 사용자에게 return 되는 메모리 Guard

다음 Memory 주소

실제 사용자에게 return 되는 메모리 Guard 부가정보

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

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

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

이쯤해서 검색도 안하고 그냥 막 만드는건 그만 했어도 됐는데..

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

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

Free List 기반 (가변)

할당 요청

해제

Memory Manager

Memory Chunk - 32

Memory Block

.

.

.

Memory Chunk - 32

Memory Block

.

.

.

Memory Chunk - 32

Memory Block

.

.

.

Memory Chunk - 64

Memory Chunk - 128

Memory Chunk - 192

Memory Chunk - 256

Memory Chunk - 64

Memory Chunk - 128

Memory Chunk - 192

Memory Chunk - 256

Memory Chunk - 64

Memory Chunk - 128

Memory Chunk - 192

Memory Chunk - 256

Memory Chunk - N Memory Chunk - N Memory Chunk - N

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

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

Free List 기반 (가변)

• 가변길이 메모리 관리자

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

• 주요 Logic

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

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

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

Free List 기반 (가변)

• 준비된 Memory Chunk 의 구간이 성능과 공간 효율성을 결정

– 32 : 부가 정보와 pointer 저장

– 64 ~ 1024 : 작은 단위 Memory Block

– 1024 ~ N : 큰 단위 Memory Block

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

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

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

멀티코어 시대의 시작

속이려고 그런건 아니예요 이 전까지는 싱글스레드용으로 만들었어요

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

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

만들고 싶었던 것

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

멀티스레드용 메모리 관리자

tcmalloc

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

Page 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

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

다운로드

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

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

무얼 사용하지?

• google-perftools 폴더 하위의 vsprojects 폴더

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

• libtcmalloc_minimal 이 library임

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

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

Link 만으로 사용 가능

• libtcmalloc_minimal 프로젝트 포함 후 링크

• TCMallocGuard 에서 Window Function 을 Patch 해버림

• Kernel32 모듈의 new / delete 등의 메모리 관련 함수들 변경

– 참고 : patch_functions.cc / WindowsInfo::Patch()

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

Page 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

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

더 나은 성능을 위한 여러 처리

• 할당 요청 크기별 별도의 메모리 크기 사용

– 더 나은 성능과 더 적은 공간을 사용하기 위한 노력

– Size 별 Free List 가 별도로 존재, 작은 크기에서는 더 작은 단위로 분류 큰 단위에서는 좀더 큰 단위로 분류 (8, 16, 32, … bytes)

• 참고 : common.cc / SizeMap::Init

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

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

더 나은 성능을 위한 여러 처리

• 아주 큰 객체의 별도 처리

– 32Kb 이상의 큰 객체는 page 단위 (4Kb) 로 align 되어 처리

– 255 page 이상의 크기를 갖는 객체들은 256번째 entry 에 관리됨

• 참고 : tcmallo.cc / do_malloc, do_malloc_pages page_heap.cc / PageHeap::SearchFreeAndLargeLists

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

Page 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

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

그 외의 처리

• Thread Cache 에서의 Garbage Collection

– 메모리 해제시에만 처리

• 참고 : thread_cache.cc / ThreadCache::Scavenge

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

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

• 메모리 사용량 확인 가능 등등등…

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

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

배운 것

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

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

검색 해보고 만들자

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

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

범용 보다는 전용

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

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

가능하면 Caching 하자

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

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

결국은 설계

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

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

명품 (名品)은 자원을 아낀다

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

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

Q and A

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

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

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