ASP에 로딩되는 COM의 메모리누수가 존재하는 경우 개발이야기

ASP에서 COM 모듈을 사용하는 경우에 COM모듈에서 메모리누수가 발생되는 경우에 있어서 해당 경우를 얘기해보려고 합니다.

보통 ASP에서 COM 모듈을 아래와 같이 사용합니다.

set obj = Server.CreateObject( "클래스문자열" )

아래와 같이 호출되면 COM 의 Foo 메소드가 호출됩니다.

obj.Foo() 

그런데 Foo 함수에서 메모리 누수가 발생되면 어떻게 될까요?
IIS 작업자프로세스의 메모리 누수가 생겨서 끝내는 웹페이지 요청을 제대로 처리하지 못하고 500오류가 발생될 겁니다.

만약 COM 모듈이 자신의 모듈이라면 디버깅하여 문제를 해결할수도 있을 것 입니다.
그러나 해당 COM 모듈이 다른 업체에 의해 개발된 것이라면 서비스도 해야하는데 버그가 존재하는 상황이 되어버리죠.
이때 IIS 작업자프로세스 재생기능을 이용하면 문제를 우회할 수는 있습니다.
IIS에서 COM 모듈을 구동시킬때 보통 w3wp.exe 혹은 dllhost.exe를 통해 COM 모듈이 호출됩니다.
IIS의 프로세스재생이란 서비스상태를 유지한채 작업자프로세스만 재시작시키는 것 입니다.
이렇게 함으로써 메모리누수로 인한 오류를 해결할 수 있는 것 입니다.

아래 링크에서 해당 내용을 확인할 수 있습니다.


메모리누수를 알고는 있지만 서비스를 릴리즈해야하는 상황이라면 위와 같은 방법을 사용해볼만 합니다.
그리고 어떤 모듈이 어떻게 될지 모르기 때문에 프로세스재생기능을 디폴트로 활성화시켜주는 것이 좋을 듯 합니다.

작업자프로세스재생기능 설정방법: 
1. 제어판 -> 관리도구 -> IIS 관리자 실행
2. IIS관리화면에서 응용 프로그램 풀 아래 항목을 선택하여 속성을 띄웁니다.
3. 옵션을 적절히 설정해 줍니다.


기본값으로는 "다음 시간(분) 후 작업자 프로세스 재생"이 활성화되어있고 나머지는 비활성화되어있습니다.
저는 "사용된 최대 메모리"를 설정해줬습니다. 상황에 따라 적절한 메모리용량으로 설정을 하면됩니다.
위 처럼만 설정해줘도 메모리누수로 인한 서비스장애는 발생되지 않을 것 입니다.
이렇게 버그를 우회할 수도 있겠지만 잡아없애는게 더 좋겠죠? ^^;



덧글

  • 천하귀남 2011/09/01 14:17 # 답글

    작업자 프로세스가 날라간다는건 로그인한 세션값 같은것도 날라가나요?
  • 뇨릉 2011/09/05 09:52 #

    작업자프로세스재생시 서비스가 중단되지 않으므로 세션값같은게 날라가거나 하지는 않을 겁니다.
  • 곰보 2015/11/02 15:11 # 삭제 답글

    세션값 날아갑니다..
  • 곰보 2015/11/02 15:11 # 삭제 답글

    세션값 날아갑니다..
댓글 입력 영역