메모리 누수로 인한 웹 서비스 장애가 발생하였을 때 나타나는 대표적인 증상과 체크사항

메모리 누수란 메모리 사용량이 증가하여 가용 메모리가 부족한 현상을 말합니다.

보통 이 문제가 발생하게 되면 웹 페이지에 “Out of Memory Exception”라는 에러메시지가 나타납니다.

 

문제 발생 원인을 알기 위해서 특정 프로세스에 대해 Memory Leak Rule을 설정하고 메모리 Dump를 수집하여야 합니다.

IIS Diagnostics Toolkit (x86)

https://www.microsoft.com/downloads/details.aspx?FamilyID=9bfa49bc-376b-4a54-95aa-73c9156706e7&DisplayLang=en

보통 메모리 누수는 어떤 객체가 메모리를 사용을 마친다음 반환를 안할 경우에 발생하게 됩니다. 이를 해결하기 위해서는 적절한 시점에 할당된 메모리를 해제하도록 코드를 수정하여야 합니다.

 

이 밖에 IIS6에서 요청이 처리되지 않고 서버를 재시작함으로써 문제가 해결되었다면 HTTPERR.LOG 파일에서 Connections_Refused가 기록되어 있는지 확인합니다. 만약 문제 시점에 Connections_Refused가 연속해서 발생하였다면 Non-paged pool memory에서 메모리 누수가 발생하였다는 것을 의미합니다. Non-paged Pool memory란 Paging되지 않는 system memory heap으로 언제나 physical memory에 상주하는 virtual address memory입니다. Non-paged pool memory가 20MB이하인 경우 Http.sys 드라이버는 가용한 운영체제 자원에 영향을 줄이기 위해 새로운 연결을 받는 것을 중지하게 됩니다.

 

문제를 해결하기 위해서 boot.ini 에 설정된 3GB 옵션이 설정되어 있는지 확인하고 설정되어 있다면 이를 해제합니다. 기본적으로 Kernel Mode memory 와 User Mode memory 에 2GB 씩 할당되었다면, 위 설정은 User Mode memory에 3GB 를 설정함으로써 상대적으로 Kernel Mode memory가 줄어들게 만듭니다. 또한, Workaround로 이 문제를 완화하기 위해 EnableAggressiveMemoryUsage 레지스트리 키를 설정하는 방법도 있습니다. 이 값을 설정하면 Http.sys 드라이버는 가용한 Non-paged pool memory가 8MB 미만인 경우 새로운 연결을 받는 것을 중지합니다.