Aaron H. Kim Fearless Integration Maniac

BizTalk 2004에서 Map실행시 OutOfMemoryException과 BizTalk 2006의 Large Message Transformation Support


OutOfMemoryException

BizTalk 2004에서 Map 실행시 가물에 콩나듯.. OutOfMemoryException이 일어나곤 했는데.. (한번 발생하기 시작하면 계속..^^) 해당 에러가 발생하면 BizTalk Service가 자동으로 재시작되기도 했습니다.

제가 최초 이런 경우를 겪었을 때만해도, 해당 서버의 물리적인 램의 크기를 늘리는 것 외에 특별히 대처할 수 있는 방안이 없었습니다.

이 문제를 해결하기 위해서는 Map이 어떤식으로 동작하는지 이해해야 하는데,

BizTalk 2004에서 Map 실행시 Transformation Engine에서 stream을 XPathDocument로 로드하는데 객체는 변환 작업이 이루어 질 때 빠른 처리를 위하여

data와 함께 xml 노드들을 메모리에 저장하는데 바로 이 동작이 큰 메시지의 Map 실행시 OutOfMemoryException을 일으키는 정확한 원인입니다.

정확히 인스턴스의 사이즈가 몇 일때 해당 에러가 발생한다는 기준은 없지만 대략 1MB이상의 xml을 처리할 때, 1MB미만의 flat file이지만 Map을 통해 Xml로 변환시 위와 같은 상황이 발생합니다.

MS에서 제시하는 해당 문제에 대한 해결책은 다음 두 가지입니다.

  1. 맵 실행 전에 큰 파일(instance)들을 작은 파일들로 쪼갠다.
  2. 큰 파일(instance)들을 처리하기 위한 custom application을 개발하고, 해당 프로그램을 BizTalk에서 호출한다.

사실 물리적인 메모리의 크기를 늘리는 것만큼이나.. 근본적인 해결책은 아니었다고 생각합니다.

Larget Message Transformation Support

그렇다면 BizTalk 2006에서는 어떻게 변했을까요?
혹시 OutOfMemoryException을 경험하신 분 계신가요?
아직까지 리포트된 바로는 그러한 예는 없는 것으로 알고 있습니다.
(혹 케이스가 있다면 저도 알려주시기 바랍니다.^^)

BizTalk 2006에서는 Large files에 대한 Map 처리 매커니즘이 바뀌었습니다.
BizTalk 2006 이전 버전에서는.. 위의 예과 같이 Map 처리가 항상 메모리 위에서 이루어졌습니다.
그러나 BizTalk 2006에서는 두 가지 타입의 Trasformation Engine이 있어서,
큰 메시지들을 처리할 때는 이전처럼 DOM을 써서 메모리에 올리는게 아니라, file system에 버퍼링 됩니다.
물론 memory를 사용할 때보다 속도는 느려질 수밖에 없겠죠.

그러나 작은 메시지들의 경우는 이전과 마찬가지로 처리하기 때문에 모든 경우에 퍼포먼스의 손해를 보는 것은 아닙니다.

그럼 여기서 큰 메시지의 기준은 어디서 설정할까요? 다음 레지스트리 키를 확인하시기 바랍니다

  • DWORD ‘TransformThreshold’
  • ‘HKLM\Software\Microsoft\BizTalk Server\3.0\Administration’

기본값은 1MB라고 하는군요. 물리적인 메모리나 기타 서버 환경이 허용한다면 이 값을 적절히 조절함으로써

Perfomance의 희생을 최소화 할 수 있을 것입니다. 물론 조심해서 써야겠죠. OutOfMemoryException을 다시 일으키고 싶지 않다면 말입니다.

=> 추가(2008.09.02)
해당 키는 만들어줘야 하는군요. 다음 주소를 참조하시기 바랍니다.

<A href=”http://msdn.microsoft.com/en-us/library/aa560481.aspx” target=_blank>How BizTalk Server Processes Large Messages</A>


Similar Posts

Comments