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

Post on 16-May-2015

7.365 Views

Category:

Documents

4 Downloads

Preview:

Click to see full reader

TRANSCRIPT

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

- 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 Block

.

.

.

Memory Chunk

Memory Block

.

.

.

Memory Chunk

Memory Block

.

.

.

Memory Chunk

.

.

.

.

할당 요청

해제

제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 Block

.

.

.

Memory Chunk

Memory Block

.

.

.

Memory Chunk

Memory Block

.

.

.

Memory Chunk

.

.

.

.

할당 요청

해제

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

Free List 기반

• 고정길이 메모리 관리자

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

• 주요 Logic

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

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

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

Free List 기반

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

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

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

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

제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 기반 - 반성

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

다음

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

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

Free List 기반 - 반성

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

다음

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

다음 Memory 주소

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

다음 Memory 주소

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

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

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

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

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

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

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

top related