SlideShare une entreprise Scribd logo
1  sur  123
Télécharger pour lire hors ligne
넥슨 코리아 / 마비노기
최동민
/* 신입 개발자가 알아야 할 윈도우 메모리릭 디버깅 */
서버야, 아프지마
발표자 소개
프로그래머
최동민
마비노기 2014.10 ~
목차
1.중학생 때 즐기던 게임을 서비스 한다는 것
2.Out of Memory
3.Memory Leak
4.Summary
• 프로그래머 지망 학부생
• 1~2년 차 프로그래머
발표의 대상
• 앞으로 마주칠 메모리 이슈 유형 소개
• 이슈 접근 방법
• 실무 메모리 디버깅에 대한 기초 개념 정립
• 키워드 위주의 정보 전달 (자세한 사항은 구글링)
다룰 것
• 발견된 원인에 대한 해결책
• Windows 이외의 개발 환경
• 소프트웨어 공학
다루지 않을 것
1. 중학생 때 즐기던 게임을
서비스 한다는 것
때는 바야흐로 마비노기 10주년
흔한
마비노기
유저
15살
중학교 3학년
프로그래머 타이틀을
획득하셨습니다.
25
세
1. 중학생 때 즐기던 게임을 서비스 한다는 것
입사 전 예상 했던 것
왔구나 애송이..
xx년차 개발자
1. 중학생 때 즐기던 게임을 서비스 한다는 것
입사 후 놀랐던 것
• 젊은 사우분들(!)
• 체계적인 신입 교육 프로세스
• 지속적인 개발 환경 개선
• 개방적인 개발 문화
1. 중학생 때 즐기던 게임을 서비스 한다는 것
입사 후 첫 위기
• 신규 던전 투입 후
메모리 부족(Out of Memory) 클라이언트 크래시
제가
고쳐보겠습니다!!
* 개방적인 개발 문화
1. 중학생 때 즐기던 게임을 서비스 한다는 것
사막에서 바늘 찾기
• 14년 서비스의 유산 : 압도적인 코드량
1. 중학생 때 즐기던 게임을 서비스 한다는 것
사막에서 바늘을 찾는 법 1
• 대상에 대한 정확한 이해
1. 중학생 때 즐기던 게임을 서비스 한다는 것
대상에 대한 이해가 부족할 경우
• “RAM은 충분한데 왜 std::bad_alloc이 나지..?”
• “내 컴퓨터에서는 크래시 안나는데?”
• “유저 분 컴퓨터가 안 좋아서 그런가 보다.”
1. 중학생 때 즐기던 게임을 서비스 한다는 것
사막에서 바늘을 찾는 법 2
• 적절한 도구 사용
1. 중학생 때 즐기던 게임을 서비스 한다는 것
적절한 도구를 찾지 못했을 경우
• “이 함수가 의심스럽네!
사용하는 부분을 찾아봐야 겠다.”
• “이번 주에 투입된 코드 변경점들을 모두 리뷰 해보자!”
* [사도 제바흐]에서 특정 스킬 사용 시 제바흐의 스킬이 비정상적으로 작동하던 문제가 수정됩니다.
* [사도 제바흐] 어려움 난이도에 [전이의 카탈리스트]가 보상으로 추가됩니다.
* [사도 제바흐] 어려움 난이도의 신성 경험치 보상과 하루 획득 가능한 신성 경험치가 증가합니다.
* 아발론 필드 레이드, 아발론 정화 미션, 사도 하시딤 레이드에서 획득할 수 있는 일부 보상 아이템을 분해하여
신성한 광물 조각을 획득할 수 있습니다.
• 필드 레이드 진행 중, 펫을 부활시켜 공헌도를 얻을 수 있던 문제가 수정됩니다.
* 아발론 필드 레이드 보상 지급 조건이 조정됩니다.
* [유니콘과 함께 아발론을 누빈] 타이틀이 추가됩니다.
* 아발론 전 지역의 문게이트가 스마트 콘텐츠에 추가됩니다.
* 아발론 경계지에서 [변이된 곰], [변이된 늑대], [변이된 멧돼지] 공격 시, 몬스터가 다운되지 않던 문제가 수정됩니다.
* [디바인 신시엘라크 L2]의 특별 개조 이펙트가 출력되지 않던 문제가 수정됩니다.
* 스킬, 퀘스트의 드래곤 관련 항목이 실반 드래곤에게 적용되지 않던 문제가 수정됩니다.
* [아켈론 크라우칭] 스킬을 사용한 상태에서 아켈론이 연속으로 공격당할 때 체력이 감소하는 것처럼 보이던 문제가 수정됩니다.
* [이네스]의 [해안 정화에 대해] 키워드에 설명이 추가됩니다.
* [아발론 해안 정화] 미션에 미션 설명이 추가됩니다.
변신 메달 교환권으로 교환할 수 있는 변신 메달 종류가 추가됩니다.
* 낭만 농장 안에서 스마트 콘텐츠로 이동하면 동물 캐릭터에 탑승한 다른 캐릭터도 함께 이동되던 문제가 수정됩니다.
* 낭만 농장에 진입 시 간헐적으로 클라이언트가 종료되던 문제가 수정됩니다.
* 드레스룸을 열고 하우징 방 문을 클릭하면 간헐적으로 클라이언트가 종료되던 문제가 수정됩니다.
* 캠프파이어 스킬을 배우지 않은 상태로 모닥불에 향초를 태우면 클라이언트가 종료되던 문제가 수정됩니다.
* 평판 보상으로 중첩된 비정상적인 능력치가 원래의 능력치로 돌아옵니다.
* 엘프 캐릭터가 문라이트 낭만 비행 사용 시, 일부 이펙트가 나오지 않던 문제가 수정됩니다.
* 엘프 캐릭터로 동성 캐릭터와 [문라이트 낭만 비행] 함께 날기를 하면 한 캐릭터가 땅에 묻혀 보이던 문제가 수정됩니다.
* 낭만 비행 액션 사용 중 함께 날기 요청을 받은 캐릭터가 전투모드로 전환했을 때 모션이 어색해 보이던 문제가 수정됩니다.
* 두근두근 아일랜드 천 염색 시 마우스 커서 모양이 변경됩니다.
* 두근두근 아일랜드 해안가의 일부 지형이 비정상적으로 보이던 문제가 수정됩니다.
* 일요일에 마법 악보를 연주하면 항상 성공하던 문제가 수정됩니다.
* 자동 생산 시도 중 장비 스왑으로 생산이 불가능할 경우에도 자동 생산이 지속되던 문제가 수정됩니다.
* 길드전 승리 보상인 [순간이동 책(던바튼)], [순간이동 책(티르 코네일)] 아이템이 만료 후에도 사용할 수 있던 문제가 수정됩니다.
* 자이언트 캐릭터로 [별의 상흔] 퀘스트 진행 중 NPC의 모션이 잘못 출력되던 문제가 수정됩니다.
* [폐허의 갈까마귀] 퀘스트 완료 후 [무대 밖의 손] 퀘스트를 습득하기 전, 기사단 NPC들이 곳곳에 배치되도록 수정됩니다.
* [수호자의 길] 퀘스트 중, 이신화 하지 않고 NPC와 대화 시 포트레이트가 나오지 않던 문제가 수정됩니다.
* [씨줄과 날줄] 퀘스트 정보에서 아벨린 포트레이트가 단발이 아니던 문제가 수정됩니다.
* [새로운 신성] 퀘스트 중, 멀린 대사의 오탈자가 수정됩니다.
* 아발론 게이트 BGM이 안나오던 문제가 수정됩니다.
* 퀘스트 진행 중, 성소 날씨가 변경되던 문제가 수정됩니다.
* 일부 컷신에서 자이언트 캐릭터의 이름이 출력되지 않던 문제가 수정됩니다.
* G21 메인스트림 1부 일부 대사에서 NPC 알터의 표정이 어색하던 문제가 수정됩니다.
* 이신화 상태에서 간헐적으로 [루인 오브 노바]를 사용해도 변신 쿨타임이 동작하지 않던 문제가 수정됩니다.
* 이신화 변신 중 승단 미션 진입 시 이신화 변신이 해제되도록 수정됩니다.
* 이신화 변신 중 특별조[부상 치료] 미션 진입 시 이신화 변신이 해제되도록 수정됩니다.
* 마법의 장난 상태에서 이신화 변신 시 움직일 수 없던 문제가 수정됩니다.
* 드레스룸에서 [상냥한 입술]이 두껍게 나오던 문제가 수정됩니다.
* 체인 블레이드, 너클을 착용한 상태에서 [악기관리], [수업준비] 제스처 사용 시 일부 물체가 보이지 않던 문제가 수정됩니다.
1. 중학생 때 즐기던 게임을 서비스 한다는 것
이번 세션에서 알아볼 내용
• 메모리릭이 발생했을 때의 증상
• 재현 가능 여부에 따른 메모리릭 추적 방법
1. 중학생 때 즐기던 게임을 서비스 한다는 것
2. Out of Memory
게임을 하다가 자꾸
메모리가 부족하다면서 팅겨요
RAM 은 남아도는데...
• 메모리가 부족한 현상
Out of Memory?
2. Out of Memory
• 머신의 물리메모리(RAM)가 부족한 현상?
남은 물리메모리
Out of Memory?
2. Out of Memory
• 대부분 프로세스의 가상메모리가 부족한 현상!
작업관리자
Out of Memory
2. Out of Memory
• 대부분 컴퓨터 사양 문제가 아닌, 응용 프로그램의 문제
Out of Memory
2. Out of Memory
가상 메모리
• OS 가상 메모리
• 프로세스 가상 메모리
2. Out of Memory
OS 가상 메모리
1 GB 메모리
마비노기.exe
2. Out of Memory
RAM
Disk
OS 가상 메모리
0.2 GB
0.8 GB
사용중
노는중
마비노기.exe
2. Out of Memory
OS 가상 메모리
• 디스크를 RAM 처럼 사용
• 실제 물리 메모리보다 더 많은 메모리를 프로세스에게 할당 가능
2. Out of Memory
RAM
Disk
OS 가상 메모리
마비, 바람, 서든, 카스,
메이플, 테라, 던파...
2. Out of Memory
가상 메모리
• OS 가상 메모리
• 프로세스 가상 메모리
2. Out of Memory
프로세스 가상 메모리
바람의나라.exe 마비노기.exe 메이플스토리.exe
4G 번지
2. Out of Memory
0 번지
4G 번지
0 번지0 번지
4G 번지
프로세스 가상 메모리
• OS가 프로세스에게 할당한 논리적인 주소 공간
• 다른 프로세스와는 독립적
• 32bit = 경우의 수 𝟐 𝟑𝟐 = 4GB (이론상)
• 64bit = 경우의 수 𝟐 𝟔𝟒
= 16EB (이론상)
2. Out of Memory
프로세스 가상 메모리 한계
• RAM 이 얼마나 설치되어 있는가
• 프로세스 플랫폼(32bit, 64bit)에 따라
• 운영체제 버전(x86, x64)에 따라
2. Out of Memory
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
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
32bit인데 4GB 아니고
왜 2GB요?
32bit 유저 모드 가상 메모리 한계
마비노기.exe
유저모드
커널모드
2 GB
2 GB
2. Out of Memory
32bit Windows 를 지원한다.
= 가상 메모리 한계가 2GB 이다.
32bit에서 가상 메모리 2GB 초과 시
• malloc
• return nullptr
• new
• throw std::bad_alloc
2. Out of Memory
예제를 돌려봅시다
while (1)
{
new char[10000];
}
반드시 32bit 프로세스로 테스트
2. Out of Memory
2GB 안 넘었는데
800MB 에서 왜 bad_alloc요?
Working Set
832 MB
Commit
2 GB
커밋 사이즈 초과
2. Out of Memory
RAM
Disk
NDC.exe
0.2 GB
0.8 GB
사용중
노는중
작업관리자 기준
WorkingSet
작업 집합(Working Set)
2. Out of Memory
RAM
Disk
작업관리자 기준
1 GB
사용중
+
노는중
커밋(Commit)
Commit
NDC.exe
2. Out of Memory
2 GB
Commit
Out of Process Virtual Memory
NDC.exe
while (1)
{
new char[10000];
}
2. Out of Memory
게임서버가 64bit 면
Out of Memory는 안 뜨겠네요?
예제를 64bit 프로세스로 돌려봅시다
while (1)
{
new char[10000];
}
하시던 작업을 모두 저장하십시오.
당신의 컴퓨터가 죽.을.수.도.있.습.니.다
2. Out of Memory
• 커밋 크기 한계 돌파 ↗
64bit 예제 결과
2. Out of Memory
메모리 증가 영향
• 페이지 폴트
• 캐시 미스
• 퍼포먼스
2. Out of Memory
Out of Memory 의 원인들
• Commit 으로 인한 가상 메모리 고갈
• Reserve 로 인한 가상 메모리 고갈
• Page File Limit 초과
• 단편화
... Memory Leak
2. Out of Memory
정확한 원인 측정 : 다양한 관측 도구 & 정보 활용
• Process Explorer
• VMMap
2. Out of Memory
생략된 이야기
• “Windows System – memory 개념 잡기” – 송창규님
https://www.slideshare.net/innover/windows-system-memory
2. Out of Memory
2 GB
Commit
우리가 진짜로 궁금한 것
new Character();
new Dungeon();
LoadData();
list.push_back();new Item();
vector.reserve();
new Texture(); new Mesh();
2. Out of Memory
이 중에
어디서
새는거죠?
3. Memory Leak
• 운영체제로부터 동적 할당 받은 메모리가 반환되지 않고,
프로세스의 메모리를 계속 점유하는 현상
Memory Leak
3. Memory Leak
3. Memory Leak
1) 재현 가능한 메모리릭
2) 재현 불가능한 메모리릭
• 던전을 돌면…
• 특정 스킬을 쓰면…
• 특정 UI를 열면…
• 특정 지역으로 이동하면…
재현 방법 존재
3. Memory Leak
• “스킬창을 열면 메모리가 증가합니다”
Case Study : 재현 가능한 메모리릭
3. Memory Leak
• “스킬창을 열면 메모리가 증가합니다”
Case Study : 재현 가능한 메모리릭
3. Memory Leak
타이틀바
탭
탭 프레임
버튼
아이콘
스킬 리스트
게이지
스크롤
텍스트
• “스킬창을 열면 메모리가 증가합니다”
Case Study : 재현 가능한 메모리릭
3. Memory Leak
타이틀바
탭
탭 프레임
버튼
아이콘
스킬 리스트
게이지
스크롤
텍스트
이 중에
어디서
새는거죠?
어디서 = 콜스택
1. 동적 할당이 일어나는 콜스택 별로,
메모리 블록의 시작 번지, 할당 크기 수집
2. 재현 전, 콜스택 별 메모리 할당량 기록
3. 재현 (스킬창 열기/닫기 x 10)
4. 재현 후, 콜스택 별 메모리 할당량 기록, 2번과 비교
메모리릭 디버깅 전략
3. Memory Leak
1. 동적 할당이 일어나는 콜스택 별로,
할당 횟수, 해제 횟수, 할당 크기 수집
2. 재현 전, 콜스택 별 메모리 할당량 기록
3. 재현 (스킬창 열기/닫기 x 10)
4. 재현 후, 콜스택 별 메모리 할당량 기록, 2번과 비교
메모리릭 디버깅 전략
3. Memory Leak
1. 동적 할당이 일어나는 콜스택 별로,
할당 횟수, 해제 횟수, 할당 크기 수집
2. 재현 전, 콜스택 별 메모리 할당량 기록
3. 재현 (스킬창 열기/닫기 x 10)
4. 재현 후, 콜스택 별 메모리 할당량 기록, 2번과 비교
메모리릭 디버깅 전략
3. Memory Leak
1. 동적 할당이 일어나는 콜스택 별로,
할당 횟수, 해제 횟수, 할당 크기 수집
2. 재현 전, 콜스택 별 메모리 할당량 기록
3. 재현 (스킬창 열기/닫기 x 10)
4. 재현 후, 콜스택 별 메모리 할당량 기록, 2번과 비교
메모리릭 디버깅 전략
3. Memory Leak
이걸 만들어야 된다고요?
그럴리가요
가 있잖아요
• 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
1. 동적 할당이 일어나는 콜스택 별로,
메모리 블록의 시작 번지, 할당 크기 수집
2. 재현 전, 콜스택 별 메모리 할당량 기록
UMDH 사용법
gflags /i Client.exe +ust
umdh -pn:Client.exe > log1.txt
3. Memory Leak
3. 재현 (스킬창 열기/닫기 x 10)
UMDH 사용법
3. Memory Leak
4. 재현 후, 콜스택 별 메모리 할당량 기록
2번과 비교
UMDH 사용법
umdh -pn:Client.exe > log2.txt
umdh log1.txt log2.txt > diff.txt
3. Memory Leak
• diff.txt
메모리 누수 콜스택 확인
3. Memory Leak
1. 프로그램 실행 후 즉시 블로킹 (_getch() 등..)
2. 데이터 로딩 전 umdh 로깅(log1.txt)
3. 데이터 로딩
4. 데이터 로딩 후 umdh 로깅(log2.txt), 비교(diff.txt)
응용 – 클라/서버 부팅 메모리 사용량 추적
3. Memory Leak
= Visual Studio Memory Snapshot
3. Memory Leak
VS 2015 부터
• VS Dignostics Tool - Memory Snapshot
“디버깅, 어디까지 해봤니?” – 김희준님
https://channel9.msdn.com/Events/TechDays/TDK2015/T2-4
• DebugDiag – Memory Analysis
• LeakDiag – Virtual Memory Leak Detection
• CRT Debug Library
https://msdn.microsoft.com/en-us/library/974tc9t1.aspx
생략된 이야기
3. Memory Leak
3. Memory Leak
1) 재현 가능한 메모리릭
2) 재현 불가능한 메모리릭
6 GB
메모리릭 발생 시
16 GB
기울기 무엇?
평소 점검 전
Case Study : 게임서버 메모리릭
3. Memory Leak
6 GB
메모리릭 발생 시
16 GB
기울기 무엇?
평소 점검 전
Case Study : 게임서버 메모리릭
3. Memory Leak
• 서버 부팅 직후부터 메모리가 1시간에 60MB씩 추가로 증가
→ 7일 x 24시간 x 60MB = 10GB
• 일반적으로 5분 동안 처리하는 메세지 수(스케줄링 포함)
→ 약 100만개
• 1시간 동안 NPC를 포함한 모든 유저의 행동을 로컬에 재현?
→ 현재로선 불가
재현 불가능한 이유
3. Memory Leak
UMDH 가 있는데 무슨 걱정?
정식 서버에 UMDH 붙이면 되겠네!
3. Memory Leak
09:45 테섭 부팅 시작합니다.
09:53 테섭이 너무 안뜨네요.
10:00 꿈도 희망도 없군요.. 아직 데이터 로딩중..
13:56 테섭 프리징 아니에요
열심히 일하고 있습니다 ㅜ.ㅜ
17:20 더이상은.. 테섭 이만 내리겠습니다..
정식 게임 서버에 UMDH?
3. Memory Leak
• 테스트 서버 반응성 플레이 불가능한 수준으로 하락
• 정식 게임 서버에 적용 불가 판단
• 성능이 비교적 중요하지 않거나,
로드 밸런싱 가능한 서버에만 적용 가능
심각한 성능 저하
3. Memory Leak
뭔가 방법이 없을까?
싱싱한
풀덤프가 있었지!
• 특정 시점의 프로그램 작업 상태를 기록한 파일
• 크래시, 프리징 등 다양한 문제 상황 분석에 활용
• 풀덤프 : 모든 메모리 정보 포함
• 누수된 메모리도 이 안에 포함
덤프
3. Memory Leak
• Windows용 다용도 디버거
• Windows SDK 에 포함
• 많고 많은 기능 중에 우리가 사용할 기능 : Heap 분석
WinDBG.exe
3. Memory Leak
https://docs.microsoft.com/en-us/windows-hardware/drivers/debugger/getting-started-with-windows-debugging
1. WinDBG 로 덤프를 열고, 심볼 경로를 설정
2. 전체적인 Heap 상황 확인
3. 누수가 발생한 힙에서 메모리 크기 별 할당횟수 집계
4. 가장 많이 할당된 크기의 메모리 블록 모두 검색
풀덤프 Heap 분석
3. Memory Leak
1. WinDBG 로 덤프를 열고, 심볼 경로를 설정
2. 전체적인 Heap 상황 확인
3. 누수가 발생한 힙에서 메모리 크기 별 할당횟수 집계
4. 가장 많이 할당된 크기의 메모리 블록 모두 검색
풀덤프 Heap 분석
3. Memory Leak
1. WinDBG 로 덤프를 열고, 심볼 경로를 설정
2. 전체적인 Heap 상황 확인
3. 누수가 발생한 힙에서 할당 사이즈 별 개수 통계
4. 가장 많이 할당된 크기의 메모리 블록 모두 검색
풀덤프 Heap 분석
3. Memory Leak
1. WinDBG 로 덤프를 열고, 심볼 경로를 설정
2. 전체적인 Heap 상황 확인
3. 누수가 발생한 힙에서 메모리 크기 별 할당횟수 집계
4. 가장 많이 할당된 크기의 메모리 블록 모두 검색
풀덤프 Heap 분석
3. Memory Leak
1. WinDBG 로 덤프를 열고, 심볼 경로를 설정
풀덤프 Heap 분석
자세한 설명은 구글링!
3. Memory Leak
2. 전체적인 Heap 상황 확인
풀덤프 Heap 분석
!heap -s
3. Memory Leak
2. 전체적인 Heap 상황 확인
풀덤프 Heap 분석
특정 Heap들이 다른 Heap 보다 월등히 큼
3. Memory Leak
2. 전체적인 Heap 상황 확인
풀덤프 Heap 분석
특정 Heap들이 다른 Heap 보다 월등히 큼
Heap Commit Size
2150000 10.1 GB
20e0000 2.9 GB
...
3. Memory Leak
2. 전체적인 Heap 상황 확인
풀덤프 Heap 분석
Heap Commit Size
2150000 10.1 GB
20e0000 2.9 GB
누수가 가장 심한 heap 주소 기억!
...
3. Memory Leak
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
4. 가장 많이 할당된 크기의 메모리 블록 모두 검색
풀덤프 Heap 분석
!heap -flt s 30
3. Memory Leak
?
• 나라를 구한 케이스
• 착하게 산 케이스
• 망나니 케이스
전생에 덕 많이 쌓으셨나요?
3. Memory Leak
전생에 나라를 구하셨군요
• 누수된 메모리가 가상함수가 있는 객체였다!
3. Memory Leak
• 가상함수 테이블 포인터로부터 객체 확인
전생에 나라를 구하셨군요
HEAP_ENTRY Size Prev Flags UserPtr UserSize - state
0000000084933f70 0061 0061 [00] 0000000084933f80 00600 - (busy)
GameServer!Character::`vftable'
000000013884b550 0061 0061 [00] 000000013884b560 00600 - (busy)
GameServer!Character::`vftable'
000000013884d3a0 0061 0061 [00] 000000013884d3b0 00600 - (busy)
GameServer!Character::`vftable'
000000013884e5d0 0061 0061 [00] 000000013884e5e0 00600 - (busy)
GameServer!Character::`vftable'
000000013884f800 0061 0061 [00] 000000013884f810 00600 - (busy)
GameServer!Character::`vftable'
3. Memory Leak
전생에 나라를 구하셨군요
0000000084933f70 0061 0061 [00] 0000000084933f80 00600 - (busy)
GameServer!Character::`vftable'
• VS로 덤프를 열고, 포인터를 해당 타입으로 캐스팅
3. Memory Leak
• 누수된 메모리가 가상함수가 없는 객체였다.
전생에 나라를 못 구하셨군요..
HEAP_ENTRY Size Prev Flags UserPtr UserSize - state
0000000003a41bb0 0004 0004 [00] 0000000003a41bc0 00030 - (busy)
0000000003a41bf0 0004 0004 [00] 0000000003a41c00 00030 - (busy)
0000000003a41c30 0004 0004 [00] 0000000003a41c40 00030 - (busy)
0000000003a920d0 0004 0004 [00] 0000000003a920e0 00030 - (free)
0000000003a93a20 0004 0004 [00] 0000000003a93a30 00030 - (free)
0000000003aa1630 0004 0004 [00] 0000000003aa1640 00030 - (busy)
0000000003aa17b0 0004 0004 [00] 0000000003aa17c0 00030 - (busy)
0000000003aa1830 0004 0004 [00] 0000000003aa1840 00030 - (busy)
0000000003aa18b0 0004 0004 [00] 0000000003aa18c0 00030 - (busy)
3. Memory Leak
• 나라를 구한 케이스
• 착하게 산 케이스
• 망나니 케이스
전생에 덕 많이 쌓으셨나요?
3. Memory Leak
• 누수된 메모리 중에 string 이 있었다!
전생에 착하게 사셨군요
3. Memory Leak
pair<string, Value>
struct Data
{
int id;
EType type;
string name;
}
• String 생성/삭제 부하 감소를 위한 메모리풀
• 별도 Heap 사용
마비노기 게임서버의 String
Heap Commit Size
2150000 10.1 GB
20e0000 2.9 GB
3. Memory Leak
특정 Heap이 사용하는 메모리 영역 찾기
3. Memory Leak
• !heap 20e0000
특정 Heap이 사용하는 메모리 영역 찾기
3. Memory Leak
• !heap 20e0000
로딩 or 캐싱
현재 사용 중
특정 Heap이 사용하는 메모리 영역 찾기
3. Memory Leak
• !heap 20e0000
누수된 메모리
특정 Heap이 사용하는 메모리 영역 찾기
3. Memory Leak
• !heap 20e0000
• 누수된 String 데이터 확인 관련 코드/데이터 추적
VS 메모리창
3. Memory Leak
• 누수된 메모리 중에 String 이 없었다...
전생에 착하게 좀 사시지
3. Memory Leak
• 나라를 구한 케이스
• 착하게 산 케이스
• 망나니 케이스
전생에 덕 많이 쌓으셨나요?
3. Memory Leak
• 누수된 메모리만이 남아 있을 뿐이었다.
혹시 전생에...(말잇못)
HEAP_ENTRY Size Prev Flags UserPtr UserSize - state
0000000003a41bb0 0004 0004 [00] 0000000003a41bc0 00030 - (busy)
0000000003a41bf0 0004 0004 [00] 0000000003a41c00 00030 - (busy)
0000000003a41c30 0004 0004 [00] 0000000003a41c40 00030 - (busy)
0000000003a920d0 0004 0004 [00] 0000000003a920e0 00030 - (free)
0000000003a93a20 0004 0004 [00] 0000000003a93a30 00030 - (free)
0000000003aa1630 0004 0004 [00] 0000000003aa1640 00030 - (busy)
0000000003aa17b0 0004 0004 [00] 0000000003aa17c0 00030 - (busy)
0000000003aa1830 0004 0004 [00] 0000000003aa1840 00030 - (busy)
0000000003aa18b0 0004 0004 [00] 0000000003aa18c0 00030 - (busy)
3. Memory Leak
• 서버 코드에 메모리 할당/해제 Hook 설정
(성능 저하 – 로컬이나 테스트서버에서만 사용)
• 같은 사이즈의 객체들이 주로 어디서 할당되는지 확인
• 특히 할당 사이즈가 유니크할 경우 유용
_CrtSetAllocHook()
“온라인 게임에서 사례로 살펴보는 디버깅” - 박일님
https://www.slideshare.net/parkpd/in-ndc2010
3. Memory Leak
• 누수된 메모리 블럭 내 데이터 구조 분석/추적
• 내부 테스트서버에 UMDH 적용
• 문제 발생 시점에 투입된 변경점 전체 코드 리뷰
• 메모리 증가 시점의 유저 행동 로그 분석
그 이외의 시도
3. Memory Leak
4. Summary
• 32bit 윈도우를 지원하면 가상 메모리 한계는 2GB이다.
• 메모리 이슈를 분석할 때에는 더 나은 도구로
Commit Size 를 포함한 여러 지표를 확인하자.
• 재현 가능한 메모리릭은
UMDH등의 툴을 이용해서 디버깅하자.
• 재현 불가능한 메모리릭은 windbg로
풀덤프 Heap 분석을 시도해보자.
Summary
QnA
자나깨나 메모리 조심
-끝-
• “네이티브 코드 디버깅” - MSDN
https://msdn.microsoft.com/ko-kr/library/k70yt3e2.aspx
• “빌드 관리 및 디버깅” - 유영천님
https://www.slideshare.net/dgtman/2010-85789722
• “실전 윈도우 디버깅” - MARIO HEWARDT
book
생략된 이야기 & Reference
3. Memory Leak

Contenu connexe

Tendances

임태현, MMO 서버 개발 포스트 모템, NDC2012
임태현, MMO 서버 개발 포스트 모템, NDC2012임태현, MMO 서버 개발 포스트 모템, NDC2012
임태현, MMO 서버 개발 포스트 모템, NDC2012devCAT Studio, NEXON
 
테라로 살펴본 MMORPG의 논타겟팅 시스템
테라로 살펴본 MMORPG의 논타겟팅 시스템테라로 살펴본 MMORPG의 논타겟팅 시스템
테라로 살펴본 MMORPG의 논타겟팅 시스템QooJuice
 
온라인 게임에서 사례로 살펴보는 디버깅 in NDC2010
온라인 게임에서 사례로 살펴보는 디버깅 in NDC2010온라인 게임에서 사례로 살펴보는 디버깅 in NDC2010
온라인 게임에서 사례로 살펴보는 디버깅 in NDC2010Ryan Park
 
[NDC2016] TERA 서버의 Modern C++ 활용기
[NDC2016] TERA 서버의 Modern C++ 활용기[NDC2016] TERA 서버의 Modern C++ 활용기
[NDC2016] TERA 서버의 Modern C++ 활용기Sang Heon Lee
 
나만의 엔진 개발하기
나만의 엔진 개발하기나만의 엔진 개발하기
나만의 엔진 개발하기YEONG-CHEON YOU
 
이승재, 실버바인 서버엔진 2 설계 리뷰, NDC2018
이승재, 실버바인 서버엔진 2 설계 리뷰, NDC2018이승재, 실버바인 서버엔진 2 설계 리뷰, NDC2018
이승재, 실버바인 서버엔진 2 설계 리뷰, NDC2018devCAT Studio, NEXON
 
Windows Registered I/O (RIO) vs IOCP
Windows Registered I/O (RIO) vs IOCPWindows Registered I/O (RIO) vs IOCP
Windows Registered I/O (RIO) vs IOCPSeungmo Koo
 
Ndc14 분산 서버 구축의 ABC
Ndc14 분산 서버 구축의 ABCNdc14 분산 서버 구축의 ABC
Ndc14 분산 서버 구축의 ABCHo Gyu Lee
 
What is Game Server ?
What is Game Server ?What is Game Server ?
What is Game Server ?흥배 최
 
게임서버프로그래밍 #0 - TCP 및 이벤트 통지모델
게임서버프로그래밍 #0 - TCP 및 이벤트 통지모델게임서버프로그래밍 #0 - TCP 및 이벤트 통지모델
게임서버프로그래밍 #0 - TCP 및 이벤트 통지모델Seungmo Koo
 
[IGC 2017] 펄어비스 민경인 - Mmorpg를 위한 voxel 기반 네비게이션 라이브러리 개발기
[IGC 2017] 펄어비스 민경인 - Mmorpg를 위한 voxel 기반 네비게이션 라이브러리 개발기[IGC 2017] 펄어비스 민경인 - Mmorpg를 위한 voxel 기반 네비게이션 라이브러리 개발기
[IGC 2017] 펄어비스 민경인 - Mmorpg를 위한 voxel 기반 네비게이션 라이브러리 개발기강 민우
 
이무림, Enum의 Boxing을 어찌할꼬? 편리하고 성능좋게 Enum 사용하기, NDC2019
이무림, Enum의 Boxing을 어찌할꼬? 편리하고 성능좋게 Enum 사용하기, NDC2019이무림, Enum의 Boxing을 어찌할꼬? 편리하고 성능좋게 Enum 사용하기, NDC2019
이무림, Enum의 Boxing을 어찌할꼬? 편리하고 성능좋게 Enum 사용하기, NDC2019devCAT Studio, NEXON
 
Python 게임서버 안녕하십니까 : RPC framework 편
Python 게임서버 안녕하십니까 : RPC framework 편Python 게임서버 안녕하십니까 : RPC framework 편
Python 게임서버 안녕하십니까 : RPC framework 편준철 박
 
NDC12_Lockless게임서버설계와구현
NDC12_Lockless게임서버설계와구현NDC12_Lockless게임서버설계와구현
NDC12_Lockless게임서버설계와구현noerror
 
Windows IOCP vs Linux EPOLL Performance Comparison
Windows IOCP vs Linux EPOLL Performance ComparisonWindows IOCP vs Linux EPOLL Performance Comparison
Windows IOCP vs Linux EPOLL Performance ComparisonSeungmo Koo
 
[데브루키/141206 박민근] 유니티 최적화 테크닉 총정리
[데브루키/141206 박민근] 유니티 최적화 테크닉 총정리[데브루키/141206 박민근] 유니티 최적화 테크닉 총정리
[데브루키/141206 박민근] 유니티 최적화 테크닉 총정리MinGeun Park
 
빌드관리 및 디버깅 (2010년 자료)
빌드관리 및 디버깅 (2010년 자료)빌드관리 및 디버깅 (2010년 자료)
빌드관리 및 디버깅 (2010년 자료)YEONG-CHEON YOU
 
Akka.NET 으로 만드는 온라인 게임 서버 (NDC2016)
Akka.NET 으로 만드는 온라인 게임 서버 (NDC2016)Akka.NET 으로 만드는 온라인 게임 서버 (NDC2016)
Akka.NET 으로 만드는 온라인 게임 서버 (NDC2016)Esun Kim
 
홍성우, 게임 서버의 목차 - 시작부터 출시까지, NDC2019
홍성우, 게임 서버의 목차 - 시작부터 출시까지, NDC2019홍성우, 게임 서버의 목차 - 시작부터 출시까지, NDC2019
홍성우, 게임 서버의 목차 - 시작부터 출시까지, NDC2019devCAT Studio, NEXON
 
게임에서 흔히 쓰이는 최적화 전략 by 엄윤섭 @ 지스타 컨퍼런스 2013
게임에서 흔히 쓰이는 최적화 전략 by 엄윤섭 @ 지스타 컨퍼런스 2013게임에서 흔히 쓰이는 최적화 전략 by 엄윤섭 @ 지스타 컨퍼런스 2013
게임에서 흔히 쓰이는 최적화 전략 by 엄윤섭 @ 지스타 컨퍼런스 2013영욱 오
 

Tendances (20)

임태현, MMO 서버 개발 포스트 모템, NDC2012
임태현, MMO 서버 개발 포스트 모템, NDC2012임태현, MMO 서버 개발 포스트 모템, NDC2012
임태현, MMO 서버 개발 포스트 모템, NDC2012
 
테라로 살펴본 MMORPG의 논타겟팅 시스템
테라로 살펴본 MMORPG의 논타겟팅 시스템테라로 살펴본 MMORPG의 논타겟팅 시스템
테라로 살펴본 MMORPG의 논타겟팅 시스템
 
온라인 게임에서 사례로 살펴보는 디버깅 in NDC2010
온라인 게임에서 사례로 살펴보는 디버깅 in NDC2010온라인 게임에서 사례로 살펴보는 디버깅 in NDC2010
온라인 게임에서 사례로 살펴보는 디버깅 in NDC2010
 
[NDC2016] TERA 서버의 Modern C++ 활용기
[NDC2016] TERA 서버의 Modern C++ 활용기[NDC2016] TERA 서버의 Modern C++ 활용기
[NDC2016] TERA 서버의 Modern C++ 활용기
 
나만의 엔진 개발하기
나만의 엔진 개발하기나만의 엔진 개발하기
나만의 엔진 개발하기
 
이승재, 실버바인 서버엔진 2 설계 리뷰, NDC2018
이승재, 실버바인 서버엔진 2 설계 리뷰, NDC2018이승재, 실버바인 서버엔진 2 설계 리뷰, NDC2018
이승재, 실버바인 서버엔진 2 설계 리뷰, NDC2018
 
Windows Registered I/O (RIO) vs IOCP
Windows Registered I/O (RIO) vs IOCPWindows Registered I/O (RIO) vs IOCP
Windows Registered I/O (RIO) vs IOCP
 
Ndc14 분산 서버 구축의 ABC
Ndc14 분산 서버 구축의 ABCNdc14 분산 서버 구축의 ABC
Ndc14 분산 서버 구축의 ABC
 
What is Game Server ?
What is Game Server ?What is Game Server ?
What is Game Server ?
 
게임서버프로그래밍 #0 - TCP 및 이벤트 통지모델
게임서버프로그래밍 #0 - TCP 및 이벤트 통지모델게임서버프로그래밍 #0 - TCP 및 이벤트 통지모델
게임서버프로그래밍 #0 - TCP 및 이벤트 통지모델
 
[IGC 2017] 펄어비스 민경인 - Mmorpg를 위한 voxel 기반 네비게이션 라이브러리 개발기
[IGC 2017] 펄어비스 민경인 - Mmorpg를 위한 voxel 기반 네비게이션 라이브러리 개발기[IGC 2017] 펄어비스 민경인 - Mmorpg를 위한 voxel 기반 네비게이션 라이브러리 개발기
[IGC 2017] 펄어비스 민경인 - Mmorpg를 위한 voxel 기반 네비게이션 라이브러리 개발기
 
이무림, Enum의 Boxing을 어찌할꼬? 편리하고 성능좋게 Enum 사용하기, NDC2019
이무림, Enum의 Boxing을 어찌할꼬? 편리하고 성능좋게 Enum 사용하기, NDC2019이무림, Enum의 Boxing을 어찌할꼬? 편리하고 성능좋게 Enum 사용하기, NDC2019
이무림, Enum의 Boxing을 어찌할꼬? 편리하고 성능좋게 Enum 사용하기, NDC2019
 
Python 게임서버 안녕하십니까 : RPC framework 편
Python 게임서버 안녕하십니까 : RPC framework 편Python 게임서버 안녕하십니까 : RPC framework 편
Python 게임서버 안녕하십니까 : RPC framework 편
 
NDC12_Lockless게임서버설계와구현
NDC12_Lockless게임서버설계와구현NDC12_Lockless게임서버설계와구현
NDC12_Lockless게임서버설계와구현
 
Windows IOCP vs Linux EPOLL Performance Comparison
Windows IOCP vs Linux EPOLL Performance ComparisonWindows IOCP vs Linux EPOLL Performance Comparison
Windows IOCP vs Linux EPOLL Performance Comparison
 
[데브루키/141206 박민근] 유니티 최적화 테크닉 총정리
[데브루키/141206 박민근] 유니티 최적화 테크닉 총정리[데브루키/141206 박민근] 유니티 최적화 테크닉 총정리
[데브루키/141206 박민근] 유니티 최적화 테크닉 총정리
 
빌드관리 및 디버깅 (2010년 자료)
빌드관리 및 디버깅 (2010년 자료)빌드관리 및 디버깅 (2010년 자료)
빌드관리 및 디버깅 (2010년 자료)
 
Akka.NET 으로 만드는 온라인 게임 서버 (NDC2016)
Akka.NET 으로 만드는 온라인 게임 서버 (NDC2016)Akka.NET 으로 만드는 온라인 게임 서버 (NDC2016)
Akka.NET 으로 만드는 온라인 게임 서버 (NDC2016)
 
홍성우, 게임 서버의 목차 - 시작부터 출시까지, NDC2019
홍성우, 게임 서버의 목차 - 시작부터 출시까지, NDC2019홍성우, 게임 서버의 목차 - 시작부터 출시까지, NDC2019
홍성우, 게임 서버의 목차 - 시작부터 출시까지, NDC2019
 
게임에서 흔히 쓰이는 최적화 전략 by 엄윤섭 @ 지스타 컨퍼런스 2013
게임에서 흔히 쓰이는 최적화 전략 by 엄윤섭 @ 지스타 컨퍼런스 2013게임에서 흔히 쓰이는 최적화 전략 by 엄윤섭 @ 지스타 컨퍼런스 2013
게임에서 흔히 쓰이는 최적화 전략 by 엄윤섭 @ 지스타 컨퍼런스 2013
 

Similaire à [NDC 2018] 신입 개발자가 알아야 할 윈도우 메모리릭 디버깅

[야생의 땅: 듀랑고]의 식물 생태계를 담당하는 21세기 정원사의 OpenCL 경험담
[야생의 땅: 듀랑고]의 식물 생태계를 담당하는 21세기 정원사의 OpenCL 경험담[야생의 땅: 듀랑고]의 식물 생태계를 담당하는 21세기 정원사의 OpenCL 경험담
[야생의 땅: 듀랑고]의 식물 생태계를 담당하는 21세기 정원사의 OpenCL 경험담Sumin Byeon
 
[NDC 2014] 던전앤파이터 클라이언트 로딩 최적화
[NDC 2014] 던전앤파이터 클라이언트 로딩 최적화[NDC 2014] 던전앤파이터 클라이언트 로딩 최적화
[NDC 2014] 던전앤파이터 클라이언트 로딩 최적화Jaeseung Ha
 
[Unite2015 박민근] 유니티 최적화 테크닉 총정리
[Unite2015 박민근] 유니티 최적화 테크닉 총정리[Unite2015 박민근] 유니티 최적화 테크닉 총정리
[Unite2015 박민근] 유니티 최적화 테크닉 총정리MinGeun Park
 
[박민근] 3 d렌더링 옵티마이징_nv_perfhud
[박민근] 3 d렌더링 옵티마이징_nv_perfhud[박민근] 3 d렌더링 옵티마이징_nv_perfhud
[박민근] 3 d렌더링 옵티마이징_nv_perfhudMinGeun Park
 
[Gpg2권 박민근] 3.2 게임 객체 ai를 위한 마이크로 스레드
[Gpg2권 박민근] 3.2 게임 객체 ai를 위한 마이크로 스레드[Gpg2권 박민근] 3.2 게임 객체 ai를 위한 마이크로 스레드
[Gpg2권 박민근] 3.2 게임 객체 ai를 위한 마이크로 스레드MinGeun Park
 
[UNITE2014] 개발과 출시 경험에 대한 이야기
[UNITE2014] 개발과 출시 경험에 대한 이야기[UNITE2014] 개발과 출시 경험에 대한 이야기
[UNITE2014] 개발과 출시 경험에 대한 이야기형석 서
 
명나리, 에버플래닛 만들던 이야기, 2013
명나리, 에버플래닛 만들던 이야기, 2013명나리, 에버플래닛 만들던 이야기, 2013
명나리, 에버플래닛 만들던 이야기, 2013나리 명
 
레이더즈 기술 사례
레이더즈 기술 사례레이더즈 기술 사례
레이더즈 기술 사례기룡 남
 
[Kgc2013] 모바일 엔진 개발기
[Kgc2013] 모바일 엔진 개발기[Kgc2013] 모바일 엔진 개발기
[Kgc2013] 모바일 엔진 개발기changehee lee
 
[스마트벤처 창업학교] 스타트업 프로젝트를 위한 유니티 게임 개발
[스마트벤처 창업학교] 스타트업 프로젝트를 위한 유니티 게임 개발[스마트벤처 창업학교] 스타트업 프로젝트를 위한 유니티 게임 개발
[스마트벤처 창업학교] 스타트업 프로젝트를 위한 유니티 게임 개발MinGeun Park
 
이원, 절차적 지형 생성과 하이트필드의 사원, NDC2011
이원, 절차적 지형 생성과 하이트필드의 사원, NDC2011이원, 절차적 지형 생성과 하이트필드의 사원, NDC2011
이원, 절차적 지형 생성과 하이트필드의 사원, NDC2011devCAT Studio, NEXON
 
Chrome DevTools로 JS 메모리릭 디버깅하기.pptx
Chrome DevTools로 JS 메모리릭 디버깅하기.pptxChrome DevTools로 JS 메모리릭 디버깅하기.pptx
Chrome DevTools로 JS 메모리릭 디버깅하기.pptxEunsu Kim
 
kgc2014 LINE Rangers/Stage 크래시 및 어뷰징 대응
kgc2014 LINE Rangers/Stage크래시 및 어뷰징 대응kgc2014 LINE Rangers/Stage크래시 및 어뷰징 대응
kgc2014 LINE Rangers/Stage 크래시 및 어뷰징 대응sewoon Nam
 
Concurrency in action - chapter 7
Concurrency in action - chapter 7Concurrency in action - chapter 7
Concurrency in action - chapter 7JinWoo Lee
 
Unity3D로 풀3D web mmorpg 만들기
Unity3D로 풀3D web mmorpg 만들기Unity3D로 풀3D web mmorpg 만들기
Unity3D로 풀3D web mmorpg 만들기JP Jung
 
2D RPG 개발 이론 + 티뮤리티 개발 포스트모템
2D RPG 개발 이론 + 티뮤리티 개발 포스트모템2D RPG 개발 이론 + 티뮤리티 개발 포스트모템
2D RPG 개발 이론 + 티뮤리티 개발 포스트모템WooSung Jeon
 
Ndc2013 정리(upload버전)
Ndc2013 정리(upload버전)Ndc2013 정리(upload버전)
Ndc2013 정리(upload버전)Minsu Park
 
임태현, 서버점검 제로에의 도전, NDC2011
임태현, 서버점검 제로에의 도전, NDC2011임태현, 서버점검 제로에의 도전, NDC2011
임태현, 서버점검 제로에의 도전, NDC2011devCAT Studio, NEXON
 
리소스 중심의 서든어택2 실시간 메모리 프로파일링 시스템 개발기
리소스 중심의 서든어택2 실시간 메모리 프로파일링 시스템 개발기리소스 중심의 서든어택2 실시간 메모리 프로파일링 시스템 개발기
리소스 중심의 서든어택2 실시간 메모리 프로파일링 시스템 개발기Wonha Ryu
 
Cocos2d x a to z (상)
Cocos2d x a to z (상)Cocos2d x a to z (상)
Cocos2d x a to z (상)SeungIl Choi
 

Similaire à [NDC 2018] 신입 개발자가 알아야 할 윈도우 메모리릭 디버깅 (20)

[야생의 땅: 듀랑고]의 식물 생태계를 담당하는 21세기 정원사의 OpenCL 경험담
[야생의 땅: 듀랑고]의 식물 생태계를 담당하는 21세기 정원사의 OpenCL 경험담[야생의 땅: 듀랑고]의 식물 생태계를 담당하는 21세기 정원사의 OpenCL 경험담
[야생의 땅: 듀랑고]의 식물 생태계를 담당하는 21세기 정원사의 OpenCL 경험담
 
[NDC 2014] 던전앤파이터 클라이언트 로딩 최적화
[NDC 2014] 던전앤파이터 클라이언트 로딩 최적화[NDC 2014] 던전앤파이터 클라이언트 로딩 최적화
[NDC 2014] 던전앤파이터 클라이언트 로딩 최적화
 
[Unite2015 박민근] 유니티 최적화 테크닉 총정리
[Unite2015 박민근] 유니티 최적화 테크닉 총정리[Unite2015 박민근] 유니티 최적화 테크닉 총정리
[Unite2015 박민근] 유니티 최적화 테크닉 총정리
 
[박민근] 3 d렌더링 옵티마이징_nv_perfhud
[박민근] 3 d렌더링 옵티마이징_nv_perfhud[박민근] 3 d렌더링 옵티마이징_nv_perfhud
[박민근] 3 d렌더링 옵티마이징_nv_perfhud
 
[Gpg2권 박민근] 3.2 게임 객체 ai를 위한 마이크로 스레드
[Gpg2권 박민근] 3.2 게임 객체 ai를 위한 마이크로 스레드[Gpg2권 박민근] 3.2 게임 객체 ai를 위한 마이크로 스레드
[Gpg2권 박민근] 3.2 게임 객체 ai를 위한 마이크로 스레드
 
[UNITE2014] 개발과 출시 경험에 대한 이야기
[UNITE2014] 개발과 출시 경험에 대한 이야기[UNITE2014] 개발과 출시 경험에 대한 이야기
[UNITE2014] 개발과 출시 경험에 대한 이야기
 
명나리, 에버플래닛 만들던 이야기, 2013
명나리, 에버플래닛 만들던 이야기, 2013명나리, 에버플래닛 만들던 이야기, 2013
명나리, 에버플래닛 만들던 이야기, 2013
 
레이더즈 기술 사례
레이더즈 기술 사례레이더즈 기술 사례
레이더즈 기술 사례
 
[Kgc2013] 모바일 엔진 개발기
[Kgc2013] 모바일 엔진 개발기[Kgc2013] 모바일 엔진 개발기
[Kgc2013] 모바일 엔진 개발기
 
[스마트벤처 창업학교] 스타트업 프로젝트를 위한 유니티 게임 개발
[스마트벤처 창업학교] 스타트업 프로젝트를 위한 유니티 게임 개발[스마트벤처 창업학교] 스타트업 프로젝트를 위한 유니티 게임 개발
[스마트벤처 창업학교] 스타트업 프로젝트를 위한 유니티 게임 개발
 
이원, 절차적 지형 생성과 하이트필드의 사원, NDC2011
이원, 절차적 지형 생성과 하이트필드의 사원, NDC2011이원, 절차적 지형 생성과 하이트필드의 사원, NDC2011
이원, 절차적 지형 생성과 하이트필드의 사원, NDC2011
 
Chrome DevTools로 JS 메모리릭 디버깅하기.pptx
Chrome DevTools로 JS 메모리릭 디버깅하기.pptxChrome DevTools로 JS 메모리릭 디버깅하기.pptx
Chrome DevTools로 JS 메모리릭 디버깅하기.pptx
 
kgc2014 LINE Rangers/Stage 크래시 및 어뷰징 대응
kgc2014 LINE Rangers/Stage크래시 및 어뷰징 대응kgc2014 LINE Rangers/Stage크래시 및 어뷰징 대응
kgc2014 LINE Rangers/Stage 크래시 및 어뷰징 대응
 
Concurrency in action - chapter 7
Concurrency in action - chapter 7Concurrency in action - chapter 7
Concurrency in action - chapter 7
 
Unity3D로 풀3D web mmorpg 만들기
Unity3D로 풀3D web mmorpg 만들기Unity3D로 풀3D web mmorpg 만들기
Unity3D로 풀3D web mmorpg 만들기
 
2D RPG 개발 이론 + 티뮤리티 개발 포스트모템
2D RPG 개발 이론 + 티뮤리티 개발 포스트모템2D RPG 개발 이론 + 티뮤리티 개발 포스트모템
2D RPG 개발 이론 + 티뮤리티 개발 포스트모템
 
Ndc2013 정리(upload버전)
Ndc2013 정리(upload버전)Ndc2013 정리(upload버전)
Ndc2013 정리(upload버전)
 
임태현, 서버점검 제로에의 도전, NDC2011
임태현, 서버점검 제로에의 도전, NDC2011임태현, 서버점검 제로에의 도전, NDC2011
임태현, 서버점검 제로에의 도전, NDC2011
 
리소스 중심의 서든어택2 실시간 메모리 프로파일링 시스템 개발기
리소스 중심의 서든어택2 실시간 메모리 프로파일링 시스템 개발기리소스 중심의 서든어택2 실시간 메모리 프로파일링 시스템 개발기
리소스 중심의 서든어택2 실시간 메모리 프로파일링 시스템 개발기
 
Cocos2d x a to z (상)
Cocos2d x a to z (상)Cocos2d x a to z (상)
Cocos2d x a to z (상)
 

[NDC 2018] 신입 개발자가 알아야 할 윈도우 메모리릭 디버깅

  • 1. 넥슨 코리아 / 마비노기 최동민 /* 신입 개발자가 알아야 할 윈도우 메모리릭 디버깅 */ 서버야, 아프지마
  • 3. 목차 1.중학생 때 즐기던 게임을 서비스 한다는 것 2.Out of Memory 3.Memory Leak 4.Summary
  • 4. • 프로그래머 지망 학부생 • 1~2년 차 프로그래머 발표의 대상
  • 5. • 앞으로 마주칠 메모리 이슈 유형 소개 • 이슈 접근 방법 • 실무 메모리 디버깅에 대한 기초 개념 정립 • 키워드 위주의 정보 전달 (자세한 사항은 구글링) 다룰 것
  • 6. • 발견된 원인에 대한 해결책 • Windows 이외의 개발 환경 • 소프트웨어 공학 다루지 않을 것
  • 7. 1. 중학생 때 즐기던 게임을 서비스 한다는 것
  • 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. 중학생 때 즐기던 게임을 서비스 한다는 것
  • 18. 2. Out of Memory
  • 19. 게임을 하다가 자꾸 메모리가 부족하다면서 팅겨요 RAM 은 남아도는데...
  • 20. • 메모리가 부족한 현상 Out of Memory? 2. Out of Memory
  • 21. • 머신의 물리메모리(RAM)가 부족한 현상? 남은 물리메모리 Out of Memory? 2. Out of Memory
  • 22. • 대부분 프로세스의 가상메모리가 부족한 현상! 작업관리자 Out of Memory 2. Out of Memory
  • 23. • 대부분 컴퓨터 사양 문제가 아닌, 응용 프로그램의 문제 Out of Memory 2. Out of Memory
  • 24. 가상 메모리 • OS 가상 메모리 • 프로세스 가상 메모리 2. Out of Memory
  • 25. OS 가상 메모리 1 GB 메모리 마비노기.exe 2. Out of Memory
  • 26. RAM Disk OS 가상 메모리 0.2 GB 0.8 GB 사용중 노는중 마비노기.exe 2. Out of Memory
  • 27. OS 가상 메모리 • 디스크를 RAM 처럼 사용 • 실제 물리 메모리보다 더 많은 메모리를 프로세스에게 할당 가능 2. Out of Memory
  • 28. RAM Disk OS 가상 메모리 마비, 바람, 서든, 카스, 메이플, 테라, 던파... 2. Out of Memory
  • 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
  • 36. 32bit 유저 모드 가상 메모리 한계 마비노기.exe 유저모드 커널모드 2 GB 2 GB 2. Out of Memory
  • 37. 32bit Windows 를 지원한다. = 가상 메모리 한계가 2GB 이다.
  • 38. 32bit에서 가상 메모리 2GB 초과 시 • malloc • return nullptr • new • throw std::bad_alloc 2. Out of Memory
  • 39. 예제를 돌려봅시다 while (1) { new char[10000]; } 반드시 32bit 프로세스로 테스트 2. Out of Memory
  • 40. 2GB 안 넘었는데 800MB 에서 왜 bad_alloc요?
  • 41. Working Set 832 MB Commit 2 GB 커밋 사이즈 초과 2. Out of Memory
  • 42. RAM Disk NDC.exe 0.2 GB 0.8 GB 사용중 노는중 작업관리자 기준 WorkingSet 작업 집합(Working Set) 2. Out of Memory
  • 44. 2 GB Commit Out of Process Virtual Memory NDC.exe while (1) { new char[10000]; } 2. Out of Memory
  • 45. 게임서버가 64bit 면 Out of Memory는 안 뜨겠네요?
  • 46. 예제를 64bit 프로세스로 돌려봅시다 while (1) { new char[10000]; } 하시던 작업을 모두 저장하십시오. 당신의 컴퓨터가 죽.을.수.도.있.습.니.다 2. Out of Memory
  • 47. • 커밋 크기 한계 돌파 ↗ 64bit 예제 결과 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
  • 55. • 운영체제로부터 동적 할당 받은 메모리가 반환되지 않고, 프로세스의 메모리를 계속 점유하는 현상 Memory Leak 3. Memory Leak
  • 56. 3. Memory Leak 1) 재현 가능한 메모리릭 2) 재현 불가능한 메모리릭
  • 57. • 던전을 돌면… • 특정 스킬을 쓰면… • 특정 UI를 열면… • 특정 지역으로 이동하면… 재현 방법 존재 3. Memory Leak
  • 58. • “스킬창을 열면 메모리가 증가합니다” Case Study : 재현 가능한 메모리릭 3. Memory Leak
  • 59. • “스킬창을 열면 메모리가 증가합니다” Case Study : 재현 가능한 메모리릭 3. Memory Leak 타이틀바 탭 탭 프레임 버튼 아이콘 스킬 리스트 게이지 스크롤 텍스트
  • 60. • “스킬창을 열면 메모리가 증가합니다” Case Study : 재현 가능한 메모리릭 3. Memory Leak 타이틀바 탭 탭 프레임 버튼 아이콘 스킬 리스트 게이지 스크롤 텍스트
  • 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
  • 71. 3. 재현 (스킬창 열기/닫기 x 10) UMDH 사용법 3. Memory Leak
  • 72. 4. 재현 후, 콜스택 별 메모리 할당량 기록 2번과 비교 UMDH 사용법 umdh -pn:Client.exe > log2.txt umdh log1.txt log2.txt > diff.txt 3. Memory Leak
  • 73. • diff.txt 메모리 누수 콜스택 확인 3. Memory Leak
  • 74.
  • 75. 1. 프로그램 실행 후 즉시 블로킹 (_getch() 등..) 2. 데이터 로딩 전 umdh 로깅(log1.txt) 3. 데이터 로딩 4. 데이터 로딩 후 umdh 로깅(log2.txt), 비교(diff.txt) 응용 – 클라/서버 부팅 메모리 사용량 추적 3. Memory Leak
  • 76. = Visual Studio Memory Snapshot 3. Memory Leak VS 2015 부터
  • 77. • VS Dignostics Tool - Memory Snapshot “디버깅, 어디까지 해봤니?” – 김희준님 https://channel9.msdn.com/Events/TechDays/TDK2015/T2-4 • DebugDiag – Memory Analysis • LeakDiag – Virtual Memory Leak Detection • CRT Debug Library https://msdn.microsoft.com/en-us/library/974tc9t1.aspx 생략된 이야기 3. Memory Leak
  • 78. 3. Memory Leak 1) 재현 가능한 메모리릭 2) 재현 불가능한 메모리릭
  • 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
  • 101. 전생에 나라를 구하셨군요 • 누수된 메모리가 가상함수가 있는 객체였다! 3. Memory Leak
  • 102. • 가상함수 테이블 포인터로부터 객체 확인 전생에 나라를 구하셨군요 HEAP_ENTRY Size Prev Flags UserPtr UserSize - state 0000000084933f70 0061 0061 [00] 0000000084933f80 00600 - (busy) GameServer!Character::`vftable' 000000013884b550 0061 0061 [00] 000000013884b560 00600 - (busy) GameServer!Character::`vftable' 000000013884d3a0 0061 0061 [00] 000000013884d3b0 00600 - (busy) GameServer!Character::`vftable' 000000013884e5d0 0061 0061 [00] 000000013884e5e0 00600 - (busy) GameServer!Character::`vftable' 000000013884f800 0061 0061 [00] 000000013884f810 00600 - (busy) GameServer!Character::`vftable' 3. Memory Leak
  • 103. 전생에 나라를 구하셨군요 0000000084933f70 0061 0061 [00] 0000000084933f80 00600 - (busy) GameServer!Character::`vftable' • VS로 덤프를 열고, 포인터를 해당 타입으로 캐스팅 3. Memory Leak
  • 104.
  • 105. • 누수된 메모리가 가상함수가 없는 객체였다. 전생에 나라를 못 구하셨군요.. HEAP_ENTRY Size Prev Flags UserPtr UserSize - state 0000000003a41bb0 0004 0004 [00] 0000000003a41bc0 00030 - (busy) 0000000003a41bf0 0004 0004 [00] 0000000003a41c00 00030 - (busy) 0000000003a41c30 0004 0004 [00] 0000000003a41c40 00030 - (busy) 0000000003a920d0 0004 0004 [00] 0000000003a920e0 00030 - (free) 0000000003a93a20 0004 0004 [00] 0000000003a93a30 00030 - (free) 0000000003aa1630 0004 0004 [00] 0000000003aa1640 00030 - (busy) 0000000003aa17b0 0004 0004 [00] 0000000003aa17c0 00030 - (busy) 0000000003aa1830 0004 0004 [00] 0000000003aa1840 00030 - (busy) 0000000003aa18b0 0004 0004 [00] 0000000003aa18c0 00030 - (busy) 3. Memory Leak
  • 106. • 나라를 구한 케이스 • 착하게 산 케이스 • 망나니 케이스 전생에 덕 많이 쌓으셨나요? 3. Memory Leak
  • 107. • 누수된 메모리 중에 string 이 있었다! 전생에 착하게 사셨군요 3. Memory Leak pair<string, Value> struct Data { int id; EType type; string name; }
  • 108. • String 생성/삭제 부하 감소를 위한 메모리풀 • 별도 Heap 사용 마비노기 게임서버의 String Heap Commit Size 2150000 10.1 GB 20e0000 2.9 GB 3. Memory Leak
  • 109. 특정 Heap이 사용하는 메모리 영역 찾기 3. Memory Leak • !heap 20e0000
  • 110. 특정 Heap이 사용하는 메모리 영역 찾기 3. Memory Leak • !heap 20e0000 로딩 or 캐싱 현재 사용 중
  • 111. 특정 Heap이 사용하는 메모리 영역 찾기 3. Memory Leak • !heap 20e0000 누수된 메모리
  • 112. 특정 Heap이 사용하는 메모리 영역 찾기 3. Memory Leak • !heap 20e0000
  • 113. • 누수된 String 데이터 확인 관련 코드/데이터 추적 VS 메모리창 3. Memory Leak
  • 114. • 누수된 메모리 중에 String 이 없었다... 전생에 착하게 좀 사시지 3. Memory Leak
  • 115. • 나라를 구한 케이스 • 착하게 산 케이스 • 망나니 케이스 전생에 덕 많이 쌓으셨나요? 3. Memory Leak
  • 116. • 누수된 메모리만이 남아 있을 뿐이었다. 혹시 전생에...(말잇못) HEAP_ENTRY Size Prev Flags UserPtr UserSize - state 0000000003a41bb0 0004 0004 [00] 0000000003a41bc0 00030 - (busy) 0000000003a41bf0 0004 0004 [00] 0000000003a41c00 00030 - (busy) 0000000003a41c30 0004 0004 [00] 0000000003a41c40 00030 - (busy) 0000000003a920d0 0004 0004 [00] 0000000003a920e0 00030 - (free) 0000000003a93a20 0004 0004 [00] 0000000003a93a30 00030 - (free) 0000000003aa1630 0004 0004 [00] 0000000003aa1640 00030 - (busy) 0000000003aa17b0 0004 0004 [00] 0000000003aa17c0 00030 - (busy) 0000000003aa1830 0004 0004 [00] 0000000003aa1840 00030 - (busy) 0000000003aa18b0 0004 0004 [00] 0000000003aa18c0 00030 - (busy) 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
  • 121. QnA
  • 123. • “네이티브 코드 디버깅” - MSDN https://msdn.microsoft.com/ko-kr/library/k70yt3e2.aspx • “빌드 관리 및 디버깅” - 유영천님 https://www.slideshare.net/dgtman/2010-85789722 • “실전 윈도우 디버깅” - MARIO HEWARDT book 생략된 이야기 & Reference 3. Memory Leak