배경
서버를 운영하다보면 어플리케이션 메모리 과다사용으로,
서비스 중지 현상이 발생할 때가 있습니다.
제가 업무로 운영하는 Windows IIS 서버에서는 이를 방지하기위해 별도의 솔루션을 통해 알람이 동작하게 되어있습니다.
그런데, 최근 이러한 현상이 다량 발생되어 Windows 서버 - IIS 서버에서의 해결방안 일부를 소개하게 되었습니다.
물리적 메모리(하드웨어 - RAM) 추가
비용만 충분하다면 해당 방식이 가장 간편합니다.
단순히 서버에 램을 추가하여 가용한 메모리 용량을 늘리는 방식입니다.
IIS pool 메모리 제한
비용 문제 등으로 인해 물리적으로 메모리를 추가할 수 없을때,
간편히 문제를 해결할 수 있는 방안입니다.
IIS에서 application pool을 선택합니다.
한국어로는 애플리케이션 풀입니다.그 중에서 알람이 발생하는 pool을 클릭 후,
우측메뉴의 advanced settings을 선택합니다.
영문으로는 고급설정입니다.recycle > private memory limit / virtial memory limit 부분을 수정해줍니다.
현재 서버의 memory 크기를 감안하여 제한할 메모리 크기를 kb단위로 수정해줍니다.
저의 경우는 80~90%수준으로 수정해주었습니다.
너무 적게 설정하면 대용량 데이터 전송에 대해 처리를 못 할 수 있으니, 이 정도 수치가 적절하다고 판단됩니다.
한국어로는 가상 메모리제한/전용 메모리 제한 입니다.
IIS recycle - memory제한 설정에 대한 설명
앞선 IIS 설정을 하면, IIS의 w3wp 프로세스가 설정한 메모리 값 이상을 사용할 경우,
w3wp 프로세스를 재시작하게 됩니다.
단, 프로세스가 모두 실행이 된 후에 메모리 사용량을 확인하는것이기 때문에,
메모리를 원래 많이 쓰는 프로그램일경우 메모리를 적게 사용하도록 구동하는 프로그램을 개선하거나 하드웨어를 추가하셔야 합니다.
제가 운영하는 서버에서의 case는 w3wp.exe 프로세스에서 GC(garbage collector)가 제때 빠르게 수행되지 않아서 메모리가 급증했다가,
다시 줄어드는데 시간이 꽤 오래걸리거나 줄어들지 않는 현상이 반복되어 이러한 설정값 변경으로 더 이상 알람이 울리지 않게 되었습니다.
추가적인 해결책과 후기
주기적으로 IIS pool을 수동으로 리스타트 해줘도 동일한 효과를 볼 수 있긴 합니다.
정확히는 알 수 없지만,
주변에 IIS를 운영하시는 다른 분들께서는 GC가 잘 안되는것은 IIS의 고질적인 문제라고들 하시면서,
주기적으로 IIS 를 재시작해야한다고 하시더군요. (IIS reset)
그러나, IIS reset 은 굉장히 비용이 큰 행위이므로 recycling 옵션을 사용하는것을 지향하는게 좋겠습니다.
공돌이를 갈아넣는 microsoft에서 이렇게 허접하게(?) 만들리는 없을거 같은데,
좀 더 nice한 해결책이 있지는 않을까 싶은데, 오픈소스가 아니다보니 관련 자료를 찾기가 힘들더군요.
이래서 저는 오픈소스가 아닌 솔루션을 별로 좋아하지 않기도 하는데,
우리 회사에서는 대부분이 상용솔루션을 사용하고 있어,
온갖 문제들을 해결하는데 약간의 어려움들이 느껴지는게 아쉽습니다.