Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

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

NDC 2018 서버야, 아프지마 - 신입 개발자가 알아야 할 윈도우 메모리릭 디버깅

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

  1. 1. 넥슨 코리아 / 마비노기 최동민 /* 신입 개발자가 알아야 할 윈도우 메모리릭 디버깅 */ 서버야, 아프지마
  2. 2. 발표자 소개 프로그래머 최동민 마비노기 2014.10 ~
  3. 3. 목차 1.중학생 때 즐기던 게임을 서비스 한다는 것 2.Out of Memory 3.Memory Leak 4.Summary
  4. 4. • 프로그래머 지망 학부생 • 1~2년 차 프로그래머 발표의 대상
  5. 5. • 앞으로 마주칠 메모리 이슈 유형 소개 • 이슈 접근 방법 • 실무 메모리 디버깅에 대한 기초 개념 정립 • 키워드 위주의 정보 전달 (자세한 사항은 구글링) 다룰 것
  6. 6. • 발견된 원인에 대한 해결책 • Windows 이외의 개발 환경 • 소프트웨어 공학 다루지 않을 것
  7. 7. 1. 중학생 때 즐기던 게임을 서비스 한다는 것
  8. 8. 때는 바야흐로 마비노기 10주년 흔한 마비노기 유저 15살 중학교 3학년 프로그래머 타이틀을 획득하셨습니다. 25 세 1. 중학생 때 즐기던 게임을 서비스 한다는 것
  9. 9. 입사 전 예상 했던 것 왔구나 애송이.. xx년차 개발자 1. 중학생 때 즐기던 게임을 서비스 한다는 것
  10. 10. 입사 후 놀랐던 것 • 젊은 사우분들(!) • 체계적인 신입 교육 프로세스 • 지속적인 개발 환경 개선 • 개방적인 개발 문화 1. 중학생 때 즐기던 게임을 서비스 한다는 것
  11. 11. 입사 후 첫 위기 • 신규 던전 투입 후 메모리 부족(Out of Memory) 클라이언트 크래시 제가 고쳐보겠습니다!! * 개방적인 개발 문화 1. 중학생 때 즐기던 게임을 서비스 한다는 것
  12. 12. 사막에서 바늘 찾기 • 14년 서비스의 유산 : 압도적인 코드량 1. 중학생 때 즐기던 게임을 서비스 한다는 것
  13. 13. 사막에서 바늘을 찾는 법 1 • 대상에 대한 정확한 이해 1. 중학생 때 즐기던 게임을 서비스 한다는 것
  14. 14. 대상에 대한 이해가 부족할 경우 • “RAM은 충분한데 왜 std::bad_alloc이 나지..?” • “내 컴퓨터에서는 크래시 안나는데?” • “유저 분 컴퓨터가 안 좋아서 그런가 보다.” 1. 중학생 때 즐기던 게임을 서비스 한다는 것
  15. 15. 사막에서 바늘을 찾는 법 2 • 적절한 도구 사용 1. 중학생 때 즐기던 게임을 서비스 한다는 것
  16. 16. 적절한 도구를 찾지 못했을 경우 • “이 함수가 의심스럽네! 사용하는 부분을 찾아봐야 겠다.” • “이번 주에 투입된 코드 변경점들을 모두 리뷰 해보자!” * [사도 제바흐]에서 특정 스킬 사용 시 제바흐의 스킬이 비정상적으로 작동하던 문제가 수정됩니다. * [사도 제바흐] 어려움 난이도에 [전이의 카탈리스트]가 보상으로 추가됩니다. * [사도 제바흐] 어려움 난이도의 신성 경험치 보상과 하루 획득 가능한 신성 경험치가 증가합니다. * 아발론 필드 레이드, 아발론 정화 미션, 사도 하시딤 레이드에서 획득할 수 있는 일부 보상 아이템을 분해하여 신성한 광물 조각을 획득할 수 있습니다. • 필드 레이드 진행 중, 펫을 부활시켜 공헌도를 얻을 수 있던 문제가 수정됩니다. * 아발론 필드 레이드 보상 지급 조건이 조정됩니다. * [유니콘과 함께 아발론을 누빈] 타이틀이 추가됩니다. * 아발론 전 지역의 문게이트가 스마트 콘텐츠에 추가됩니다. * 아발론 경계지에서 [변이된 곰], [변이된 늑대], [변이된 멧돼지] 공격 시, 몬스터가 다운되지 않던 문제가 수정됩니다. * [디바인 신시엘라크 L2]의 특별 개조 이펙트가 출력되지 않던 문제가 수정됩니다. * 스킬, 퀘스트의 드래곤 관련 항목이 실반 드래곤에게 적용되지 않던 문제가 수정됩니다. * [아켈론 크라우칭] 스킬을 사용한 상태에서 아켈론이 연속으로 공격당할 때 체력이 감소하는 것처럼 보이던 문제가 수정됩니다. * [이네스]의 [해안 정화에 대해] 키워드에 설명이 추가됩니다. * [아발론 해안 정화] 미션에 미션 설명이 추가됩니다. 변신 메달 교환권으로 교환할 수 있는 변신 메달 종류가 추가됩니다. * 낭만 농장 안에서 스마트 콘텐츠로 이동하면 동물 캐릭터에 탑승한 다른 캐릭터도 함께 이동되던 문제가 수정됩니다. * 낭만 농장에 진입 시 간헐적으로 클라이언트가 종료되던 문제가 수정됩니다. * 드레스룸을 열고 하우징 방 문을 클릭하면 간헐적으로 클라이언트가 종료되던 문제가 수정됩니다. * 캠프파이어 스킬을 배우지 않은 상태로 모닥불에 향초를 태우면 클라이언트가 종료되던 문제가 수정됩니다. * 평판 보상으로 중첩된 비정상적인 능력치가 원래의 능력치로 돌아옵니다. * 엘프 캐릭터가 문라이트 낭만 비행 사용 시, 일부 이펙트가 나오지 않던 문제가 수정됩니다. * 엘프 캐릭터로 동성 캐릭터와 [문라이트 낭만 비행] 함께 날기를 하면 한 캐릭터가 땅에 묻혀 보이던 문제가 수정됩니다. * 낭만 비행 액션 사용 중 함께 날기 요청을 받은 캐릭터가 전투모드로 전환했을 때 모션이 어색해 보이던 문제가 수정됩니다. * 두근두근 아일랜드 천 염색 시 마우스 커서 모양이 변경됩니다. * 두근두근 아일랜드 해안가의 일부 지형이 비정상적으로 보이던 문제가 수정됩니다. * 일요일에 마법 악보를 연주하면 항상 성공하던 문제가 수정됩니다. * 자동 생산 시도 중 장비 스왑으로 생산이 불가능할 경우에도 자동 생산이 지속되던 문제가 수정됩니다. * 길드전 승리 보상인 [순간이동 책(던바튼)], [순간이동 책(티르 코네일)] 아이템이 만료 후에도 사용할 수 있던 문제가 수정됩니다. * 자이언트 캐릭터로 [별의 상흔] 퀘스트 진행 중 NPC의 모션이 잘못 출력되던 문제가 수정됩니다. * [폐허의 갈까마귀] 퀘스트 완료 후 [무대 밖의 손] 퀘스트를 습득하기 전, 기사단 NPC들이 곳곳에 배치되도록 수정됩니다. * [수호자의 길] 퀘스트 중, 이신화 하지 않고 NPC와 대화 시 포트레이트가 나오지 않던 문제가 수정됩니다. * [씨줄과 날줄] 퀘스트 정보에서 아벨린 포트레이트가 단발이 아니던 문제가 수정됩니다. * [새로운 신성] 퀘스트 중, 멀린 대사의 오탈자가 수정됩니다. * 아발론 게이트 BGM이 안나오던 문제가 수정됩니다. * 퀘스트 진행 중, 성소 날씨가 변경되던 문제가 수정됩니다. * 일부 컷신에서 자이언트 캐릭터의 이름이 출력되지 않던 문제가 수정됩니다. * G21 메인스트림 1부 일부 대사에서 NPC 알터의 표정이 어색하던 문제가 수정됩니다. * 이신화 상태에서 간헐적으로 [루인 오브 노바]를 사용해도 변신 쿨타임이 동작하지 않던 문제가 수정됩니다. * 이신화 변신 중 승단 미션 진입 시 이신화 변신이 해제되도록 수정됩니다. * 이신화 변신 중 특별조[부상 치료] 미션 진입 시 이신화 변신이 해제되도록 수정됩니다. * 마법의 장난 상태에서 이신화 변신 시 움직일 수 없던 문제가 수정됩니다. * 드레스룸에서 [상냥한 입술]이 두껍게 나오던 문제가 수정됩니다. * 체인 블레이드, 너클을 착용한 상태에서 [악기관리], [수업준비] 제스처 사용 시 일부 물체가 보이지 않던 문제가 수정됩니다. 1. 중학생 때 즐기던 게임을 서비스 한다는 것
  17. 17. 이번 세션에서 알아볼 내용 • 메모리릭이 발생했을 때의 증상 • 재현 가능 여부에 따른 메모리릭 추적 방법 1. 중학생 때 즐기던 게임을 서비스 한다는 것
  18. 18. 2. Out of Memory
  19. 19. 게임을 하다가 자꾸 메모리가 부족하다면서 팅겨요 RAM 은 남아도는데...
  20. 20. • 메모리가 부족한 현상 Out of Memory? 2. Out of Memory
  21. 21. • 머신의 물리메모리(RAM)가 부족한 현상? 남은 물리메모리 Out of Memory? 2. Out of Memory
  22. 22. • 대부분 프로세스의 가상메모리가 부족한 현상! 작업관리자 Out of Memory 2. Out of Memory
  23. 23. • 대부분 컴퓨터 사양 문제가 아닌, 응용 프로그램의 문제 Out of Memory 2. Out of Memory
  24. 24. 가상 메모리 • OS 가상 메모리 • 프로세스 가상 메모리 2. Out of Memory
  25. 25. OS 가상 메모리 1 GB 메모리 마비노기.exe 2. Out of Memory
  26. 26. RAM Disk OS 가상 메모리 0.2 GB 0.8 GB 사용중 노는중 마비노기.exe 2. Out of Memory
  27. 27. OS 가상 메모리 • 디스크를 RAM 처럼 사용 • 실제 물리 메모리보다 더 많은 메모리를 프로세스에게 할당 가능 2. Out of Memory
  28. 28. RAM Disk OS 가상 메모리 마비, 바람, 서든, 카스, 메이플, 테라, 던파... 2. Out of Memory
  29. 29. 가상 메모리 • OS 가상 메모리 • 프로세스 가상 메모리 2. Out of Memory
  30. 30. 프로세스 가상 메모리 바람의나라.exe 마비노기.exe 메이플스토리.exe 4G 번지 2. Out of Memory 0 번지 4G 번지 0 번지0 번지 4G 번지
  31. 31. 프로세스 가상 메모리 • OS가 프로세스에게 할당한 논리적인 주소 공간 • 다른 프로세스와는 독립적 • 32bit = 경우의 수 𝟐 𝟑𝟐 = 4GB (이론상) • 64bit = 경우의 수 𝟐 𝟔𝟒 = 16EB (이론상) 2. Out of Memory
  32. 32. 프로세스 가상 메모리 한계 • RAM 이 얼마나 설치되어 있는가 • 프로세스 플랫폼(32bit, 64bit)에 따라 • 운영체제 버전(x86, x64)에 따라 2. Out of Memory
  33. 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. 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
  35. 35. 32bit인데 4GB 아니고 왜 2GB요?
  36. 36. 32bit 유저 모드 가상 메모리 한계 마비노기.exe 유저모드 커널모드 2 GB 2 GB 2. Out of Memory
  37. 37. 32bit Windows 를 지원한다. = 가상 메모리 한계가 2GB 이다.
  38. 38. 32bit에서 가상 메모리 2GB 초과 시 • malloc • return nullptr • new • throw std::bad_alloc 2. Out of Memory
  39. 39. 예제를 돌려봅시다 while (1) { new char[10000]; } 반드시 32bit 프로세스로 테스트 2. Out of Memory
  40. 40. 2GB 안 넘었는데 800MB 에서 왜 bad_alloc요?
  41. 41. Working Set 832 MB Commit 2 GB 커밋 사이즈 초과 2. Out of Memory
  42. 42. RAM Disk NDC.exe 0.2 GB 0.8 GB 사용중 노는중 작업관리자 기준 WorkingSet 작업 집합(Working Set) 2. Out of Memory
  43. 43. RAM Disk 작업관리자 기준 1 GB 사용중 + 노는중 커밋(Commit) Commit NDC.exe 2. Out of Memory
  44. 44. 2 GB Commit Out of Process Virtual Memory NDC.exe while (1) { new char[10000]; } 2. Out of Memory
  45. 45. 게임서버가 64bit 면 Out of Memory는 안 뜨겠네요?
  46. 46. 예제를 64bit 프로세스로 돌려봅시다 while (1) { new char[10000]; } 하시던 작업을 모두 저장하십시오. 당신의 컴퓨터가 죽.을.수.도.있.습.니.다 2. Out of Memory
  47. 47. • 커밋 크기 한계 돌파 ↗ 64bit 예제 결과 2. Out of Memory
  48. 48. 메모리 증가 영향 • 페이지 폴트 • 캐시 미스 • 퍼포먼스 2. Out of Memory
  49. 49. Out of Memory 의 원인들 • Commit 으로 인한 가상 메모리 고갈 • Reserve 로 인한 가상 메모리 고갈 • Page File Limit 초과 • 단편화 ... Memory Leak 2. Out of Memory
  50. 50. 정확한 원인 측정 : 다양한 관측 도구 & 정보 활용 • Process Explorer • VMMap 2. Out of Memory
  51. 51. 생략된 이야기 • “Windows System – memory 개념 잡기” – 송창규님 https://www.slideshare.net/innover/windows-system-memory 2. Out of Memory
  52. 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. 53. 이 중에 어디서 새는거죠?
  54. 54. 3. Memory Leak
  55. 55. • 운영체제로부터 동적 할당 받은 메모리가 반환되지 않고, 프로세스의 메모리를 계속 점유하는 현상 Memory Leak 3. Memory Leak
  56. 56. 3. Memory Leak 1) 재현 가능한 메모리릭 2) 재현 불가능한 메모리릭
  57. 57. • 던전을 돌면… • 특정 스킬을 쓰면… • 특정 UI를 열면… • 특정 지역으로 이동하면… 재현 방법 존재 3. Memory Leak
  58. 58. • “스킬창을 열면 메모리가 증가합니다” Case Study : 재현 가능한 메모리릭 3. Memory Leak
  59. 59. • “스킬창을 열면 메모리가 증가합니다” Case Study : 재현 가능한 메모리릭 3. Memory Leak 타이틀바 탭 탭 프레임 버튼 아이콘 스킬 리스트 게이지 스크롤 텍스트
  60. 60. • “스킬창을 열면 메모리가 증가합니다” Case Study : 재현 가능한 메모리릭 3. Memory Leak 타이틀바 탭 탭 프레임 버튼 아이콘 스킬 리스트 게이지 스크롤 텍스트
  61. 61. 이 중에 어디서 새는거죠?
  62. 62. 어디서 = 콜스택
  63. 63. 1. 동적 할당이 일어나는 콜스택 별로, 메모리 블록의 시작 번지, 할당 크기 수집 2. 재현 전, 콜스택 별 메모리 할당량 기록 3. 재현 (스킬창 열기/닫기 x 10) 4. 재현 후, 콜스택 별 메모리 할당량 기록, 2번과 비교 메모리릭 디버깅 전략 3. Memory Leak
  64. 64. 1. 동적 할당이 일어나는 콜스택 별로, 할당 횟수, 해제 횟수, 할당 크기 수집 2. 재현 전, 콜스택 별 메모리 할당량 기록 3. 재현 (스킬창 열기/닫기 x 10) 4. 재현 후, 콜스택 별 메모리 할당량 기록, 2번과 비교 메모리릭 디버깅 전략 3. Memory Leak
  65. 65. 1. 동적 할당이 일어나는 콜스택 별로, 할당 횟수, 해제 횟수, 할당 크기 수집 2. 재현 전, 콜스택 별 메모리 할당량 기록 3. 재현 (스킬창 열기/닫기 x 10) 4. 재현 후, 콜스택 별 메모리 할당량 기록, 2번과 비교 메모리릭 디버깅 전략 3. Memory Leak
  66. 66. 1. 동적 할당이 일어나는 콜스택 별로, 할당 횟수, 해제 횟수, 할당 크기 수집 2. 재현 전, 콜스택 별 메모리 할당량 기록 3. 재현 (스킬창 열기/닫기 x 10) 4. 재현 후, 콜스택 별 메모리 할당량 기록, 2번과 비교 메모리릭 디버깅 전략 3. Memory Leak
  67. 67. 이걸 만들어야 된다고요?
  68. 68. 그럴리가요 가 있잖아요
  69. 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. 70. 1. 동적 할당이 일어나는 콜스택 별로, 메모리 블록의 시작 번지, 할당 크기 수집 2. 재현 전, 콜스택 별 메모리 할당량 기록 UMDH 사용법 gflags /i Client.exe +ust umdh -pn:Client.exe > log1.txt 3. Memory Leak
  71. 71. 3. 재현 (스킬창 열기/닫기 x 10) UMDH 사용법 3. Memory Leak
  72. 72. 4. 재현 후, 콜스택 별 메모리 할당량 기록 2번과 비교 UMDH 사용법 umdh -pn:Client.exe > log2.txt umdh log1.txt log2.txt > diff.txt 3. Memory Leak
  73. 73. • diff.txt 메모리 누수 콜스택 확인 3. Memory Leak
  74. 74. 1. 프로그램 실행 후 즉시 블로킹 (_getch() 등..) 2. 데이터 로딩 전 umdh 로깅(log1.txt) 3. 데이터 로딩 4. 데이터 로딩 후 umdh 로깅(log2.txt), 비교(diff.txt) 응용 – 클라/서버 부팅 메모리 사용량 추적 3. Memory Leak
  75. 75. = Visual Studio Memory Snapshot 3. Memory Leak VS 2015 부터
  76. 76. • 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
  77. 77. 3. Memory Leak 1) 재현 가능한 메모리릭 2) 재현 불가능한 메모리릭
  78. 78. 6 GB 메모리릭 발생 시 16 GB 기울기 무엇? 평소 점검 전 Case Study : 게임서버 메모리릭 3. Memory Leak
  79. 79. 6 GB 메모리릭 발생 시 16 GB 기울기 무엇? 평소 점검 전 Case Study : 게임서버 메모리릭 3. Memory Leak
  80. 80. • 서버 부팅 직후부터 메모리가 1시간에 60MB씩 추가로 증가 → 7일 x 24시간 x 60MB = 10GB • 일반적으로 5분 동안 처리하는 메세지 수(스케줄링 포함) → 약 100만개 • 1시간 동안 NPC를 포함한 모든 유저의 행동을 로컬에 재현? → 현재로선 불가 재현 불가능한 이유 3. Memory Leak
  81. 81. UMDH 가 있는데 무슨 걱정? 정식 서버에 UMDH 붙이면 되겠네! 3. Memory Leak
  82. 82. 09:45 테섭 부팅 시작합니다. 09:53 테섭이 너무 안뜨네요. 10:00 꿈도 희망도 없군요.. 아직 데이터 로딩중.. 13:56 테섭 프리징 아니에요 열심히 일하고 있습니다 ㅜ.ㅜ 17:20 더이상은.. 테섭 이만 내리겠습니다.. 정식 게임 서버에 UMDH? 3. Memory Leak
  83. 83. • 테스트 서버 반응성 플레이 불가능한 수준으로 하락 • 정식 게임 서버에 적용 불가 판단 • 성능이 비교적 중요하지 않거나, 로드 밸런싱 가능한 서버에만 적용 가능 심각한 성능 저하 3. Memory Leak
  84. 84. 뭔가 방법이 없을까?
  85. 85. 싱싱한 풀덤프가 있었지!
  86. 86. • 특정 시점의 프로그램 작업 상태를 기록한 파일 • 크래시, 프리징 등 다양한 문제 상황 분석에 활용 • 풀덤프 : 모든 메모리 정보 포함 • 누수된 메모리도 이 안에 포함 덤프 3. Memory Leak
  87. 87. • Windows용 다용도 디버거 • Windows SDK 에 포함 • 많고 많은 기능 중에 우리가 사용할 기능 : Heap 분석 WinDBG.exe 3. Memory Leak https://docs.microsoft.com/en-us/windows-hardware/drivers/debugger/getting-started-with-windows-debugging
  88. 88. 1. WinDBG 로 덤프를 열고, 심볼 경로를 설정 2. 전체적인 Heap 상황 확인 3. 누수가 발생한 힙에서 메모리 크기 별 할당횟수 집계 4. 가장 많이 할당된 크기의 메모리 블록 모두 검색 풀덤프 Heap 분석 3. Memory Leak
  89. 89. 1. WinDBG 로 덤프를 열고, 심볼 경로를 설정 2. 전체적인 Heap 상황 확인 3. 누수가 발생한 힙에서 메모리 크기 별 할당횟수 집계 4. 가장 많이 할당된 크기의 메모리 블록 모두 검색 풀덤프 Heap 분석 3. Memory Leak
  90. 90. 1. WinDBG 로 덤프를 열고, 심볼 경로를 설정 2. 전체적인 Heap 상황 확인 3. 누수가 발생한 힙에서 할당 사이즈 별 개수 통계 4. 가장 많이 할당된 크기의 메모리 블록 모두 검색 풀덤프 Heap 분석 3. Memory Leak
  91. 91. 1. WinDBG 로 덤프를 열고, 심볼 경로를 설정 2. 전체적인 Heap 상황 확인 3. 누수가 발생한 힙에서 메모리 크기 별 할당횟수 집계 4. 가장 많이 할당된 크기의 메모리 블록 모두 검색 풀덤프 Heap 분석 3. Memory Leak
  92. 92. 1. WinDBG 로 덤프를 열고, 심볼 경로를 설정 풀덤프 Heap 분석 자세한 설명은 구글링! 3. Memory Leak
  93. 93. 2. 전체적인 Heap 상황 확인 풀덤프 Heap 분석 !heap -s 3. Memory Leak
  94. 94. 2. 전체적인 Heap 상황 확인 풀덤프 Heap 분석 특정 Heap들이 다른 Heap 보다 월등히 큼 3. Memory Leak
  95. 95. 2. 전체적인 Heap 상황 확인 풀덤프 Heap 분석 특정 Heap들이 다른 Heap 보다 월등히 큼 Heap Commit Size 2150000 10.1 GB 20e0000 2.9 GB ... 3. Memory Leak
  96. 96. 2. 전체적인 Heap 상황 확인 풀덤프 Heap 분석 Heap Commit Size 2150000 10.1 GB 20e0000 2.9 GB 누수가 가장 심한 heap 주소 기억! ... 3. Memory Leak
  97. 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. 98. 4. 가장 많이 할당된 크기의 메모리 블록 모두 검색 풀덤프 Heap 분석 !heap -flt s 30 3. Memory Leak ?
  99. 99. • 나라를 구한 케이스 • 착하게 산 케이스 • 망나니 케이스 전생에 덕 많이 쌓으셨나요? 3. Memory Leak
  100. 100. 전생에 나라를 구하셨군요 • 누수된 메모리가 가상함수가 있는 객체였다! 3. Memory Leak
  101. 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. 102. 전생에 나라를 구하셨군요 0000000084933f70 0061 0061 [00] 0000000084933f80 00600 - (busy) GameServer!Character::`vftable' • VS로 덤프를 열고, 포인터를 해당 타입으로 캐스팅 3. Memory Leak
  103. 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. 104. • 나라를 구한 케이스 • 착하게 산 케이스 • 망나니 케이스 전생에 덕 많이 쌓으셨나요? 3. Memory Leak
  105. 105. • 누수된 메모리 중에 string 이 있었다! 전생에 착하게 사셨군요 3. Memory Leak pair<string, Value> struct Data { int id; EType type; string name; }
  106. 106. • String 생성/삭제 부하 감소를 위한 메모리풀 • 별도 Heap 사용 마비노기 게임서버의 String Heap Commit Size 2150000 10.1 GB 20e0000 2.9 GB 3. Memory Leak
  107. 107. 특정 Heap이 사용하는 메모리 영역 찾기 3. Memory Leak • !heap 20e0000
  108. 108. 특정 Heap이 사용하는 메모리 영역 찾기 3. Memory Leak • !heap 20e0000 로딩 or 캐싱 현재 사용 중
  109. 109. 특정 Heap이 사용하는 메모리 영역 찾기 3. Memory Leak • !heap 20e0000 누수된 메모리
  110. 110. 특정 Heap이 사용하는 메모리 영역 찾기 3. Memory Leak • !heap 20e0000
  111. 111. • 누수된 String 데이터 확인 관련 코드/데이터 추적 VS 메모리창 3. Memory Leak
  112. 112. • 누수된 메모리 중에 String 이 없었다... 전생에 착하게 좀 사시지 3. Memory Leak
  113. 113. • 나라를 구한 케이스 • 착하게 산 케이스 • 망나니 케이스 전생에 덕 많이 쌓으셨나요? 3. Memory Leak
  114. 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. 115. • 서버 코드에 메모리 할당/해제 Hook 설정 (성능 저하 – 로컬이나 테스트서버에서만 사용) • 같은 사이즈의 객체들이 주로 어디서 할당되는지 확인 • 특히 할당 사이즈가 유니크할 경우 유용 _CrtSetAllocHook() “온라인 게임에서 사례로 살펴보는 디버깅” - 박일님 https://www.slideshare.net/parkpd/in-ndc2010 3. Memory Leak
  116. 116. • 누수된 메모리 블럭 내 데이터 구조 분석/추적 • 내부 테스트서버에 UMDH 적용 • 문제 발생 시점에 투입된 변경점 전체 코드 리뷰 • 메모리 증가 시점의 유저 행동 로그 분석 그 이외의 시도 3. Memory Leak
  117. 117. 4. Summary
  118. 118. • 32bit 윈도우를 지원하면 가상 메모리 한계는 2GB이다. • 메모리 이슈를 분석할 때에는 더 나은 도구로 Commit Size 를 포함한 여러 지표를 확인하자. • 재현 가능한 메모리릭은 UMDH등의 툴을 이용해서 디버깅하자. • 재현 불가능한 메모리릭은 windbg로 풀덤프 Heap 분석을 시도해보자. Summary
  119. 119. QnA
  120. 120. 자나깨나 메모리 조심 -끝-
  121. 121. • “네이티브 코드 디버깅” - MSDN https://msdn.microsoft.com/ko-kr/library/k70yt3e2.aspx • “빌드 관리 및 디버깅” - 유영천님 https://www.slideshare.net/dgtman/2010-85789722 • “실전 윈도우 디버깅” - MARIO HEWARDT book 생략된 이야기 & Reference 3. Memory Leak

×