류짱:Beyond MySelf

Poolmon & Livekd를 이용하여 게임서버의 메모리 과점유 현상 원인 확인 방법 본문

Microsoft/Windows Platform

Poolmon & Livekd를 이용하여 게임서버의 메모리 과점유 현상 원인 확인 방법

リュちゃん 2021. 1. 11. 21:00

게임서버의 운영 및 서비스를 담당하고 있는 팀의 후배로 부터 도움 요청이 있어서 지원했었던 내용을 간략하게 다시 정리 해봅니다.

[요청 사항]
온라인  PC 게임 서비스를 위해서 AWS 환경에 구성한 Windows server 서버에서 평소와는 다르게 메모리 사용량이 너무 높아 경고가 발생하고 있어 원인 파악 요청

[환경]
OS : Windows Server 2012R2 on AWS

[증상]
CPU의 사용량은 매우 낮으나 해당 서버에 할당 된 125G의 메모리 중 118G가 사용 중으로 시스템이 느려지고 경고 발생

[확인 사항]
1. 작업 관리자를 통해서 사용 중인 메모리 량 확인
2. 할당된 메모리 (commited memory) 확인
3. Paged Pool 과 Nonpaged Pool Memroy 사이즈 확인
4. 문제 발생 서버의 메모리 사용률이 매우 높으나 리소스 모니터를 이용해서 각 프로세스의 메모리 사용률을 확인 결과 
    실행 중인 각 프로세스들의 Working set 이나 commited 메모리의 사용률은 높지 않았음


[원인 파악 및 조치 방법]
1. 대략 어떤 문제인지 짐작이 되어 우선  MS가 제공 하는 Sysinternals  툴 중에 RamMap을 이용하여 다시 한번 메모리 사용량 확인

2.  Nonpaged Pool의 사용량이 매우 높았기 때문에 조금 오래 된 툴이긴 하나 우선  poolmon.exe 를 이용해서 Nonpaged Pool을 많이 사용하는 Pool tag 확인
=> Pool tage  "4321"에 할당 된  Nonpaged Pool의 량이 ㅋㅋ

3. 확인 된 Pool tag를 Findstr 명령어를 이용해서 어떤 system driver가 사용하는 지 확인
cmd 창을 열고 system32\drivers 폴더로 이동하여 아래와 같은 커멘드 실행 (참고 포스팅 : ryuchan.kr/529)
findstr /M /L 4321 *.sys

4. 확인 된 시스템 드라이버들을 찾아 제조사들을 확인 해봅니다. 
전체 3개 중 1개에서 냄새가 좀 납니다^^


그러나 Pool mon으로 pool tag를 확인시에는  MS로부터  pool tag를 확인 하기 위한 사전 작업으로 심볼을  fix 하지 않았기 때문에 일단 의심만 해보고 실제 정확하게 어떤 pool tag가 Nonpaged Pool을 그렇게 많이 사용하는지 정확하게 파악하기 위해서 livekd와 Windows debugging tool을 이용해서 다시 확인 해 봅니다.

환경  세팅은  설명이 좀 길기 때문에 이전에 작성한 포스트를 참고 하시기 바랍니다.
1.  Livekd와 Windows debugging tool을 이용한 Paged pool 확인 방법 : ryuchan.kr/529
2. 인터넷이 안되는 환경에서 Livekd를 이용한 Full dump 수집 방법 : ryuchan.kr/510

 

인터넷이 안되는 환경의 서버에서 Livekd를 이용한 Full dump 수집 방법

인터넷이 안되는 환경의 서버에서 Livekd를 이용한 Full dump 수집 방법 인터넷이 안되는 환경의 서버에서 간혹 LiveKD를 이용해서 메모리 덤프 수집을 해야 하는 경우가 간혹 있는데 예전에는 해당

ryuchan.kr

아무튼 환경 준비를 끝내고 심볼을 Fix 한 후 Livekd를 이용해서 live debuggig 이 가능 한 상태에서 다시 nonpaged pool을 많이 사용하는 pool tag를 확인 해 봅니다.

위 그림을 보시면 아시겠지만 아까 Poolmon으로 확인 확인 했을 때와 동일하게 npcap.sys라는 시스템 드라이브가 역시나 nonpaged pool을 엄청 나게 사용 하는 것으로 확신 할 수 있게 됩니다.

자 이제 범인을 알았으니 확인을 해 봐야죠? ㅎ
네.. net stop 명령어로 npcap의 서비스를 중지 합니다. 그러자 아래 그림처럼 드라마틱하게 메모리 사용량이 훅~~ 떨어졌습니다.

참고로 npcap은 wireshark에서 사용하는 시스템 드라이버 였고 해당 게임서버의 패킷 수집이 필요하여  며칠 전 부터  작업스케쥴에  wirshark가 실행 되게 등록 해 놓았었다네요 ^^

고맙습니다.

[참고자료]
Pool Tag(풀 태그)란 무엇인가?
ryuchan.kr/163
Livekd와 Windows debugging tool을 이용한 Paged pool 확인 방법 
ryuchan.kr/529
인터넷이 안되는 환경에서 Livekd를 이용한 Full dump 수집 방법
ryuchan.kr/510