Successfully reported this slideshow.
Your SlideShare is downloading. ×
NDC 2018 서버야, 아프지마 - 신입 개발자가 알아야 할 윈도우 메모리릭 디버깅
Programmer at 넥슨 (NEXON KOREA)
NDC 2018 서버야, 아프지마 - 신입 개발자가 알아야 할 윈도우 메모리릭 디버깅
More Related Content
- 1. 넥슨 코리아 / 마비노기 최동민 /* 신입 개발자가 알아야 할 윈도우 메모리릭 디버깅 */ 서버야, 아프지마
- 2. 발표자 소개 프로그래머 최동민 마비노기 2014.10 ~
- 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 //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 //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
- 35. 32bit인데 4GB 아니고 왜 2GB요?
- 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
- 43. RAM Disk 작업관리자 기준 1 GB 사용중 + 노는중 커밋(Commit) Commit NDC.exe 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 개념 잡기” – 송창규님 //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
- 53. 이 중에 어디서 새는거죠?
- 54. 3. Memory Leak
- 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 타이틀바 탭 탭 프레임 버튼 아이콘 스킬 리스트 게이지 스크롤 텍스트
- 61. 이 중에 어디서 새는거죠?
- 62. 어디서 = 콜스택
- 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
- 67. 이걸 만들어야 된다고요?
- 68. 그럴리가요 가 있잖아요
- 69. • User Mode Dump Heap • 특정 프로세스의 동적 할당 메모리 분석 • Windows SDK 에 포함 • 심볼 경로 설정 : _NT_SYMBOL_PATH 환경변수 UMDH.exe //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. 1. 프로그램 실행 후 즉시 블로킹 (_getch() 등..) 2. 데이터 로딩 전 umdh 로깅(log1.txt) 3. 데이터 로딩 4. 데이터 로딩 후 umdh 로깅(log2.txt), 비교(diff.txt) 응용 – 클라/서버 부팅 메모리 사용량 추적 3. Memory Leak
- 75. = Visual Studio Memory Snapshot 3. Memory Leak VS 2015 부터
- 76. • VS Dignostics Tool - Memory Snapshot “디버깅, 어디까지 해봤니?” – 김희준님 //channel9.msdn.com/Events/TechDays/TDK2015/T2-4 • DebugDiag – Memory Analysis • LeakDiag – Virtual Memory Leak Detection • CRT Debug Library //msdn.microsoft.com/en-us/library/974tc9t1.aspx 생략된 이야기 3. Memory Leak
- 77. 3. Memory Leak 1) 재현 가능한 메모리릭 2) 재현 불가능한 메모리릭
- 78. 6 GB 메모리릭 발생 시 16 GB 기울기 무엇? 평소 점검 전 Case Study : 게임서버 메모리릭 3. Memory Leak
- 79. 6 GB 메모리릭 발생 시 16 GB 기울기 무엇? 평소 점검 전 Case Study : 게임서버 메모리릭 3. Memory Leak
- 80. • 서버 부팅 직후부터 메모리가 1시간에 60MB씩 추가로 증가 → 7일 x 24시간 x 60MB = 10GB • 일반적으로 5분 동안 처리하는 메세지 수(스케줄링 포함) → 약 100만개 • 1시간 동안 NPC를 포함한 모든 유저의 행동을 로컬에 재현? → 현재로선 불가 재현 불가능한 이유 3. Memory Leak
- 81. UMDH 가 있는데 무슨 걱정? 정식 서버에 UMDH 붙이면 되겠네! 3. Memory Leak
- 82. 09:45 테섭 부팅 시작합니다. 09:53 테섭이 너무 안뜨네요. 10:00 꿈도 희망도 없군요.. 아직 데이터 로딩중.. 13:56 테섭 프리징 아니에요 열심히 일하고 있습니다 ㅜ.ㅜ 17:20 더이상은.. 테섭 이만 내리겠습니다.. 정식 게임 서버에 UMDH? 3. Memory Leak
- 83. • 테스트 서버 반응성 플레이 불가능한 수준으로 하락 • 정식 게임 서버에 적용 불가 판단 • 성능이 비교적 중요하지 않거나, 로드 밸런싱 가능한 서버에만 적용 가능 심각한 성능 저하 3. Memory Leak
- 84. 뭔가 방법이 없을까?
- 85. 싱싱한 풀덤프가 있었지!
- 86. • 특정 시점의 프로그램 작업 상태를 기록한 파일 • 크래시, 프리징 등 다양한 문제 상황 분석에 활용 • 풀덤프 : 모든 메모리 정보 포함 • 누수된 메모리도 이 안에 포함 덤프 3. Memory Leak
- 87. • Windows용 다용도 디버거 • Windows SDK 에 포함 • 많고 많은 기능 중에 우리가 사용할 기능 : Heap 분석 WinDBG.exe 3. Memory Leak //docs.microsoft.com/en-us/windows-hardware/drivers/debugger/getting-started-with-windows-debugging
- 88. 1. WinDBG 로 덤프를 열고, 심볼 경로를 설정 2. 전체적인 Heap 상황 확인 3. 누수가 발생한 힙에서 메모리 크기 별 할당횟수 집계 4. 가장 많이 할당된 크기의 메모리 블록 모두 검색 풀덤프 Heap 분석 3. Memory Leak
- 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 로 덤프를 열고, 심볼 경로를 설정 풀덤프 Heap 분석 자세한 설명은 구글링! 3. Memory Leak
- 93. 2. 전체적인 Heap 상황 확인 풀덤프 Heap 분석 !heap -s 3. Memory Leak
- 94. 2. 전체적인 Heap 상황 확인 풀덤프 Heap 분석 특정 Heap들이 다른 Heap 보다 월등히 큼 3. Memory Leak
- 95. 2. 전체적인 Heap 상황 확인 풀덤프 Heap 분석 특정 Heap들이 다른 Heap 보다 월등히 큼 Heap Commit Size 2150000 10.1 GB 20e0000 2.9 GB ... 3. Memory Leak
- 96. 2. 전체적인 Heap 상황 확인 풀덤프 Heap 분석 Heap Commit Size 2150000 10.1 GB 20e0000 2.9 GB 누수가 가장 심한 heap 주소 기억! ... 3. Memory Leak
- 97. 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
- 98. 4. 가장 많이 할당된 크기의 메모리 블록 모두 검색 풀덤프 Heap 분석 !heap -flt s 30 3. Memory Leak ?
- 99. • 나라를 구한 케이스 • 착하게 산 케이스 • 망나니 케이스 전생에 덕 많이 쌓으셨나요? 3. Memory Leak
- 100. 전생에 나라를 구하셨군요 • 누수된 메모리가 가상함수가 있는 객체였다! 3. Memory Leak
- 101. • 가상함수 테이블 포인터로부터 객체 확인 전생에 나라를 구하셨군요 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
- 102. 전생에 나라를 구하셨군요 0000000084933f70 0061 0061 [00] 0000000084933f80 00600 - (busy) GameServer!Character::`vftable' • VS로 덤프를 열고, 포인터를 해당 타입으로 캐스팅 3. Memory Leak
- 103. • 누수된 메모리가 가상함수가 없는 객체였다. 전생에 나라를 못 구하셨군요.. 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
- 104. • 나라를 구한 케이스 • 착하게 산 케이스 • 망나니 케이스 전생에 덕 많이 쌓으셨나요? 3. Memory Leak
- 105. • 누수된 메모리 중에 string 이 있었다! 전생에 착하게 사셨군요 3. Memory Leak pair<string, Value> struct Data { int id; EType type; string name; }
- 106. • String 생성/삭제 부하 감소를 위한 메모리풀 • 별도 Heap 사용 마비노기 게임서버의 String Heap Commit Size 2150000 10.1 GB 20e0000 2.9 GB 3. Memory Leak
- 107. 특정 Heap이 사용하는 메모리 영역 찾기 3. Memory Leak • !heap 20e0000
- 108. 특정 Heap이 사용하는 메모리 영역 찾기 3. Memory Leak • !heap 20e0000 로딩 or 캐싱 현재 사용 중
- 109. 특정 Heap이 사용하는 메모리 영역 찾기 3. Memory Leak • !heap 20e0000 누수된 메모리
- 110. 특정 Heap이 사용하는 메모리 영역 찾기 3. Memory Leak • !heap 20e0000
- 111. • 누수된 String 데이터 확인 관련 코드/데이터 추적 VS 메모리창 3. Memory Leak
- 112. • 누수된 메모리 중에 String 이 없었다... 전생에 착하게 좀 사시지 3. Memory Leak
- 113. • 나라를 구한 케이스 • 착하게 산 케이스 • 망나니 케이스 전생에 덕 많이 쌓으셨나요? 3. Memory Leak
- 114. • 누수된 메모리만이 남아 있을 뿐이었다. 혹시 전생에...(말잇못) 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
- 115. • 서버 코드에 메모리 할당/해제 Hook 설정 (성능 저하 – 로컬이나 테스트서버에서만 사용) • 같은 사이즈의 객체들이 주로 어디서 할당되는지 확인 • 특히 할당 사이즈가 유니크할 경우 유용 _CrtSetAllocHook() “온라인 게임에서 사례로 살펴보는 디버깅” - 박일님 //www.slideshare.net/parkpd/in-ndc2010 3. Memory Leak
- 116. • 누수된 메모리 블럭 내 데이터 구조 분석/추적 • 내부 테스트서버에 UMDH 적용 • 문제 발생 시점에 투입된 변경점 전체 코드 리뷰 • 메모리 증가 시점의 유저 행동 로그 분석 그 이외의 시도 3. Memory Leak
- 117. 4. Summary
- 118. • 32bit 윈도우를 지원하면 가상 메모리 한계는 2GB이다. • 메모리 이슈를 분석할 때에는 더 나은 도구로 Commit Size 를 포함한 여러 지표를 확인하자. • 재현 가능한 메모리릭은 UMDH등의 툴을 이용해서 디버깅하자. • 재현 불가능한 메모리릭은 windbg로 풀덤프 Heap 분석을 시도해보자. Summary
- 119. QnA
- 120. 자나깨나 메모리 조심 -끝-
- 121. • “네이티브 코드 디버깅” - MSDN //msdn.microsoft.com/ko-kr/library/k70yt3e2.aspx • “빌드 관리 및 디버깅” - 유영천님 //www.slideshare.net/dgtman/2010-85789722 • “실전 윈도우 디버깅” - MARIO HEWARDT book 생략된 이야기 & Reference 3. Memory Leak