8. 때는 바야흐로 마비노기 10주년
흔한
마비노기
유저
15살
중학교 3학년
프로그래머 타이틀을
획득하셨습니다.
25
세
1. 중학생 때 즐기던 게임을 서비스 한다는 것
9. 입사 전 예상 했던 것
왔구나 애송이..
xx년차 개발자
1. 중학생 때 즐기던 게임을 서비스 한다는 것
10. 입사 후 놀랐던 것
• 젊은 사우분들(!)
• 체계적인 신입 교육 프로세스
• 지속적인 개발 환경 개선
• 개방적인 개발 문화
1. 중학생 때 즐기던 게임을 서비스 한다는 것
11. 입사 후 첫 위기
• 신규 던전 투입 후
메모리 부족(Out of Memory) 클라이언트 크래시
제가
고쳐보겠습니다!!
* 개방적인 개발 문화
1. 중학생 때 즐기던 게임을 서비스 한다는 것
12. 사막에서 바늘 찾기
• 14년 서비스의 유산 : 압도적인 코드량
1. 중학생 때 즐기던 게임을 서비스 한다는 것
13. 사막에서 바늘을 찾는 법 1
• 대상에 대한 정확한 이해
1. 중학생 때 즐기던 게임을 서비스 한다는 것
14. 대상에 대한 이해가 부족할 경우
• “RAM은 충분한데 왜 std::bad_alloc이 나지..?”
• “내 컴퓨터에서는 크래시 안나는데?”
• “유저 분 컴퓨터가 안 좋아서 그런가 보다.”
1. 중학생 때 즐기던 게임을 서비스 한다는 것
15. 사막에서 바늘을 찾는 법 2
• 적절한 도구 사용
1. 중학생 때 즐기던 게임을 서비스 한다는 것
16. 적절한 도구를 찾지 못했을 경우
• “이 함수가 의심스럽네!
사용하는 부분을 찾아봐야 겠다.”
• “이번 주에 투입된 코드 변경점들을 모두 리뷰 해보자!”
* [사도 제바흐]에서 특정 스킬 사용 시 제바흐의 스킬이 비정상적으로 작동하던 문제가 수정됩니다.
* [사도 제바흐] 어려움 난이도에 [전이의 카탈리스트]가 보상으로 추가됩니다.
* [사도 제바흐] 어려움 난이도의 신성 경험치 보상과 하루 획득 가능한 신성 경험치가 증가합니다.
* 아발론 필드 레이드, 아발론 정화 미션, 사도 하시딤 레이드에서 획득할 수 있는 일부 보상 아이템을 분해하여
신성한 광물 조각을 획득할 수 있습니다.
• 필드 레이드 진행 중, 펫을 부활시켜 공헌도를 얻을 수 있던 문제가 수정됩니다.
* 아발론 필드 레이드 보상 지급 조건이 조정됩니다.
* [유니콘과 함께 아발론을 누빈] 타이틀이 추가됩니다.
* 아발론 전 지역의 문게이트가 스마트 콘텐츠에 추가됩니다.
* 아발론 경계지에서 [변이된 곰], [변이된 늑대], [변이된 멧돼지] 공격 시, 몬스터가 다운되지 않던 문제가 수정됩니다.
* [디바인 신시엘라크 L2]의 특별 개조 이펙트가 출력되지 않던 문제가 수정됩니다.
* 스킬, 퀘스트의 드래곤 관련 항목이 실반 드래곤에게 적용되지 않던 문제가 수정됩니다.
* [아켈론 크라우칭] 스킬을 사용한 상태에서 아켈론이 연속으로 공격당할 때 체력이 감소하는 것처럼 보이던 문제가 수정됩니다.
* [이네스]의 [해안 정화에 대해] 키워드에 설명이 추가됩니다.
* [아발론 해안 정화] 미션에 미션 설명이 추가됩니다.
변신 메달 교환권으로 교환할 수 있는 변신 메달 종류가 추가됩니다.
* 낭만 농장 안에서 스마트 콘텐츠로 이동하면 동물 캐릭터에 탑승한 다른 캐릭터도 함께 이동되던 문제가 수정됩니다.
* 낭만 농장에 진입 시 간헐적으로 클라이언트가 종료되던 문제가 수정됩니다.
* 드레스룸을 열고 하우징 방 문을 클릭하면 간헐적으로 클라이언트가 종료되던 문제가 수정됩니다.
* 캠프파이어 스킬을 배우지 않은 상태로 모닥불에 향초를 태우면 클라이언트가 종료되던 문제가 수정됩니다.
* 평판 보상으로 중첩된 비정상적인 능력치가 원래의 능력치로 돌아옵니다.
* 엘프 캐릭터가 문라이트 낭만 비행 사용 시, 일부 이펙트가 나오지 않던 문제가 수정됩니다.
* 엘프 캐릭터로 동성 캐릭터와 [문라이트 낭만 비행] 함께 날기를 하면 한 캐릭터가 땅에 묻혀 보이던 문제가 수정됩니다.
* 낭만 비행 액션 사용 중 함께 날기 요청을 받은 캐릭터가 전투모드로 전환했을 때 모션이 어색해 보이던 문제가 수정됩니다.
* 두근두근 아일랜드 천 염색 시 마우스 커서 모양이 변경됩니다.
* 두근두근 아일랜드 해안가의 일부 지형이 비정상적으로 보이던 문제가 수정됩니다.
* 일요일에 마법 악보를 연주하면 항상 성공하던 문제가 수정됩니다.
* 자동 생산 시도 중 장비 스왑으로 생산이 불가능할 경우에도 자동 생산이 지속되던 문제가 수정됩니다.
* 길드전 승리 보상인 [순간이동 책(던바튼)], [순간이동 책(티르 코네일)] 아이템이 만료 후에도 사용할 수 있던 문제가 수정됩니다.
* 자이언트 캐릭터로 [별의 상흔] 퀘스트 진행 중 NPC의 모션이 잘못 출력되던 문제가 수정됩니다.
* [폐허의 갈까마귀] 퀘스트 완료 후 [무대 밖의 손] 퀘스트를 습득하기 전, 기사단 NPC들이 곳곳에 배치되도록 수정됩니다.
* [수호자의 길] 퀘스트 중, 이신화 하지 않고 NPC와 대화 시 포트레이트가 나오지 않던 문제가 수정됩니다.
* [씨줄과 날줄] 퀘스트 정보에서 아벨린 포트레이트가 단발이 아니던 문제가 수정됩니다.
* [새로운 신성] 퀘스트 중, 멀린 대사의 오탈자가 수정됩니다.
* 아발론 게이트 BGM이 안나오던 문제가 수정됩니다.
* 퀘스트 진행 중, 성소 날씨가 변경되던 문제가 수정됩니다.
* 일부 컷신에서 자이언트 캐릭터의 이름이 출력되지 않던 문제가 수정됩니다.
* G21 메인스트림 1부 일부 대사에서 NPC 알터의 표정이 어색하던 문제가 수정됩니다.
* 이신화 상태에서 간헐적으로 [루인 오브 노바]를 사용해도 변신 쿨타임이 동작하지 않던 문제가 수정됩니다.
* 이신화 변신 중 승단 미션 진입 시 이신화 변신이 해제되도록 수정됩니다.
* 이신화 변신 중 특별조[부상 치료] 미션 진입 시 이신화 변신이 해제되도록 수정됩니다.
* 마법의 장난 상태에서 이신화 변신 시 움직일 수 없던 문제가 수정됩니다.
* 드레스룸에서 [상냥한 입술]이 두껍게 나오던 문제가 수정됩니다.
* 체인 블레이드, 너클을 착용한 상태에서 [악기관리], [수업준비] 제스처 사용 시 일부 물체가 보이지 않던 문제가 수정됩니다.
1. 중학생 때 즐기던 게임을 서비스 한다는 것
17. 이번 세션에서 알아볼 내용
• 메모리릭이 발생했을 때의 증상
• 재현 가능 여부에 따른 메모리릭 추적 방법
1. 중학생 때 즐기던 게임을 서비스 한다는 것
29. 가상 메모리
• OS 가상 메모리
• 프로세스 가상 메모리
2. Out of Memory
30. 프로세스 가상 메모리
바람의나라.exe 마비노기.exe 메이플스토리.exe
4G 번지
2. Out of Memory
0 번지
4G 번지
0 번지0 번지
4G 번지
31. 프로세스 가상 메모리
• OS가 프로세스에게 할당한 논리적인 주소 공간
• 다른 프로세스와는 독립적
• 32bit = 경우의 수 𝟐 𝟑𝟐 = 4GB (이론상)
• 64bit = 경우의 수 𝟐 𝟔𝟒
= 16EB (이론상)
2. Out of Memory
32. 프로세스 가상 메모리 한계
• RAM 이 얼마나 설치되어 있는가
• 프로세스 플랫폼(32bit, 64bit)에 따라
• 운영체제 버전(x86, x64)에 따라
2. Out of Memory
33. User-Mode Virtual Address Limits
https://msdn.microsoft.com/en-
us/library/windows/desktop/aa366778(v=vs.85).aspx#memory_limits
Memory type Limit on x86 Limit in 64-bit Windows
32-bit process 2 GB
3 GB with
IMAGE_FILE_LARGE_ADDRESS_AWARE
and 4-Gigabyte Tuning(4GT)
2 GB (default)
4 GB with IMAGE_FILE_LARGE_ADDRESS_AWARE
64-bit process Not applicable With IMAGE_FILE_LARGE_ADDRESS_AWARE set (default):
x64: 8 TB
Intel Itanium-based systems: 7 TB
Windows 8.1 and Windows Server 2012 R2: 128 TB
2 GB with IMAGE_FILE_LARGE_ADDRESS_AWARE cleared
2. Out of Memory
34. User-Mode Virtual Address Limits
https://msdn.microsoft.com/en-
us/library/windows/desktop/aa366778(v=vs.85).aspx#memory_limits
Memory type Limit on x86 Limit in 64-bit Windows
32-bit process 2 GB
3 GB with
IMAGE_FILE_LARGE_ADDRESS_AWARE
and 4-Gigabyte Tuning(4GT)
2 GB (default)
4 GB with IMAGE_FILE_LARGE_ADDRESS_AWARE
64-bit process Not applicable With IMAGE_FILE_LARGE_ADDRESS_AWARE set (default):
x64: 8 TB
Intel Itanium-based systems: 7 TB
Windows 8.1 and Windows Server 2012 R2: 128 TB
2 GB with IMAGE_FILE_LARGE_ADDRESS_AWARE cleared
2. Out of Memory
48. 메모리 증가 영향
• 페이지 폴트
• 캐시 미스
• 퍼포먼스
2. Out of Memory
49. Out of Memory 의 원인들
• Commit 으로 인한 가상 메모리 고갈
• Reserve 로 인한 가상 메모리 고갈
• Page File Limit 초과
• 단편화
... Memory Leak
2. Out of Memory
50. 정확한 원인 측정 : 다양한 관측 도구 & 정보 활용
• Process Explorer
• VMMap
2. Out of Memory
51. 생략된 이야기
• “Windows System – memory 개념 잡기” – 송창규님
https://www.slideshare.net/innover/windows-system-memory
2. Out of Memory
52. 2 GB
Commit
우리가 진짜로 궁금한 것
new Character();
new Dungeon();
LoadData();
list.push_back();new Item();
vector.reserve();
new Texture(); new Mesh();
2. Out of Memory
63. 1. 동적 할당이 일어나는 콜스택 별로,
메모리 블록의 시작 번지, 할당 크기 수집
2. 재현 전, 콜스택 별 메모리 할당량 기록
3. 재현 (스킬창 열기/닫기 x 10)
4. 재현 후, 콜스택 별 메모리 할당량 기록, 2번과 비교
메모리릭 디버깅 전략
3. Memory Leak
64. 1. 동적 할당이 일어나는 콜스택 별로,
할당 횟수, 해제 횟수, 할당 크기 수집
2. 재현 전, 콜스택 별 메모리 할당량 기록
3. 재현 (스킬창 열기/닫기 x 10)
4. 재현 후, 콜스택 별 메모리 할당량 기록, 2번과 비교
메모리릭 디버깅 전략
3. Memory Leak
65. 1. 동적 할당이 일어나는 콜스택 별로,
할당 횟수, 해제 횟수, 할당 크기 수집
2. 재현 전, 콜스택 별 메모리 할당량 기록
3. 재현 (스킬창 열기/닫기 x 10)
4. 재현 후, 콜스택 별 메모리 할당량 기록, 2번과 비교
메모리릭 디버깅 전략
3. Memory Leak
66. 1. 동적 할당이 일어나는 콜스택 별로,
할당 횟수, 해제 횟수, 할당 크기 수집
2. 재현 전, 콜스택 별 메모리 할당량 기록
3. 재현 (스킬창 열기/닫기 x 10)
4. 재현 후, 콜스택 별 메모리 할당량 기록, 2번과 비교
메모리릭 디버깅 전략
3. Memory Leak
69. • User Mode Dump Heap
• 특정 프로세스의 동적 할당 메모리 분석
• Windows SDK 에 포함
• 심볼 경로 설정 : _NT_SYMBOL_PATH 환경변수
UMDH.exe
https://developer.microsoft.com/en-US/windows/downloads/windows-10-sdk
3. Memory Leak
70. 1. 동적 할당이 일어나는 콜스택 별로,
메모리 블록의 시작 번지, 할당 크기 수집
2. 재현 전, 콜스택 별 메모리 할당량 기록
UMDH 사용법
gflags /i Client.exe +ust
umdh -pn:Client.exe > log1.txt
3. Memory Leak
75. 1. 프로그램 실행 후 즉시 블로킹 (_getch() 등..)
2. 데이터 로딩 전 umdh 로깅(log1.txt)
3. 데이터 로딩
4. 데이터 로딩 후 umdh 로깅(log2.txt), 비교(diff.txt)
응용 – 클라/서버 부팅 메모리 사용량 추적
3. Memory Leak
79. 6 GB
메모리릭 발생 시
16 GB
기울기 무엇?
평소 점검 전
Case Study : 게임서버 메모리릭
3. Memory Leak
80. 6 GB
메모리릭 발생 시
16 GB
기울기 무엇?
평소 점검 전
Case Study : 게임서버 메모리릭
3. Memory Leak
81. • 서버 부팅 직후부터 메모리가 1시간에 60MB씩 추가로 증가
→ 7일 x 24시간 x 60MB = 10GB
• 일반적으로 5분 동안 처리하는 메세지 수(스케줄링 포함)
→ 약 100만개
• 1시간 동안 NPC를 포함한 모든 유저의 행동을 로컬에 재현?
→ 현재로선 불가
재현 불가능한 이유
3. Memory Leak
82. UMDH 가 있는데 무슨 걱정?
정식 서버에 UMDH 붙이면 되겠네!
3. Memory Leak
83. 09:45 테섭 부팅 시작합니다.
09:53 테섭이 너무 안뜨네요.
10:00 꿈도 희망도 없군요.. 아직 데이터 로딩중..
13:56 테섭 프리징 아니에요
열심히 일하고 있습니다 ㅜ.ㅜ
17:20 더이상은.. 테섭 이만 내리겠습니다..
정식 게임 서버에 UMDH?
3. Memory Leak
84. • 테스트 서버 반응성 플레이 불가능한 수준으로 하락
• 정식 게임 서버에 적용 불가 판단
• 성능이 비교적 중요하지 않거나,
로드 밸런싱 가능한 서버에만 적용 가능
심각한 성능 저하
3. Memory Leak
87. • 특정 시점의 프로그램 작업 상태를 기록한 파일
• 크래시, 프리징 등 다양한 문제 상황 분석에 활용
• 풀덤프 : 모든 메모리 정보 포함
• 누수된 메모리도 이 안에 포함
덤프
3. Memory Leak
88. • Windows용 다용도 디버거
• Windows SDK 에 포함
• 많고 많은 기능 중에 우리가 사용할 기능 : Heap 분석
WinDBG.exe
3. Memory Leak
https://docs.microsoft.com/en-us/windows-hardware/drivers/debugger/getting-started-with-windows-debugging
89. 1. WinDBG 로 덤프를 열고, 심볼 경로를 설정
2. 전체적인 Heap 상황 확인
3. 누수가 발생한 힙에서 메모리 크기 별 할당횟수 집계
4. 가장 많이 할당된 크기의 메모리 블록 모두 검색
풀덤프 Heap 분석
3. Memory Leak
90. 1. WinDBG 로 덤프를 열고, 심볼 경로를 설정
2. 전체적인 Heap 상황 확인
3. 누수가 발생한 힙에서 메모리 크기 별 할당횟수 집계
4. 가장 많이 할당된 크기의 메모리 블록 모두 검색
풀덤프 Heap 분석
3. Memory Leak
91. 1. WinDBG 로 덤프를 열고, 심볼 경로를 설정
2. 전체적인 Heap 상황 확인
3. 누수가 발생한 힙에서 할당 사이즈 별 개수 통계
4. 가장 많이 할당된 크기의 메모리 블록 모두 검색
풀덤프 Heap 분석
3. Memory Leak
92. 1. WinDBG 로 덤프를 열고, 심볼 경로를 설정
2. 전체적인 Heap 상황 확인
3. 누수가 발생한 힙에서 메모리 크기 별 할당횟수 집계
4. 가장 많이 할당된 크기의 메모리 블록 모두 검색
풀덤프 Heap 분석
3. Memory Leak
93. 1. WinDBG 로 덤프를 열고, 심볼 경로를 설정
풀덤프 Heap 분석
자세한 설명은 구글링!
3. Memory Leak
94. 2. 전체적인 Heap 상황 확인
풀덤프 Heap 분석
!heap -s
3. Memory Leak
95. 2. 전체적인 Heap 상황 확인
풀덤프 Heap 분석
특정 Heap들이 다른 Heap 보다 월등히 큼
3. Memory Leak
96. 2. 전체적인 Heap 상황 확인
풀덤프 Heap 분석
특정 Heap들이 다른 Heap 보다 월등히 큼
Heap Commit Size
2150000 10.1 GB
20e0000 2.9 GB
...
3. Memory Leak
97. 2. 전체적인 Heap 상황 확인
풀덤프 Heap 분석
Heap Commit Size
2150000 10.1 GB
20e0000 2.9 GB
누수가 가장 심한 heap 주소 기억!
...
3. Memory Leak
98. 3. 누수가 발생한 힙에서 할당 사이즈 별 개수 통계
풀덤프 Heap 분석
!heap –stat –h 2150000
size #blocks total ( %)
30 1d030b5 570921f0 (23.47)
20 251ccbe 4a3997c0 (20.01)
c0 2e4750 22b57c00 (9.36)
18 1333799 1ccd3658 (7.77)
1c0 a4881 11fee1c0 (4.85)
...
3. Memory Leak
99. 4. 가장 많이 할당된 크기의 메모리 블록 모두 검색
풀덤프 Heap 분석
!heap -flt s 30
3. Memory Leak
?
100. • 나라를 구한 케이스
• 착하게 산 케이스
• 망나니 케이스
전생에 덕 많이 쌓으셨나요?
3. Memory Leak
117. • 서버 코드에 메모리 할당/해제 Hook 설정
(성능 저하 – 로컬이나 테스트서버에서만 사용)
• 같은 사이즈의 객체들이 주로 어디서 할당되는지 확인
• 특히 할당 사이즈가 유니크할 경우 유용
_CrtSetAllocHook()
“온라인 게임에서 사례로 살펴보는 디버깅” - 박일님
https://www.slideshare.net/parkpd/in-ndc2010
3. Memory Leak
118. • 누수된 메모리 블럭 내 데이터 구조 분석/추적
• 내부 테스트서버에 UMDH 적용
• 문제 발생 시점에 투입된 변경점 전체 코드 리뷰
• 메모리 증가 시점의 유저 행동 로그 분석
그 이외의 시도
3. Memory Leak
120. • 32bit 윈도우를 지원하면 가상 메모리 한계는 2GB이다.
• 메모리 이슈를 분석할 때에는 더 나은 도구로
Commit Size 를 포함한 여러 지표를 확인하자.
• 재현 가능한 메모리릭은
UMDH등의 툴을 이용해서 디버깅하자.
• 재현 불가능한 메모리릭은 windbg로
풀덤프 Heap 분석을 시도해보자.
Summary