<?xml version="1.0" encoding="utf-8"?>
<rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
  version="2.0">
  <channel>
    <title>Yong Hee Park's Blog</title>
    <atom:link
      href="https://docs.microsoft.com/archive/blogs/yonghp/feed.xml"
      rel="self"
      type="application/rss+xml" />
    <link>https://docs.microsoft.com/archive/blogs/yonghp/feed.xml</link>
    <description>Developer Support Engineer for Internet [MSFT]</description>
    <lastBuildDate>Wed, 17 Apr 2019 03:27:25 GMT</lastBuildDate>
    <language>en-US</language>
    <sy:updatePeriod>hourly</sy:updatePeriod>
    <sy:updateFrequency>1</sy:updateFrequency>
    <item>
      <title>.Net Framework 2.0, ASP.Net, COM+ &amp; machine.config</title>
      <link>https://docs.microsoft.com/archive/blogs/yonghp/net-framework-2-0-asp-net-com-machine-config</link>
      <pubDate>Wed, 15 Jul 2009 05:08:29 GMT</pubDate>
      <dc:creator><![CDATA[yonghp]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/yonghp/2009/07/15/net-framework-2-0-asp-net-com-machine-config/</guid>
      <description><![CDATA[&nbsp; 최근에 진행된 지원 케이스에서 ASP.Net 페이지의 서비스 속도 저하와 관련된&nbsp; 이슈에서 조금은 특이한 부분이 있어서 정리차원에서 블로그 글을&nbsp;...]]></description>
      <content:encoded><![CDATA[<p>&nbsp; <p><font face="맑은 고딕" size="2">최근에 진행된 지원 케이스에서 ASP.Net 페이지의 서비스 속도 저하와 관련된&nbsp; 이슈에서 조금은 특이한 부분이 있어서 정리차원에서 블로그 글을&nbsp; 포스팅 합니다. </font> <p><font face="맑은 고딕" size="2"></font>&nbsp; <p><font face="맑은 고딕" size="2">우선 문제 상황에 대한 간단한 내용을 보면 다음과 같습니다. </font> <p><font face="맑은 고딕" size="2"></font>&nbsp; <p><font face="맑은 고딕" size="2">Windows 2003 서버에 .Net Framework 2.0 (또는 그 이상)이 설치되어 있고 ASP.Net 페이지들은 단순하게 사용자의 입력을 받고 서비스를 호출 한 후 결과를 보여주는 기능을 하고 있습니다. 이때 서비스는 역시 .Net Framework 2.0 C#으로 제작된 Serviced Component 형태로 COM+ 서버에서 작동 중 이었습니다.</font>  <p><font face="맑은 고딕" size="2"></font>&nbsp; <p><font face="맑은 고딕" size="2">COM+는 다시 실제 Business Logic을 구현하고 Exchange 2007 메일 서버에 EWS로 접근 하여 ASPX 페이지들이 보여줄 자료를 가공하는 역활을 하도록 제작되어 있습니다.</font>  <p><font face="맑은 고딕" size="2"></font>&nbsp; <p><font face="맑은 고딕" size="2">서비스 중에 느끼게 되는 문제의 형태는 </font> <p><font face="맑은 고딕" size="2">1. Peak Time에 CPU나 메모리 사용량이 높거나 많지 않고, </font> <p><font face="맑은 고딕" size="2">2. netstat 등으로 확인해 보면 IIS 또는 COM+ 프로세스에서 사용하는 Network Connection 역시 많지 않은 상황 있었습니다.</font>  <p><font size="2"><font face="맑은 고딕"></font></font>&nbsp; <p><font size="2"><font face="맑은 고딕">어떤 이유에서 인지 서버들이 늘어난 처리 요청에 따라서 적절하게 시스템 리소스를 사용하지 못하고 의도 되지 않은 어떤 설정에 의해서 성능 저하를 가져오는 상태에 있었습니다.</font></font>  <p><font size="2"><font face="맑은 고딕"></font></font>&nbsp; <p><font size="2"><font face="맑은 고딕">문제 확인을 위해서 사용자가 많은 시점에 IIS의 Worker Process (W3WP.EXE)와 COM+ 프로세스 (DLLHOST.EXE)의 행모드 덤프(Hang-mode Debug Dump)를 수집 해서 상태 파악을 시도 했습니다.  <p>&nbsp; <p>W3WP.EXE에서 실행되는 모든 사용자 요청은 실제 아래의 형태와 같이 COM+ 서버에 전달된 자료 처리 요청에 대한 결과를 대기 중인 상태에 있었습니다.  <p>&nbsp; <p><font face="Arial Unicode MS" size="1">ESP&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; EIP&nbsp;&nbsp;&nbsp;&nbsp; <br><font color="#ff0000">02c9eee8 7c96860c [ComPlusMethodFrameStandaloneCleanup: 02c9eee8] System.EnterpriseServices.IRemoteDispatch.RemoteDispatchAutoDone(System.String)<br>02c9eef8 0435ef72 System.EnterpriseServices.RemoteServicedComponentProxy.Invoke(System.Runtime.Remoting.Messaging.IMessage)<br>02c9ef40 794abdb3 System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(System.Runtime.Remoting.Proxies.MessageData ByRef, Int32)<br>02c9f1e0 79f3cb53 [TPMethodFrame: 02c9f1e0] SomeBusinessModule.GetDataList(SomeBusinessData.DataEntry, System.String)</font><br>02c9f1f4 042a5feb ViewBusinessData.Page_Load(System.Object, System.EventArgs)<br>02c9f224 698a1928 System.Web.Util.CalliHelper.EventArgFunctionCaller(IntPtr, System.Object, System.Object, System.EventArgs)<br>02c9f234 0300d73f System.Web.Util.CalliEventHandlerDelegateProxy.Callback(System.Object, System.EventArgs)<br>02c9f248 02eba5a4 System.Web.UI.Control.OnLoad(System.EventArgs)<br>02c9f258 042a06cc BasePage.OnLoad(System.EventArgs)<br>02c9f264 02eba5f0 System.Web.UI.Control.LoadRecursive()<br>02c9f278 02ecbbf6 System.Web.UI.Page.ProcessRequestMain(Boolean, Boolean)<br>02c9f430 02ecb521 System.Web.UI.Page.ProcessRequest(Boolean, Boolean)<br>02c9f460 02ecb487 System.Web.UI.Page.ProcessRequest()<br>02c9f498 02ecb3a7 System.Web.UI.Page.ProcessRequestWithNoAssert(System.Web.HttpContext)<br>02c9f4a0 02ecb33a System.Web.UI.Page.ProcessRequest(System.Web.HttpContext)<br>02c9f4b4 042a0165 ASP.ViewBusinessData_aspx.ProcessRequest(System.Web.HttpContext)<br>02c9f4b8 02d788df System.Web.HttpApplication+CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()<br>02c9f4ec 02d4a071 System.Web.HttpApplication.ExecuteStep(IExecutionStep, Boolean ByRef)<br>02c9f52c 02d4a39b System.Web.HttpApplication.ResumeSteps(System.Exception)<br>02c9f574 02d4912d System.Web.HttpApplication.System.Web.IHttpAsyncHandler.BeginProcessRequest(System.Web.HttpContext, System.AsyncCallback, System.Object)<br>02c9f590 02d4e0bd System.Web.HttpRuntime.ProcessRequestInternal(System.Web.HttpWorkerRequest)<br>02c9f5c4 02d4dd72 System.Web.HttpRuntime.ProcessRequestNoDemand(System.Web.HttpWorkerRequest)<br>02c9f5d0 02d4c447 System.Web.Hosting.ISAPIRuntime.ProcessRequest(IntPtr, Int32)<br>02c9f780 79f1ef33 [ContextTransitionFrame: 02c9f780] <br>02c9f7d0 79f1ef33 [GCFrame: 02c9f7d0] <br>02c9f928 79f1ef33 [ComMethodFrame: 02c9f928] </font> <p>&nbsp;</p> <p>같은 시점에 수집된 DLLHOST.EXE 덤프의 내용을 분석해 봤습니다.</p> <p>&nbsp;</p> <p>우선 프로세스 기본 정보를 보면 서버는 4개의 CPU가 장착되어 있고 운영체제로 Windows 2003 SP2 를 사용하고 있다는 것을 알 수 있습니다.</p> <p><font face="Arial Unicode MS" size="1"><font color="#0000ff"><strong>Windows Server 2003 Version 3790 (Service Pack 2) MP (4 procs) Free x86 compatible</strong></font><br>Product: Server, suite: Enterprise TerminalServer SingleUserTS<br>kernel32.dll version: 5.2.3790.4480 (srv03_sp2_gdr.090321-1244)<br>Machine Name:<br>Debug session time: Fri Jul&nbsp; 3 08:18:50.000 2009 (GMT+9)<br>…</font>  <p>프로세서의 사용 정보와 ThreadPool의 상태를 확인해 보면 사용자 요청이 많은 시간대 임에도 불구 하고 CPU 사용량이 8% 정도 이며 100개 까지 생성 될 수 있는 Worker Thread들 중 실행 중인 Thread가 1개 (Running : 1) 뿐 임을 할 수 있습니다.</font></font></p> <p><br><font face="Arial Unicode MS" size="1">Work Request in Queue: 0<br>--------------------------------------<br>Number of Timers: 0<br>--------------------------------------<br></font><font face="Arial Unicode MS"><font size="1"><u>CPU utilization 8%<br></u>--------------------------------------<br><strong>Worker Thread: Total: 1 Running: 1 Idle: 0 MaxLimit: 100 MinLimit: 4</strong><br>Completion Port Thread:Total: 0 Free: 0 MaxFree: 8 CurrentLimit: 0 MaxLimit: 1000 MinLimit: 4</font><br></font></p> <p><font face="맑은 고딕" size="2">문제 확인을 위해서 SyncBlock을 확인해 보니 아래와 같이 많은 숫자의 Thread들이 System.Net.ServicePoint 관련 SyncBlock에 대해 블로킹 된 상태로 사용 Thread의 완료를 기다리는 상태 임을 확인 할 수 있습니다.</font></p> <p>&nbsp; </p> <p><font face="Arial Unicode MS" size="1">0:000&gt; !SyncBlk<br>Index SyncBlock MonitorHeld Recursion Owning Thread Info&nbsp; SyncBlock Owner<br>&nbsp; 352 1a3387e4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 115&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1 1a353728&nbsp; 23e8&nbsp; 17&nbsp;&nbsp; 09332f2c <font color="#ff0000">System.Net.ServicePoint</font><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Waiting threads: 14 15 16 18 20 21 22 23 24 25 26 27 28 30 31 32 33 34 35 36 37 38 …</font></p> <p><font face="Arial Unicode MS" size="1">&nbsp; 353 001728ec&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1 1a353728&nbsp; 23e8&nbsp; 17&nbsp;&nbsp; 013a2ec8 <font color="#ff0000">System.Collections.ArrayList</font><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Waiting threads: 19<br>&nbsp; 354 1a391dcc&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1 00162c70&nbsp; 24b4&nbsp; 19&nbsp;&nbsp; 013a2f1c <font color="#ff0000">System.Net.Connection</font><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Waiting threads: 17<br>-----------------------------<br>Total&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 458<br>CCW&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 225<br>RCW&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0<br>ComClassFactory 0<br>Free&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 150 </font></p> <p>&nbsp;</p> <p><font face="맑은 고딕" size="2">실행 중인 Managed Thread들 중에 위의 SyncBlock 리스트의 Head에 해당하는 17번, 19번 Thread의 Call Stack은 아래와 같습니다.</font></p> <p><font face="맑은 고딕" size="2">이들은 System.Net.Connection 객체의 사용이 완료되어서 Close/Release를 진행 중인 상태에 있었습니다.</font></p> <p>&nbsp;</p> <p><font face="Arial Unicode MS" size="1">0:019&gt; !ClrStack<br>OS Thread Id: 0x24b4 (19)<br>ESP&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; EIP&nbsp;&nbsp;&nbsp;&nbsp; <br>1a29f7b0 7c96860c [GCFrame: 1a29f7b0] <br></font><font size="1"><font face="Arial Unicode MS"><strong><font color="#ff0000">1a29f880 7c96860c [HelperMethodFrame_1OBJ: 1a29f880] System.Threading.Monitor.Enter(System.Object)<br>1a29f8d8 7a5b0034 System.Net.ConnectionGroup.Disassociate(System.Net.Connection)<br>1a29f904 7a5aeaa7 System.Net.Connection.PrepareCloseConnectionSocket(System.Net.ConnectionReturnResult ByRef)<br>1a29f968 7a5ae293 System.Net.Connection.AbortOrDisassociate(System.Net.HttpWebRequest, System.Net.WebException)<br></font></strong>1a29f9a0 7a57d9ff System.Net.HttpWebRequest.Abort(System.Exception, Int32)<br>1a29f9d4 7a57dbd1 System.Net.HttpWebRequest.AbortWrapper(System.Object)<br>1a29f9e8 793d91f6 System.Threading._ThreadPoolWaitCallback.PerformWaitCallback(System.Object)<br>1a29fb78 79e88f63 [GCFrame: 1a29fb78]</font></font> </p> <p>&nbsp; <p><font face="Arial Unicode MS" size="1">0:017&gt; !ClrStack<br>OS Thread Id: 0x23e8 (17)<br>ESP&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; EIP&nbsp;&nbsp;&nbsp;&nbsp; <br>00dfe0d4 7c96860c [GCFrame: 00dfe0d4] <br><font color="#ff0000"><strong>00dfe1a4 7c96860c [HelperMethodFrame_1OBJ: 00dfe1a4] System.Threading.Monitor.Enter(System.Object)<br>00dfe1fc 7a5ae107 System.Net.Connection.CloseOnIdle()<br>00dfe228 7a5b0403 System.Net.ConnectionGroup.DisableKeepAliveOnConnections()<br>00dfe25c 7a58be63 System.Net.ServicePoint.ReleaseConnectionGroup(System.String)</strong></font><br>00dfe28c 7a5c227f System.Net.NegotiateClient.Update(System.String, System.Net.WebRequest)<br>00dfe2ac 7a5a43c7 System.Net.AuthenticationState.Update(System.Net.HttpWebRequest)<br>00dfe2ec 7a57c04c System.Net.HttpWebRequest.DoSubmitRequestProcessing(System.Exception ByRef)<br>00dfe320 7a57e50a System.Net.HttpWebRequest.ProcessResponse()<br>00dfe358 7a57e4a3 System.Net.HttpWebRequest.SetResponse(System.Net.CoreResponseData)<br>00dfe39c 7a57e11a System.Net.HttpWebRequest.CheckWriteSideResponseProcessing()<br>00dfe3a8 7a57f51e System.Net.HttpWebRequest.EndSubmitRequest()<br>00dfe3d8 7a57dec6 System.Net.HttpWebRequest.SetRequestSubmitDone(System.Net.ConnectStream)<br>00dfe3ec 7a5ab8ff System.Net.Connection.CompleteStartRequest(Boolean, System.Net.HttpWebRequest, System.Net.TriState)<br>00dfe41c 7a5ab56b System.Net.Connection.SubmitRequest(System.Net.HttpWebRequest)<br>00dfe460 7a58b1b4 System.Net.ServicePoint.SubmitRequest(System.Net.HttpWebRequest, System.String)<br>00dfe498 7a57ef21 System.Net.HttpWebRequest.SubmitRequest(System.Net.ServicePoint)<br>00dfe4c8 7a57cae2 System.Net.HttpWebRequest.GetResponse()<br>00dfe510 6990bf7d System.Web.Services.Protocols.WebClientProtocol.GetWebResponse(System.Net.WebRequest)<br>00dfe540 6990c915 System.Web.Services.Protocols.HttpWebClientProtocol.GetWebResponse(System.Net.WebRequest)<br>00dfe544 69919eb1 System.Web.Services.Protocols.SoapHttpClientProtocol.Invoke(System.String, System.Object[])<br>00dfe588 19aa5560 ExchangeServiceBinding.FindItem(FindItemType)<br>00dfe598 1a300e14 AccessMailServer.GetMailList(...)<br>00dfefc8 79e88f63 [HelperMethodFrame_PROTECTOBJ: 00dfefc8] System.Runtime.Remoting.Messaging.StackBuilderSink._PrivateProcessMessage(IntPtr, System.Object[], System.Object, Int32, Boolean, System.Object[] ByRef)<br>00dff10c 794be820 System.Runtime.Remoting.Messaging.StackBuilderSink.PrivateProcessMessage(System.RuntimeMethodHandle, System.Object[], System.Object, Int32, Boolean, System.Object[] ByRef)<br>00dff12c 794bdf4b System.Runtime.Remoting.Messaging.StackBuilderSink.SyncProcessMessage(System.Runtime.Remoting.Messaging.IMessage, Int32, Boolean)<br>00dff1ac 794b6233 System.Runtime.Remoting.RemotingServices.ExecuteMessage(System.MarshalByRefObject, System.Runtime.Remoting.Messaging.IMethodCallMessage)<br>00dff1bc 673fd83d System.EnterpriseServices.ServicedComponentProxy.LocalInvoke(System.Runtime.Remoting.Messaging.IMessage)<br>00dff1fc 673fd64e System.EnterpriseServices.ServicedComponentProxy.Invoke(System.Runtime.Remoting.Messaging.IMessage)<br>00dff20c 673fb5a4 System.EnterpriseServices.ServicedComponent.RemoteDispatchHelper(System.String, Boolean ByRef)<br>00dff21c 673fb317 System.EnterpriseServices.ServicedComponent.System.EnterpriseServices.IRemoteDispatch.RemoteDispatchAutoDone(System.String)<br>00dff424 79f1ef33 [GCFrame: 00dff424] <br>00dff57c 79f1ef33 [ComMethodFrame: 00dff57c]</font>  <p><font face="맑은 고딕" size="2">나머지 Thread들은 전부 아래와 같은 형태로 네트워크 관련 처리를 위해서 System.Net.ServicePoint 객체를 사용하기 위한 Monitor에 대해서 Waiting을 하고 있는 상태 였습니다.</font>  <p><font face="Arial Unicode MS" size="1">ESP&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; EIP&nbsp;&nbsp;&nbsp;&nbsp; <br>1a90e874 7c96860c [GCFrame: 1a90e874] <br><font color="#ff0000"><strong>1a90e9ac 7c96860c [HelperMethodFrame: 1a90e9ac] System.Threading.Monitor.Enter(System.Object)<br>1a90ea00 7a58b151 System.Net.ServicePoint.SubmitRequest(System.Net.HttpWebRequest, System.String)<br>1a90ea38 7a57ef21 System.Net.HttpWebRequest.SubmitRequest(System.Net.ServicePoint)<br>1a90ea68 7a57bd92 System.Net.HttpWebRequest.GetRequestStream()<br>1a90ea9c 69919e6c System.Web.Services.Protocols.SoapHttpClientProtocol.Invoke(System.String, System.Object[])</strong></font><br></font><font size="1"><font face="Arial Unicode MS"><u><font color="#0000ff">1a90eae0 1a307f60 AccessMailServer.GetItem(GetItemType)<br>1a90eaf0 1a2f8414 SomeBusinessModule.GetChangedPArts(DataEntry, System.String)<br>1a90eb2c 1a2f8f74 SomeBusinessModule.Method1(DataEntry, System.String ByRef)<br>1a90eb84 1a2f2ff9 SomeBusinessModule.SendData(DataEntry, System.String ByRef)<br></font></u>1a90ec40 79e88f63 [ProtectByRefsFrame: 1a90ec40] <br>1a90efc8 79e88f63 [HelperMethodFrame_PROTECTOBJ: 1a90efc8] System.Runtime.Remoting.Messaging.StackBuilderSink._PrivateProcessMessage(IntPtr, System.Object[], System.Object, Int32, Boolean, System.Object[] ByRef)<br>1a90f10c 794be820 System.Runtime.Remoting.Messaging.StackBuilderSink.PrivateProcessMessage(System.RuntimeMethodHandle, System.Object[], System.Object, Int32, Boolean, System.Object[] ByRef)<br>1a90f12c 794bdf4b System.Runtime.Remoting.Messaging.StackBuilderSink.SyncProcessMessage(System.Runtime.Remoting.Messaging.IMessage, Int32, Boolean)<br>1a90f1ac 794b6233 System.Runtime.Remoting.RemotingServices.ExecuteMessage(System.MarshalByRefObject, System.Runtime.Remoting.Messaging.IMethodCallMessage)<br>1a90f1bc 673fd83d System.EnterpriseServices.ServicedComponentProxy.LocalInvoke(System.Runtime.Remoting.Messaging.IMessage)<br>1a90f1fc 673fd64e System.EnterpriseServices.ServicedComponentProxy.Invoke(System.Runtime.Remoting.Messaging.IMessage)<br>1a90f20c 673fb5a4 System.EnterpriseServices.ServicedComponent.RemoteDispatchHelper(System.String, Boolean ByRef)<br>1a90f21c 673fb317 System.EnterpriseServices.ServicedComponent.System.EnterpriseServices.IRemoteDispatch.RemoteDispatchAutoDone(System.String)<br>1a90f424 79f1ef33 [GCFrame: 1a90f424] <br>1a90f57c 79f1ef33 [ComMethodFrame: 1a90f57c] </font></font> <p>&nbsp;</p> <p><font face="맑은 고딕" size="2">위현상은 아래의 .Net Framework 성능 조정과 관련된 KB 문서에서 언급하고 있는 Connection 설정인 MaxConnection=2와 유사한 것으로 보입니다.</font></p> <p>&nbsp;</p> <p><font face="Arial Unicode MS">Contention, poor performance, and deadlocks when you make Web service requests from ASP.NET applications<br></font><a href="http://support.microsoft.com/kb/821268/en-us"><font face="Arial Unicode MS">http://support.microsoft.com/kb/821268/en-us</font></a>  <p>&nbsp;</p> <p><font face="맑은 고딕" size="2">덤프에서 확인해 보면 실제 ServicePoint객체에서 확인 가능한 Connection Limit가 2로 설정되어 있음을 확인 할 수 있습니다. 즉, 문제가 되고 있는 현상은 .Net Framework과 관련된 설정이 성능에 문제를 일으키고 있다는 것 입니다. 하지만 위의 KB 문서를 보면 .Net Framework 2.0의 경우는 autoConfig를 설정하는 경우 maxconnection이 12*CPU 갯수라고 지정되어 있으며 문제 서버의 경우 AutoConfig가 Enable 되어 있는 상태 였습니다.</font></p> <p>&nbsp;</p> <p><font face="Arial Unicode MS" size="1">Name: System.Net.ServicePoint<br>MethodTable: 7a772e10<br>EEClass: 7a7d0b68<br>Size: 116(0x74) bytes<br>GC Generation: 2<br>(C:\WINDOWS\assembly\GAC_MSIL\System\2.0.0.0__b77a5c561934e089\System.dll)<br>Fields:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MT&nbsp;&nbsp;&nbsp; Field&nbsp;&nbsp; Offset&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Type VT&nbsp;&nbsp;&nbsp;&nbsp; Attr&nbsp;&nbsp;&nbsp; Value Name<br>790fed1c&nbsp; 40020af&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 38&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.Int32&nbsp; 1 instance&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -1 m_ConnectionLeaseTimeout<br>7a77a4c4&nbsp; 40020b0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4 ...TimerThread+Queue&nbsp; 0 instance 05310044 m_ConnectionLeaseTimerQueue<br>79104f64&nbsp; 40020b1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 54&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.Boolean&nbsp; 1 instance&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0 m_ProxyServicePoint<br>79104f64&nbsp; 40020b2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 55&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.Boolean&nbsp; 1 instance&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0 m_UserChangedLimit<br>79104f64&nbsp; 40020b3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 56&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.Boolean&nbsp; 1 instance&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1 m_UseNagleAlgorithm<br>7a772738&nbsp; 40020b4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3c&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.Int32&nbsp; 1 instance&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0 m_HostLoopbackGuess<br>790fed1c&nbsp; 40020b5&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 40&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.Int32&nbsp; 1 instance&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -1 m_ReceiveBufferSize<br>79104f64&nbsp; 40020b6&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 57&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.Boolean&nbsp; 1 instance&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1 m_Expect100Continue<br>79104f64&nbsp; 40020b7&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 58&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.Boolean&nbsp; 1 instance&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0 m_Understands100Continue<br>7a772504&nbsp; 40020b8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 59&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.Byte&nbsp; 1 instance&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3 m_HttpBehaviour<br>790fa3e0&nbsp; 40020b9&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.String&nbsp; 0 instance 0535b350 m_LookupString<br><u>790fed1c&nbsp; 40020ba&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 44&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.Int32&nbsp; 1 instance&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <font color="#ff0000" size="3">2</font> m_ConnectionLimit</u><br>790fea70&nbsp; 40020bb&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; c ...ections.Hashtable&nbsp; 0 instance 0535b400 m_ConnectionGroupList<br>7a746d44&nbsp; 40020bc&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 10&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.Uri&nbsp; 0 instance 0535b0dc m_Address<br>790fa3e0&nbsp; 40020bd&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 14&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.String&nbsp; 0 instance 0535b13c m_Host<br>790fed1c&nbsp; 40020be&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 48&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.Int32&nbsp; 1 instance&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 80 m_Port<br>7a77a4c4&nbsp; 40020bf&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 18 ...TimerThread+Queue&nbsp; 0 instance 093325fc m_IdlingQueue<br>7a77a50c&nbsp; 40020c0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1c ...TimerThread+Timer&nbsp; 0 instance 053c42ac m_ExpiringTimer<br>79105ef0&nbsp; 40020c1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 60&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.DateTime&nbsp; 1 instance 0535b3ec m_IdleSince<br>790fa3e0&nbsp; 40020c2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 20&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.String&nbsp; 0 instance 7a72fa60 m_ConnectionName<br>790fed1c&nbsp; 40020c3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4c&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.Int32&nbsp; 1 instance&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0 m_CurrentConnections<br>79104f64&nbsp; 40020c4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 5a&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.Boolean&nbsp; 1 instance&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0 m_HostMode<br>7a772d88&nbsp; 40020c5&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 24 ...et.BindIPEndPoint&nbsp; 0 instance 00000000 m_BindIPEndPointDelegate<br>790f9c18&nbsp; 40020c7&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 28&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.Object&nbsp; 0 instance 00000000 m_ServerCertificateOrBytes<br>790f9c18&nbsp; 40020c8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2c&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.Object&nbsp; 0 instance 00000000 m_ClientCertificateOrBytes<br>790fa3e0&nbsp; 40020c9&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 30&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.String&nbsp; 0 instance 053622c8 m_HostName<br>79124228&nbsp; 40020ca&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 34&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.Object[]&nbsp; 0 instance 0536233c m_IPAddressInfoList<br>790fed1c&nbsp; 40020cb&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 50&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.Int32&nbsp; 1 instance&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0 m_CurrentAddressInfoIndex<br>79104f64&nbsp; 40020cc&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 5b&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.Boolean&nbsp; 1 instance&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1 m_ConnectedSinceDns<br>79104f64&nbsp; 40020cd&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 5c&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.Boolean&nbsp; 1 instance&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0 m_AddressListFailed<br>79105ef0&nbsp; 40020ce&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 68&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.DateTime&nbsp; 1 instance 0535b3f4 m_LastDnsResolve<br>79104f64&nbsp; 40020cf&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 5d&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.Boolean&nbsp; 1 instance&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0 m_IPAddressesAreLoopback<br>79107d2c&nbsp; 40020c6&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 7ec System.AsyncCallback&nbsp; 0&nbsp;&nbsp; shared&nbsp;&nbsp; static m_ConnectCallbackDelegate<br>&nbsp;&nbsp;&nbsp; &gt;&gt; Domain:Value&nbsp; 000de060:NotInit&nbsp; &lt;&lt;</font>  <p>&nbsp;</p> <p><font face="맑은 고딕" size="2">실제 이부분이 설정의 문제인지 .Net Framework의 버그 인지 확인을 위해서 아래의 MSDN 문서를 확인해 본 결과 이는 실제 설계된 동작임을 알 수 있습니다.</font></p> <p><font face="맑은 고딕" size="2">즉, IIS Worker Process에서 실행되는 ASP.Net 응용프로그램을 제외한 (즉, W3WP 프로세스 이외에) 모든 프로세스들은 실행 시 autoConfig 설정이 적용용되지 않고, 별도의 설정을 하지 않는 경우 시스템 디폴트 값을 따르게 된다는 것 입니다.</font></p> <p>&nbsp;</p> <p><font face="Arial Unicode MS" size="2">ASP.Net 2.0 </font></p> <p><font face="Arial Unicode MS" size="2">processModel Element (ASP.NET Settings Schema)<br></font><a href="http://msdn.microsoft.com/en-us/library/7w2sway1.aspx"><font face="Arial Unicode MS" size="2">http://msdn.microsoft.com/en-us/library/7w2sway1.aspx</font></a><font face="Courier New" size="2"> </font> <p>&nbsp;</p> <p>&nbsp;</p> <form id="aspnetForm" name="aspnetForm" action="http://msdn.microsoft.com/7w2sway1.aspx" method="post"> <div id="contents"> <div class="resizableArea" id="ctl00_LibFrame" style="width: 993px; height: 363px"> <div class="rightSection" id="ctl00_raRight"> <div class="RightPanel"> <div class="ContentArea"> <div class="topic"> <div id="mainSection"> <div id="mainBody"> <div class="MTPS_CollapsibleRegion" id="ctl00_MTContentSelector1_mainContentContainer_cpe512101"> <div class="MTPS_CollapsibleSection" id="ctl00_MTContentSelector1_mainContentContainer_cpe512101_c" style="display: block"> <div class="tableSection"> <table cellspacing="2" cellpadding="2"> <tbody> <tr> <th> <p><font face="Arial Unicode MS" size="1">Attribute </font></p></th> <th> <p><font face="Arial Unicode MS" size="1">Description </font></p></th></tr> <tr> <td> <p><font size="1"><font face="Arial Unicode MS"><span><span class="input">autoConfig</span></span><strong> </strong></font></font></p></td> <td> <ul> <p><font face="Arial Unicode MS" size="1">Specifies whether to automatically configure the following settings to achieve optimal performance based on the machine configuration: </font></p> <ul><font face="Arial Unicode MS" size="1"></font></ul> <li> <p><font face="Arial Unicode MS" size="1">The <span><span class="input">maxWorkerThreads</span></span> attribute. </font></p> <li> <p><font face="Arial Unicode MS" size="1">The <span><span class="input">maxIoThreads</span></span> attribute. </font></p> <li> <p><font face="Arial Unicode MS" size="1">The <span><span class="input">minFreeThreads</span></span> attribute of the </font><a id="ctl00_MTContentSelector1_mainContentContainer_ctl28" href="http://msdn.microsoft.com/en-us/library/e1f13641.aspx"><font face="Arial Unicode MS" size="1">httpRuntime</font></a><font face="Arial Unicode MS" size="1"> element. </font></p> <li> <p><font face="Arial Unicode MS" size="1">The <span><span class="input">minLocalRequestFreeThreads</span></span> attribute of the </font><a id="ctl00_MTContentSelector1_mainContentContainer_ctl29" href="http://msdn.microsoft.com/en-us/library/e1f13641.aspx"><font face="Arial Unicode MS" size="1">httpRuntime</font></a><font face="Arial Unicode MS" size="1"> element. </font></p> <li> <p><font face="Arial Unicode MS" size="1">The <span><span class="input">maxConnection</span></span> attribute of the <span><a id="ctl00_MTContentSelector1_mainContentContainer_ctl30" href="http://msdn.microsoft.com/en-us/library/fb6y0fyc.aspx">&lt;connectionManagement&gt; Element (Network Settings)</a></span> element. </font></p> <ul><font face="Arial Unicode MS" size="1"></font></ul> <p><font face="Arial Unicode MS" size="1">The values are set according to the KB article at </font><a id="ctl00_MTContentSelector1_mainContentContainer_ctl31" href="http://support.microsoft.com/?id=821268"><font face="Arial Unicode MS" size="1">http://support.microsoft.com/?id=821268</font></a><font face="Arial Unicode MS" size="1">. </font></p> <p><strong><font size="1"><font face="Arial Unicode MS"><font color="#ff0000">This attribute does not affect the .NET Framework client applications; only ASP.NET applications.</font> </font></font></strong></p> <p><font face="Arial Unicode MS" size="1">The <span><span class="input">autoConfig </span></span>attribute can be one of the following values. </font></p> <p><font size="1"><font face="Arial Unicode MS"><span class="mtps-th"><span>Term </span></span><span class="mtps-th"><span>Definition </span></span></font></font></p> <p><font size="1"><font face="Arial Unicode MS"><span class="mtps-cell"><span><span><span class="input">True</span></span> </span></span><span class="mtps-cell"><span>Indicates that ASP.NET automatically configures the attributes in the preceding list to achieve optimal performance based on the machine configuration. </span></span></font></font></p> <p><font size="1"><font face="Arial Unicode MS"><span class="mtps-cell"><span><span><span class="input">False</span></span> </span></span><span class="mtps-cell"><span>Indicates that ASP.NET should use the explicitly defined values for the attributes in the preceding list. </span></span></font></font></p> <p><font face="Arial Unicode MS" size="1">The default in the Machine.config file is <span><span class="input">True</span></span>, unless there is a previously existing configuration. </font></p></li></ul></td></tr></tbody></table></div></div></div></div></div></div></div></div></div></div></div></form> <p>&nbsp; <p>&nbsp; <p><font face="Arial Unicode MS" size="2">이 포스팅에서 설명하는 문제는 machine.config (또는 DLLHOST.EXE.CONFIG ) 설정을 변경 후 KB821268에서 언급하고 있는 시스템 가이드를 참조하여 변경 한 이후 해결이 되었습니다.</font>  <p><font face="Arial Unicode MS" size="2"></font>&nbsp;</p> <p><font face="Arial Unicode MS" size="2">이외 비슷하게 ASP.Net 이외에 별도의 프로세스에서 Network에 접근하여 자료를 수집/분석/제공하는 서비스를 이용하는 경우 성능 조정을 위한 파라미터를 설정해 주셔야 합니다.</font></p>]]></content:encoded>
    </item>
    <item>
      <title>ASP.Net 2.0 (Whidbey) 에서 Hang Dump 분석</title>
      <link>https://docs.microsoft.com/archive/blogs/yonghp/asp-net-2-0-whidbey-hang-dump</link>
      <pubDate>Fri, 17 Apr 2009 02:16:03 GMT</pubDate>
      <dc:creator><![CDATA[yonghp]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/yonghp/2009/04/17/asp-net-2-0-whidbey-hang-dump/</guid>
      <description><![CDATA[이전 포스팅에서 Tess의 IIS 6.0 + ASP.Net 1.1 이하 버젼에서의 Hang Dump 분석과 관련된 정보를 올렸습니다. 비교적(겨우 2년 전이네요 :-) 최근에...]]></description>
      <content:encoded><![CDATA[<p><font face="맑은 고딕" size="2">이전 포스팅에서 Tess의 IIS 6.0 + ASP.Net 1.1 이하 버젼에서의 Hang Dump 분석과 관련된 정보를 올렸습니다.</font></p> <p><font face="맑은 고딕" size="2">비교적(겨우 2년 전이네요 :-) 최근에 Tess의 블로그에 ASP.Net 2.0 에서 같은 맥락으로 Hang Dump 분석시 참고가 되는 글이 올라와서 같이 번역(사실 거의 복사에 가깝습니다만) 해서 올립니다.</font></p> <p><font face="맑은 고딕" size="2">&nbsp;</font></p> <p><font face="맑은 고딕" size="2">Tess의 글에서 언급하고 있습니다만 서버 프로세스가 처리를 하지 않거나 메모리 사용량이 늘어나거나 CPU 점유율이 높아지면서 Hang Dump를 수집하게 되면 고객들 께서는 "무슨 일을 하기에" 그런 일이 벌어지는지 문의를 하십니다.</font></p> <p><font face="맑은 고딕" size="2">바로 이전 포스팅과 본 포스팅은 "무슨일" 이 아니라 "나머지 무시할 수 있는 것"들에 대한 얘기 입니다. 즉, 사용자의 Request를 처리하지 않는 "Normal"한 (또는 Idle 상태의) Thread들은 어떻게 생겼는가 에 대해서 언급하고 있습니다.</font></p> <p><font face="맑은 고딕" size="2">&nbsp;</font></p> <p><font face="맑은 고딕" size="2">일단 이전 포스팅에서 IIS 6.0의 W3WP 프로세스의 Thread들이 소개 되어 있기 때문에 간단하게 넘기고 여기서는 제목 처럼 .Net Framework 2.0(또는 ASP.Net 2.0)에서 이전의 .Net Framework 1.1과 달라진 부분에 집중 해 보겠습니다.</font></p> <p><font face="맑은 고딕" size="2">&nbsp;</font></p> <p><font face="맑은 고딕" size="2">우선 놀고 있는 CLR Worker Thread를 보죠.</font></p> <form id="aspnetForm" name="aspnetForm" action="http://blogs.msdn.com/tess/archive/2007/04/02/things-to-ignore-when-debugging-an-asp-net-hang-update-for-net-2-0.aspx" method="post"> <div id="wrapper"> <div id="container"> <div id="contentwrapper"> <div id="content"> <div id="content2"> <p class="postcontent"><strong>Idle CLR Worker Thread</strong></p> <div class="postcontent"> <table cellspacing="0" cellpadding="0" width="800" border="0"> <tbody> <tr> <td valign="top" width="800" bgcolor="#e0e0e0"><font face="Courier New" size="2">16 Id: efc.a00 Suspend: 1 Teb: fff88000 Unfrozen<br>ChildEBP RetAddr Args to Child <br>0219fc84 7d4d8c56 00000228 00000000 0219fcc8 ntdll!ZwWaitForSingleObject+0x15<br>0219fcf4 79e718fd 00000228 00009c40 00000000 kernel32!WaitForSingleObjectEx+0xac<br>0219fd38 79e718c6 00000228 00009c40 00000000 mscorwks!PEImage::LoadImage+0x199<br>0219fd88 79e7187c 00009c40 00000000 00000000 mscorwks!CLREvent::WaitEx+0x117<br>0219fd98 79f5e51b 00009c40 00000000 00000000 mscorwks!CLREvent::Wait+0x17<br>0219fe18 79f8b1c5 001880e0 00009c40 00000000 mscorwks!ThreadpoolMgr::SafeWait+0x73<br>0219fe94 79f7997f 00000000 00000000 00000000 mscorwks!ThreadpoolMgr::WorkerThreadStart+0xf5<br>0219ffb8 7d4dfff1 0019c440 00000000 00000000 mscorwks!ThreadpoolMgr::intermediateThreadProc+0x49<br>0219ffec 00000000 79f79939 0019c440 00000000 kernel32!BaseThreadStart+0x34</font></td></tr></tbody></table></div> <div class="postcontent"><pre class="debug">&nbsp;</pre></div>
<div class="postcontent"><pre class="debug"><font face="맑은 고딕" size="2">혹시 이전 번젼과 차이가 느껴지시나요? 참고를 위해서 이전 버젼의 CLR Worker Thread의 Stack Trace를 비교해 보시죠.</font></pre></div>
<div class="postcontent"><pre class="debug"><font face="맑은 고딕" size="2">이전 포스팅에서 잠시 언급을 했습니다만, .Net Framework 1.1은 GC Version이 서로 많이 다르고</font></pre></div>
<div class="postcontent"><pre class="debug"><font face="맑은 고딕" size="2">서버 프로세스와 일반 클라이언트 프로세스에 로딩 되는 DLL 역시 바뀝니다.</font></pre></div>
<div class="postcontent"><pre class="debug"><font face="맑은 고딕" size="2"></font>&nbsp;</pre><pre class="debug"><font face="맑은 고딕" size="2">ASP.Net 2.0에서는 서버 프로세스에서도 mscrowks (Workstation version)이 올라가고 있다는 뜻일까요? 그렇지는 않습니다.</font></pre></div>
<div class="postcontent"><pre class="debug"><font face="맑은 고딕" size="2">이는 현재 구현상 이름이 남아 있는 것 뿐이 실행시 모양은 차이가 있습니다.</font></pre><pre class="debug"><font face="맑은 고딕" size="2">아래 GC Thread 부분을 참고하세요.</font></pre><pre class="debug">&nbsp;</pre></div>
<blockquote class="postcontent">
<p><strong>Idle CLR WorkerThread for ASP.Net 1.1</strong>
<p><font face="Courier New" size="2">&nbsp; 11&nbsp; Id: fb8.268 Suspend: 0 Teb: 7ffaa000 Unfrozen<br>ChildEBP RetAddr&nbsp; Args to Child&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>0199fdf8 7c822124 77e6baa8 00000234 00000000 ntdll!KiFastSystemCallRet<br>0199fdfc 77e6baa8 00000234 00000000 0199fe40 ntdll!NtWaitForSingleObject+0xc<br>0199fe6c 77e6ba12 00000234 00009c40 00000000 kernel32!WaitForSingleObjectEx+0xac<br>0199fe80 791d401f 00000234 00009c40 00000000 kernel32!WaitForSingleObject+0x12<br></font><font size="2"><font face="Courier New"><strong><font color="#ff0000">0199fea4 791fdacc 00000000 00000000 80a56bcc mscorsvr!ThreadpoolMgr::WorkerThreadStart+0x3a<br>0199ffb8 77e66063 000b6da8 00000000 00000000 mscorsvr!ThreadpoolMgr::intermediateThreadProc+0x44</font></strong><br>0199ffec 00000000 791fda8b 000b6da8 00000000 kernel32!BaseThreadStart+0x34</font></font></p></blockquote>
<p class="postcontent"><strong></strong>
<div class="postcontent"><pre class="debug"><strong></strong>&nbsp;</pre></div>
<div class="postcontent"><pre class="debug"><strong><font face="Trebuchet MS">Idle CLR Completion Port/IO Thread</font></strong></pre></div>
<div class="postcontent">
<table cellspacing="0" cellpadding="0" width="800" border="0">
<tbody>
<tr>
<td valign="top" width="800" bgcolor="#e0e0e0"><font face="Courier New" size="2">14 Id: efc.11c8 Suspend: 1 Teb: fff8e000 Unfrozen<br>ChildEBP RetAddr Args to Child <br>0209fe7c 7d50664c 00000234 0209fee8 0209fec0 ntdll!NtRemoveIoCompletion+0x15<br>0209fea8 79f795de 00000234 0209feec 0209fee8 kernel32!GetQueuedCompletionStatus+0x29<br>0209ff14 79f7997f 00000000 00000000 00000000 mscorwks!ThreadpoolMgr::CompletionPortThreadStart+0x11a<br>0209ffb8 7d4dfff1 0019c440 00000000 00000000 mscorwks!ThreadpoolMgr::intermediateThreadProc+0x49<br>0209ffec 00000000 79f79939 0019c440 00000000 kernel32!BaseThreadStart+0x34</font></td></tr></tbody></table></div>
<div class="postcontent"><pre class="debug">&nbsp;</pre></div>
<p class="postcontent" mce_keep="true">&nbsp;</p>
<p class="postcontent"><strong>Idle CLR Gate Thread</strong></p>
<div class="postcontent">
<table cellspacing="0" cellpadding="0" width="800" border="0">
<tbody>
<tr>
<td valign="top" width="800" bgcolor="#e0e0e0"><font face="Courier New" size="2">15 Id: efc.1534 Suspend: 1 Teb: fff8b000 Unfrozen<br>ChildEBP RetAddr Args to Child <br>0211fe18 7d4d0ec5 00000000 0211fe58 00000000 ntdll!ZwDelayExecution+0x15<br>0211fe80 79f56b45 000001f4 00000000 fcffff56 kernel32!SleepEx+0x68<br>0211feb4 79f56b15 000001f4 00000000 fcffff0a mscorwks!EESleepEx+0xa3<br>0211fee8 79f405ed 000001f4 00000000 79f569e7 mscorwks!__DangerousSwitchToThread+0x70<br>0211fef4 79f569e7 000001f4 9e2c9368 000003f4 mscorwks!__SwitchToThread+0xb<br>0211ffb8 7d4dfff1 00000000 00000000 00000000 mscorwks!ThreadpoolMgr::GateThreadStart+0xa1<br>0211ffec 00000000 79f56952 00000000 00000000 kernel32!BaseThreadStart+0x34</font></td></tr></tbody></table></div>
<div class="postcontent"><pre class="debug">&nbsp;</pre></div>
<p class="postcontent" mce_keep="true">위에서 언급했던 Server GC와 Workstation GC의 차이는 아래의 Stack Trace에서 차이가 납니다.</p>
<p class="postcontent" mce_keep="true">&nbsp;</p>
<p class="postcontent"><strong>Idle GC Thread</strong></p>
<div class="postcontent">
<table cellspacing="0" cellpadding="0" width="800" border="0">
<tbody>
<tr>
<td valign="top" width="800" bgcolor="#e0e0e0"><pre class="debug">18 Id: efc.12b8 Suspend: 1 Teb: fff82000 Unfrozen<br>ChildEBP RetAddr Args to Child <br>0257fe6c 7d4d8c56 000002dc 00000000 00000000 ntdll!ZwWaitForSingleObject+0x15<br>0257fedc 79e718fd 000002dc ffffffff 00000000 kernel32!WaitForSingleObjectEx+0xac<br>0257ff20 79e718c6 000002dc ffffffff 00000000 mscorwks!PEImage::LoadImage+0x199<br>0257ff70 79e7187c ffffffff 00000000 00000000 mscorwks!CLREvent::WaitEx+0x117<br>0257ff80 7a0d6f16 ffffffff 00000000 00000000 mscorwks!CLREvent::Wait+0x17<br><font color="#ff0000"><strong>0257ffa8 7a0d722e 00000000 fcb9fe5a 0257ffec mscorwks!SVR::gc_heap::gc_thread_function+0x2f<br>0257ffb8 7d4dfff1 001b20e8 00000000 00000000 mscorwks!SVR::gc_heap::gc_thread_stub+0x9b</strong><br></font>0257ffec 00000000 7a0d7192 001b20e8 00000000 kernel32!BaseThreadStart+0x34</pre></td></tr></tbody></table></div>
<div class="postcontent"><pre class="debug">&nbsp;</pre><pre class="debug"><font face="맑은 고딕" size="2">아래의 Stack Trace는 Client Application 상에서 실행되고 있는 GC Thread의 Snapshot 입니다,.</font></pre><pre class="debug"><font face="맑은 고딕" size="2">특히, 붉게 표시된 부분은 GC가 위의 Thread와 달리 열심히 살아 있는 (즉, 사용되고 있는) 객체를 표시하고 있는 중이라는 것을 보실 수 있습니다.</font></pre><pre class="debug"><font face="맑은 고딕" size="2">위의 내용과 비교해 보시면 mscorwks!SVR이 아니네요.</font></pre><pre class="debug"><font face="맑은 고딕" size="2"></font>&nbsp;</pre></div>
<blockquote>
<p class="postcontent"><font face="Courier New" size="2">ChildEBP RetAddr <br><em><font color="#ff0000">0776fa8c 68d05dda mscorwks!WKS::gc_heap::mark_object_simple1+0x148<br>0776fab8 68c9f515 mscorwks!WKS::gc_heap::mark_object_simple+0x19d<br>0776faec 68c9efc1 mscorwks!WKS::gc_heap::c_drain_mark_list+0x95<br>0776fb18 68c9f9b3 mscorwks!WKS::gc_heap::c_mark_phase+0xaa</font><br>0776fb34 68d0ed65 mscorwks!WKS::gc_heap::gc1+0x59<br>0776fb4c 68d0edb7 mscorwks!WKS::gc_heap::gc_thread_function+0x9f<br>0776fb54 75e04911 mscorwks!WKS::gc_heap::gc_thread_stub+0x73</em><br>0776fb60 76e3e4b6 KERNEL32!BaseThreadInitThunk+0xe<br>0776fba0 76e3e489 ntdll!__RtlUserThreadStart+0x23<br>0776fbb8 00000000 ntdll!_RtlUserThreadStart+0x1b</font></p></blockquote>
<div class="post">&nbsp;</div>
<div class="post">
<p class="postcontent"><strong>Idle Finalizer Thread</strong></p>
<p class="postcontent"><font face="맑은 고딕" size="2">GC와 떨어져서 언급 할 수 없는 Finalizer의 경우도 역시 마찬가지 입니다.</font></p>
<p class="postcontent"><font face="맑은 고딕" size="2"></font>&nbsp;</p>
<div class="postcontent">
<table cellspacing="0" cellpadding="0" width="800" border="0">
<tbody>
<tr>
<td valign="top" width="800" bgcolor="#e0e0e0"><font face="Courier New" size="2">20 Id: efc.132c Suspend: 1 Teb: fff7c000 Unfrozen<br>ChildEBP RetAddr Args to Child <br>0267fcd0 7d4e1cda 00000002 0267fd1c 00000001 ntdll!NtWaitForMultipleObjects+0x15<br>0267fd78 7d4e3e16 00000002 7a398698 00000000 kernel32!WaitForMultipleObjectsEx+0x11a<br>0267fd94 7a0849d8 00000002 7a398698 00000000 kernel32!WaitForMultipleObjects+0x18<br>0267fdb4 7a085307 001b0c60 0267fe6c 0267feb4 mscorwks!SVR::WaitForFinalizerEvent+0x7a<br><strong><font color="#ff0000">0267fdc8 79ed890c 0267feb4 00000000 00000001 mscorwks!SVR::GCHeap::FinalizerThreadWorker+0x75</font></strong><br>0267fdd8 79ed88aa 0267feb4 0267fe60 79f54f64 mscorwks!Thread::UserResumeThread+0xfb<br>0267fe6c 79ed87d1 0267feb4 fc89ff4a 00000000 mscorwks!Thread::DoADCallBack+0x355<br>0267fea8 79ed976c 0267feb4 00000000 001cad20 mscorwks!Thread::DoADCallBack+0x541<br>0267fed0 79ed9737 7a085292 00000008 7a0854b0 mscorwks!ManagedThreadBase_NoADTransition+0x32<br>0267fedc 7a0854b0 7a085292 fc89fef6 00000000 mscorwks!ManagedThreadBase::FinalizerBase+0xb<br><strong>0267ff14 79ed8d16 00000000 00000000 00000000 mscorwks!SVR::GCHeap::FinalizerThreadStart+0xbb</strong><br>0267ffb8 7d4dfff1 001b0ca8 00000000 00000000 mscorwks!Thread::intermediateThreadProc+0x49<br>0267ffec 00000000 79ed8cd0 001b0ca8 00000000 kernel32!BaseThreadStart+0x34</font></td></tr></tbody></table></div>
<div class="postcontent"><pre class="debug">&nbsp;</pre></div>
<p class="postcontent"><strong>Idle CLR Debugger Thread</strong></p>
<div class="postcontent">
<table cellspacing="0" cellpadding="0" width="800" border="0">
<tbody>
<tr>
<td valign="top" width="800" bgcolor="#e0e0e0"><font face="Courier New" size="2">17 Id: efc.1964 Suspend: 1 Teb: fff85000 Unfrozen<br>ChildEBP RetAddr Args to Child <br>022cfe34 7d4e1cda 00000003 022cfe80 00000001 ntdll!NtWaitForMultipleObjects+0x15<br>022cfedc 7d4e3e16 00000003 022cff20 00000000 kernel32!WaitForMultipleObjectsEx+0x11a<br>022cfef8 79f0cb1e 00000003 022cff20 00000000 kernel32!WaitForMultipleObjects+0x18<br>022cff58 79f0ca7b fcc2fe6a 00000000 00000000 mscorwks!DebuggerRCThread::MainLoop+0xcf<br>022cff88 79f0c9be fcc2fe5a 00000000 00000000 mscorwks!DebuggerRCThread::ThreadProc+0xca<br>022cffb8 7d4dfff1 00000000 00000000 00000000 mscorwks!DebuggerRCThread::ThreadProcStatic+0x82<br>022cffec 00000000 79f0c978 00000000 00000000 kernel32!BaseThreadStart+0x34</font></td></tr></tbody></table></div>
<div class="postcontent"><pre class="debug">&nbsp;</pre></div>
<p class="postcontent"><strong>Idle Timer Thread</strong> 
<table cellspacing="0" cellpadding="0" width="800" border="0">
<tbody>
<tr>
<td valign="top" width="800" bgcolor="#e0e0e0"><font face="Courier New" size="2">22 Id: efc.136c Suspend: 1 Teb: fff76000 Unfrozen<br>ChildEBP RetAddr Args to Child <br>0284fecc 7d4d0ec5 00000001 0284ff0c 00000000 ntdll!ZwDelayExecution+0x15<br>0284ff34 79f667c7 00002710 00000001 0284ffa4 kernel32!SleepEx+0x68<br>0284ffb0 79f66758 00000000 7d4dfff1 0219e75c mscorwks!ThreadpoolMgr::TimerThreadFire+0x6d<br>0284ffb8 7d4dfff1 0219e75c 00000000 00000000 mscorwks!ThreadpoolMgr::TimerThreadStart+0x54<br>0284ffec 00000000 79f66702 0219e75c 00000000 kernel32!BaseThreadStart+0x34</font></td></tr></tbody></table>
<div class="postcontent"><pre class="debug">&nbsp;</pre></div>
<p class="postcontent"><strong>Idle Appdomain Unload Thread</strong> 
<table cellspacing="0" cellpadding="0" width="800" border="0">
<tbody>
<tr>
<td valign="top" width="800" bgcolor="#e0e0e0"><font face="Courier New" size="2">21 Id: efc.12d8 Suspend: 1 Teb: fff79000 Unfrozen<br>ChildEBP RetAddr Args to Child <br>0275fcbc 7d4d8c56 000002d0 00000000 00000000 ntdll!ZwWaitForSingleObject+0x15<br>0275fd2c 79e718fd 000002d0 ffffffff 00000000 kernel32!WaitForSingleObjectEx+0xac<br>0275fd70 79e718c6 000002d0 ffffffff 00000000 mscorwks!PEImage::LoadImage+0x199<br>0275fdc0 79e7187c ffffffff 00000000 00000000 mscorwks!CLREvent::WaitEx+0x117<br>0275fdd0 79f78d81 ffffffff 00000000 00000000 mscorwks!CLREvent::Wait+0x17<br><strong><em>0275fe94 79ed8d16 001babd0 00000000 00000000 mscorwks!AppDomain::ADUnloadThreadStart+0x2fb</em></strong><br>0275ffb8 7d4dfff1 001b8670 00000000 00000000 mscorwks!Thread::intermediateThreadProc+0x49<br>0275ffec 00000000 79ed8cd0 001b8670 00000000 kernel32!BaseThreadStart+0x34</font></td></tr></tbody></table>
<div class="postcontent"><pre class="debug">&nbsp;</pre><pre class="debug"><font face="맑은 고딕" size="2">이전에는 없던 AppDomain Unload Thread라는 것이 생겼는데요. 관련 설명은 다음의 MSDN URL을 참고하세요.</font></pre><pre class="debug">&nbsp;</pre><pre class="debug"><strong>AppDomain.Unload 메서드</strong></pre><pre class="debug"><a title="http://msdn.microsoft.com/ko-kr/library/system.appdomain.unload.aspx" href="http://msdn.microsoft.com/ko-kr/library/system.appdomain.unload.aspx">http://msdn.microsoft.com/ko-kr/library/system.appdomain.unload.aspx</a></pre><pre class="debug">&nbsp;</pre></div>
<div class="postcontent">
<p><font face="맑은 고딕" size="2">설명 </font>
<p><a><font face="맑은 고딕" size="2"></font></a>
<p><font size="2"><font face="맑은 고딕"><strong><u>.NET Framework 버전 2.0에는 응용 프로그램 도메인 언로드 전용 스레드가 있습니다. 이 스레드를 사용하면 특히 .NET Framework이 호스팅된 경우 안전성이 향상됩니다. 스레드가 Unload를 호출하면 대상 도메인이 언로드되도록 표시됩니다. 그러면 전용 스레드가 도메인의 언로드를 시도하고 도메인의 모든 스레드가 중단됩니다.</u></strong> 스레드가 비관리 코드를 실행하거나 finally 블록을 실행하고 있는 등의 이유로 중단되지 않는 경우 일정한 시간이 지난 후 원래 Unload를 호출한 스레드에서 </font></font><a href="http://msdn.microsoft.com/ko-kr/library/system.cannotunloadappdomainexception.aspx"><font face="맑은 고딕" size="2">CannotUnloadAppDomainException</font></a><font face="맑은 고딕" size="2">이 throw됩니다. 중단할 수 없는 스레드가 결국 종료되면 대상 도메인은 언로드되지 않습니다. 따라서 .NET Framework 버전 2.0에서는 실행 중인 스레드를 종료시키지 못할 수 있으므로 domain이 언로드되지 않을 수도 있습니다.</font> 
<p>&nbsp;</p></div></div></div></div></div></div></div></form>]]></content:encoded>
    </item>
    <item>
      <title>ASP.Net 2.0 이전 버젼에서 Hang Dump 분석시 참고 내용</title>
      <link>https://docs.microsoft.com/archive/blogs/yonghp/asp-net-2-0-hang-dump</link>
      <pubDate>Fri, 17 Apr 2009 00:43:48 GMT</pubDate>
      <dc:creator><![CDATA[yonghp]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/yonghp/2009/04/17/asp-net-2-0-hang-dump/</guid>
      <description><![CDATA[IIS나 ASP.Net 관련 Dump 분석에서 많이 참고하는 Tess의 MSDN 블로그에 덤프 분석에 유용하게 사용 될 수 있는 Posting이 있어서 소개 합니다. &nbsp;...]]></description>
      <content:encoded><![CDATA[<p><font face="맑은 고딕" size="2">IIS나 ASP.Net 관련 Dump 분석에서 많이 참고하는 Tess의 MSDN 블로그에 덤프 분석에 유용하게 사용 될 수 있는 Posting이 있어서 소개 합니다.</font></p> <p><font face="맑은 고딕" size="2">&nbsp;</font></p> <p><font face="맑은 고딕" size="2">이 포스트는 Tess의 Things to ignore when debugging an ASP.NET hang(</font><a title="http://blogs.msdn.com/tess/archive/2005/12/20/505862.aspx" href="http://blogs.msdn.com/tess/archive/2005/12/20/505862.aspx"><font face="맑은 고딕" size="2">http://blogs.msdn.com/tess/archive/2005/12/20/505862.aspx</font></a><font face="맑은 고딕" size="2">) 을 약간 번역(오역?) 한 내용 입니다. 기술 내용의 특징상 사람이 보려고 만든 내용은 아닐 듯 한데 생각보다 많은 분들이 관련 내용에 관심을 가지시더군요.</font></p> <p><font face="맑은 고딕" size="2">&nbsp;</font></p> <p><font face="맑은 고딕" size="2">어떤 문제가 발생한 덤프를 분석한다는 것이 쉬운 일은 아닙니다. 특히, 어느 특정 시점에 작동 중이 프로세스의 Snapshot인 Dump만으로 이전/이후 상황을 설명하고 파악한다는 것은 나름 많은 기반 지식과 경험이 필요한 일 입니다.</font></p> <p><font face="맑은 고딕" size="2">&nbsp;</font></p> <p><font face="맑은 고딕" size="2">분석 중 가장 필요한 내용 중 하나가 정상 적인 Thread의 Stack trace를 빨리 무시(?) 해 나가는 것 입니다.</font></p> <p><font face="맑은 고딕" size="2">아래의 Stack Trace들은 IIS 6.0 W3WP.EXE 프로세스에서 실행 중인 Thread들의 내용입니다. 특이 이들 Thread들은 대부분 대기 상태인 Worker Thread들이기 때문에 (일이 없어서 쉬는 상태 - Idle)&nbsp; 덤프 분석 중 무시 하실 수 있습니다. 분석의 속도를 높여 줄 수 있겠지요.</font></p> <p><br><font face="맑은 고딕" size="2">Tess의 포스트에서 노트로도 나옵니다만 아래 Thread의 Stack Trace는 실제 프로세스 덤프에서 확인 하실 수 있는 대표적인 것들만 요약한 것이며 더 많은 복잡한 Thread들이 작동 중일 수 있습니다.</font></p> <p><font face="맑은 고딕" size="2"></font>&nbsp;</p> <p><font face="맑은 고딕" size="2">원래 IIS에서 실행되는 Thread들의 종료가 많기 때문에 Tess는 아래와 같이 Thread들을 분류 하고 있습니다. </font> <p><font face="맑은 고딕" size="2">&nbsp; </font> <p>- CLR Threads<br>- W3WP Threads<br>- RPC Threads<br>- Other COM Threads  <p><b></b>&nbsp; <p><b><font size="4">CLR Threads</font></b>  <p><font face="맑은 고딕" size="2">.Net Framework과 관련된 Thread들 입니다. .Net Framework의 ThreadPool은 5가지 종류의 Thead 가 있습니다. </font> <p><font face="맑은 고딕" size="2">&nbsp; </font> <p><font face="맑은 고딕" size="2">프로그래머가 작성한 코드 (Managed 내지는 .Net CLR 코드) 는 Completion Port/IO Threads와 Worker Thread들에 의해서 실행 됩니다.</font></p> <p><font face="맑은 고딕" size="2">Gate Thread( 문지기)는 서버 CPU 사용량, GC(Garbage Collection) 주기와 Worker Queue의 크기를 전반적으로 고려해서 필요한 경우 Worker Thread와 IO Thread들을 만들거나 파괴 합니다. Wait Thread들은 동기화 객체들에 대해서 대기하는 경우 사용 됩니다. 즉, 개발자가 사용하는 WaitHandle 클래스를 사용하는 경우 결과적으로 "WaitForSingleObject"가 호출이 되겠지요. 마지막으로 Timer Callback을 구현하는데는 Timer Thread들에 사용 됩니다.</font></p> <p><font face="맑은 고딕" size="2">그럼 이들 Thread들이 ASP.Net 1.1을 서비스하는 W3WP.exe 프로세스의 덤프에서 어떻게 나타나는지 보도록 하겠습니다.</font></p> <p>&nbsp;</p> <p><strong>Idle CLR WorkerThread</strong> </p> <table cellspacing="0" cellpadding="0" width="799" border="0"> <tbody> <tr> <td valign="top" width="800" bgcolor="#e0e0e0"> <p><font face="Courier New" size="2">&nbsp; 11&nbsp; Id: fb8.268 Suspend: 0 Teb: 7ffaa000 Unfrozen<br>ChildEBP RetAddr&nbsp; Args to Child&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>0199fdf8 7c822124 77e6baa8 00000234 00000000 ntdll!KiFastSystemCallRet<br><em>0199fdfc 77e6baa8 00000234 00000000 0199fe40 ntdll!NtWaitForSingleObject+0xc<br>0199fe6c 77e6ba12 00000234 00009c40 00000000 kernel32!WaitForSingleObjectEx+0xac<br>0199fe80 791d401f 00000234 00009c40 00000000 kernel32!WaitForSingleObject+0x12</em><br>0199fea4 791fdacc 00000000 00000000 80a56bcc mscorsvr!ThreadpoolMgr::WorkerThreadStart+0x3a<br>0199ffb8 77e66063 000b6da8 00000000 00000000 mscorsvr!ThreadpoolMgr::intermediateThreadProc+0x44<br>0199ffec 00000000 791fda8b 000b6da8 00000000 kernel32!BaseThreadStart+0x34</font></p></td></tr></tbody> <p></p></table> <p></p> <p><strong></strong>&nbsp;</p> <p><strong>Idle CLR Completion Port / IO Thread</strong> </p> <p> <table cellspacing="0" cellpadding="0" width="800" border="0"> <tbody> <tr> <td valign="top" width="800" bgcolor="#e0e0e0"> <p><font face="Courier New" size="2">&nbsp;&nbsp; 9&nbsp; Id: fb8.ef8 Suspend: 0 Teb: 7ffac000 Unfrozen<br>ChildEBP RetAddr&nbsp; Args to Child&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>0191fec0 7c821bf4 77e6611a 0000023c 0191ff1c ntdll!KiFastSystemCallRet<br>0191fec4 77e6611a 0000023c 0191ff1c 0191ff08 ntdll!NtRemoveIoCompletion+0xc<br>0191fef0 791fdb22 0000023c 0191ff18 0191ff1c kernel32!GetQueuedCompletionStatus+0x29<br>0191ff24 791fdacc 00000001 809a05fe 7ffac000 mscorsvr!ThreadpoolMgr::CompletionPortThreadStart+0x49<br>0191ffb8 77e66063 000b6da8 00000000 00000000 mscorsvr!ThreadpoolMgr::intermediateThreadProc+0x44<br>0191ffec 00000000 791fda8b 000b6da8 00000000 kernel32!BaseThreadStart+0x34</font></p></td></tr></tbody></table></p><pre>&nbsp;</pre>
<p><strong>Idle CLR Gate Thread </strong></p>
<table cellspacing="0" cellpadding="0" width="800" border="0">
<tbody>
<tr>
<td valign="top" width="800" bgcolor="#e0e0e0"><pre><font size="2">  10  Id: fb8.bdc Suspend: 0 Teb: 7ffab000 Unfrozen
ChildEBP RetAddr  Args to Child              
0195fe50 7c821364 77e42439 00000000 0195fe94 ntdll!KiFastSystemCallRet
0195fe54 77e42439 00000000 0195fe94 00000000 ntdll!NtDelayExecution+0xc
0195febc 77e424b7 000001f4 00000000 0195ffb8 kernel32!SleepEx+0x68
0195fecc 791bf4f9 000001f4 0b2646e6 00000939 kernel32!Sleep+0xf
0195ffb8 77e66063 00000000 00000000 00000000 mscorsvr!ThreadpoolMgr::GateThreadStart+0x54
0195ffec 00000000 791bf4a5 00000000 00000000 kernel32!BaseThreadStart+0x34
</font></pre></td></tr></tbody></table><pre><strong></strong>&nbsp;</pre><pre><strong><font face="Trebuchet MS">Idle CLR Wait Thread</font> </strong></pre>
<table cellspacing="0" cellpadding="0" width="800" border="0">
<tbody>
<tr>
<td valign="top" width="800" bgcolor="#e0e0e0">
<p><font face="Courier New" size="2">&nbsp; 25&nbsp; Id: 230.ac0 Suspend: 0 Teb: 7ff4c000 Unfrozen<br>ChildEBP RetAddr&nbsp; Args to Child&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>1b88ff6c 7c573a4e 00000001 1b88ff84 00000000 NTDLL!ZwDelayExecution+0xb <br>1b88ff8c 7923558c ffffffff 00000001 198ba828 KERNEL32!SleepEx+0x32 <br>1b88ffb4 7c57438b 00000000 198ba828 197f7498 mscorsvr!ThreadpoolMgr::WaitThreadStart+0x45 <br>1b88ffec 00000000 7923556a 1973b3d0 00000000 KERNEL32!BaseThreadStart+0x52</font></p></td></tr></tbody></table><pre>&nbsp;</pre>
<p><strong>Idle CLR Timer Thread </strong></p>
<table cellspacing="0" cellpadding="0" width="800" border="0">
<tbody>
<tr>
<td valign="top" width="800" bgcolor="#e0e0e0">
<p><font face="Courier New" size="2">&nbsp; 18&nbsp; Id: fb8.914 Suspend: 0 Teb: 7ff5f000 Unfrozen<br>ChildEBP RetAddr&nbsp; Args to Child&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>0224ff38 7c821364 77e42439 00000001 0224ff7c ntdll!KiFastSystemCallRet<br>0224ff3c 77e42439 00000001 0224ff7c 000003e8 ntdll!NtDelayExecution+0xc<br>0224ffa4 791cc578 000003e8 00000001 00000000 kernel32!SleepEx+0x68<br>0224ffb8 77e66063 00000000 00000000 00000000 mscorsvr!ThreadpoolMgr::TimerThreadStart+0x30<br>0224ffec 00000000 791cc548 00000000 00000000 kernel32!BaseThreadStart+0x34</font></p></td></tr></tbody></table><pre>&nbsp;</pre>
<p>&nbsp; <p><font face="맑은 고딕" size="2">.Net Framework의 수행 과정에서 빠질 수 없는 중요 Thread 몇가지를 아래에서 설명하고 있습니다. </font>
<p><font face="맑은 고딕" size="2">이들중 가장 중요한 것으로 GC(Garbage Collector) Thread가 있습니다. GC Thread는 CLR의 Managed Heap 메모리를 관리합니다. </font>
<p><font face="맑은 고딕" size="2">프로세서(Processor, CPU가 여러개 설치 되어 있거나 최근의 Multi-Core CPU를 사용하는 경우) 서버 버젼의 GC Thread는 CPU 들 마다 하나 씩 생성이 됩니다. Hyper-Threading 방식의 다중 CPU의 경우에는 서버 설정에 따라서 2개 CPU당 (Task Manager에서 확인되는) 하나의 GC Thread가 만들어 질 수 있습니다. </font>
<p><font size="2"><font face="맑은 고딕"><em>잠시 서버 버젼이라는 얘기가 나와서 부연 설명을 하자면 .Net Framework 1.1에서는 Server 버젼과 Workstation 버젼의 2개의 GC가 존재하며 서버 버젼의 경우 프로세스에 MSCORSVR.DLL 이, 클라이언트의 경우 (WinForm Application과 같은 경우) MSCORWKS.DLL이 로딩됩니다.</em> </font></font>
<p><font face="맑은 고딕" size="2">GC Thread와 달리 Finalizer Thread는 프로세스당 하나가 실행 됩니다. Hang이나 메모리 사용량이 많은 문제가 있는 프로세스에서는 Finalizer를 자세히 관찰할 필요가 있습니다. Finalize가 정상 작동 하지 않고 멈춰있는 경우 Finalzing이 정상적으로 되지 못해 완전히 파괴되지 못한 객체들 때문에 memory leak (점진적인 메모리 점유 현상)이 발생할 수 있고 이때문에 잦은 GC 가 발생하여 CPU 사용량이 높아지는 경우도 있습니다.</font></p>
<p><font face="맑은 고딕" size="2">마지막으로 Debugging 시 사용되는 Debugger Thread도 나오네요.</font></p>
<p>&nbsp; <p><strong>Idle CLR GC Thread</strong> </p>
<table cellspacing="0" cellpadding="0" width="800" border="0">
<tbody>
<tr>
<td valign="top" width="800" bgcolor="#e0e0e0">
<p><font face="Courier New" size="2">&nbsp; 13&nbsp; Id: fb8.c10 Suspend: 0 Teb: 7ffa8000 Unfrozen<br>ChildEBP RetAddr&nbsp; Args to Child&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>01d6fefc 7c822124 77e6baa8 000002b4 00000000 ntdll!KiFastSystemCallRet<br>01d6ff00 77e6baa8 000002b4 00000000 00000000 ntdll!NtWaitForSingleObject+0xc<br>01d6ff70 77e6ba12 000002b4 ffffffff 00000000 kernel32!WaitForSingleObjectEx+0xac<br>01d6ff84 791fe6b0 000002b4 ffffffff 00000000 kernel32!WaitForSingleObject+0x12<br>01d6ffac 792356be 00000000 01d6ffec 77e66063 mscorsvr!gc_heap::gc_thread_function+0x2f<br>01d6ffb8 77e66063 000d2ed8 00000000 00000000 mscorsvr!gc_heap::gc_thread_stub+0x1e<br>01d6ffec 00000000 792356a0 000d2ed8 00000000 kernel32!BaseThreadStart+0x34</font></p></td></tr></tbody></table><pre>&nbsp;</pre>
<p><strong>Idle CLR Finalizer Thread</strong> </p>
<table cellspacing="0" cellpadding="0" width="800" border="0">
<tbody>
<tr>
<td valign="top" width="800" bgcolor="#e0e0e0">
<p><font face="Courier New" size="2">&nbsp; 17&nbsp; Id: fb8.7b0 Suspend: 0 Teb: 7ffa4000 Unfrozen<br>ChildEBP RetAddr&nbsp; Args to Child&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>01e6fdf8 7c822114 77e6711b 00000002 01e6fe48 ntdll!KiFastSystemCallRet<br>01e6fdfc 77e6711b 00000002 01e6fe48 00000001 ntdll!NtWaitForMultipleObjects+0xc<br>01e6fea4 77e61075 00000002 793eee08 00000000 kernel32!WaitForMultipleObjectsEx+0x11a<br>01e6fec0 7927826b 00000002 793eee08 00000000 kernel32!WaitForMultipleObjects+0x18<br>01e6fee0 791fecf4 000002dc 00000000 792376a4 mscorsvr!WaitForFinalizerEvent+0x5a<br>01e6ff24 79245681 00000000 809a05fe 7ffa4000 mscorsvr!GCHeap::FinalizerThreadStart+0x96<br>01e6ffb8 77e66063 000d5500 00000000 00000000 mscorsvr!Thread::intermediateThreadProc+0x44<br>01e6ffec 00000000 79245640 000d5500 00000000 kernel32!BaseThreadStart+0x34</font></p></td></tr></tbody></table><pre>&nbsp;</pre>
<p><strong>Idle CLR Debugger Thread</strong> </p>
<table cellspacing="0" cellpadding="0" width="800" border="0">
<tbody>
<tr>
<td valign="top" width="800" bgcolor="#e0e0e0">
<p><font face="Courier New" size="2">&nbsp; 12&nbsp; Id: fb8.b30 Suspend: 0 Teb: 7ffa9000 Unfrozen<br>ChildEBP RetAddr&nbsp; Args to Child&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>01adfe70 7c822114 77e6711b 00000003 01adfec0 ntdll!KiFastSystemCallRet<br>01adfe74 77e6711b 00000003 01adfec0 00000001 ntdll!NtWaitForMultipleObjects+0xc<br>01adff1c 77e61075 00000003 01adff5c 00000000 kernel32!WaitForMultipleObjectsEx+0x11a<br>01adff38 79238fd6 00000003 01adff5c 00000000 kernel32!WaitForMultipleObjects+0x18<br>01adffa0 79238f4d 00000000 00000000 00000000 mscorsvr!DebuggerRCThread::MainLoop+0x90<br>01adffb0 7923a714 01adffec 77e66063 019d1eb0 mscorsvr!DebuggerRCThread::ThreadProc+0x68<br>01adffb8 77e66063 019d1eb0 00000000 00000000 mscorsvr!DebuggerRCThread::ThreadProcStatic+0xb<br>01adffec 00000000 7923a709 019d1eb0 00000000 kernel32!BaseThreadStart+0x34</font></p></td></tr></tbody></table><pre> </pre>
<h1><font size="3"><b><font size="4">W3wp Thread들</font></b></font></h1>
<p><font face="맑은 고딕" size="2">W3WP 프로세서에서는 기본적으로 main Thread, W3WP Thread Pool Thread와 Compression Thread(HTTP Stream 압축용) 가 생성/작동 됩니다.</font>
<p><font face="맑은 고딕" size="2">Main Thread는 프로세스의 시작고 종료를 담당 합니다. 웹서버에 전달되는 Request들은 Thread Pool Thread가 처리 합니다.</font>
<p><font face="맑은 고딕" size="2">아래 Thread들의 Stack Trace들 여기 일없이 대기 중인 것 들 입니다.</font>
<p><strong></strong>&nbsp;</p>
<p><strong>W3wp main thread</strong> </p>
<p>
<table cellspacing="0" cellpadding="0" width="800" border="0">
<tbody>
<tr>
<td valign="top" width="800" bgcolor="#e0e0e0">
<p><font face="Courier New" size="2">.&nbsp; 0&nbsp; Id: fb8.fd8 Suspend: 0 Teb: 7ffdf000 Unfrozen<br>ChildEBP RetAddr&nbsp; Args to Child&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>0006fc08 7c822124 77e6baa8 00000184 00000000 ntdll!KiFastSystemCallRet<br>0006fc0c 77e6baa8 00000184 00000000 00000000 ntdll!NtWaitForSingleObject+0xc<br>0006fc7c 77e6ba12 00000184 ffffffff 00000000 kernel32!WaitForSingleObjectEx+0xac<br>0006fc90 5a36467a 00000184 ffffffff 00000000 kernel32!WaitForSingleObject+0x12<br>0006fca0 5a366e63 00254ff8 5a3af41d 00000000 w3dt!WP_CONTEXT::RunMainThreadLoop+0x10<br>0006fca8 5a3af41d 00000000 64711da9 00000000 w3dt!UlAtqStartListen+0x2d<br>0006fcb8 5a3bc259 0100141c 010013e4 010012d0 w3core!W3_SERVER::StartListen+0xbd<br>0006ff0c 0100187c 00000007 002538e0 00000000 w3core!UlW3Start+0x26e<br>0006ff44 01001a23 00000007 002538e0 002543d0 w3wp!wmain+0x22a<br>0006ffc0 77e523cd 00000000 00000000 7ffd7000 w3wp!wmainCRTStartup+0x12b<br>0006fff0 00000000 010018f8 00000000 78746341 kernel32!BaseProcessStart+0x23</font></p></td></tr></tbody></table></p><pre><strong></strong>&nbsp;</pre><pre><strong><font face="Trebuchet MS">Idle w3wp ThreadPoolThread</font></strong> </pre><pre><table cellspacing="0" cellpadding="0" width="800" border="0"><tbody><tr><td valign="top" width="800" bgcolor="#e0e0e0"><p>&nbsp;&nbsp; 2&nbsp; Id: fb8.c5c Suspend: 0 Teb: 7ffd9000 Unfrozen<br>ChildEBP RetAddr&nbsp; Args to Child&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>00c8ff24 7c821bf4 77e6611a 00000170 00c8ff80 ntdll!KiFastSystemCallRet<br>00c8ff28 77e6611a 00000170 00c8ff80 00c8ff6c ntdll!NtRemoveIoCompletion+0xc<br>00c8ff54 5a30249e 00000170 00c8ff7c 00c8ff80 kernel32!GetQueuedCompletionStatus+0x29<br>00c8ff8c 5a3026bc 00000000 00258580 5a300000 w3tp!THREAD_POOL_DATA::ThreadPoolThread+0x33<br>00c8ffa0 5a301db9 00000102 00000000 00000000 w3tp!THREAD_POOL_DATA::ThreadPoolThread+0x24<br>00c8ffb8 77e66063 00258580 00000000 00000000 w3tp!THREAD_MANAGER::ThreadManagerThread+0x39<br>00c8ffec 00000000 5a301d80 00258580 00000000 kernel32!BaseThreadStart+0x34</p></td></tr></tbody></table></pre><pre>&nbsp;</pre>
<p><strong>Idle w3wp Compression Thread</strong> </p>
<p>
<table cellspacing="0" cellpadding="0" width="800" border="0">
<tbody>
<tr>
<td valign="top" width="800" bgcolor="#e0e0e0">
<p><font face="Courier New" size="2">&nbsp;&nbsp; 7&nbsp; Id: fb8.b20 Suspend: 0 Teb: 7ffaf000 Unfrozen<br>ChildEBP RetAddr&nbsp; Args to Child&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>017dfa84 7c822124 77e6baa8 000001d0 00000000 ntdll!KiFastSystemCallRet<br>017dfa88 77e6baa8 000001d0 00000000 00000000 ntdll!NtWaitForSingleObject+0xc<br>017dfaf8 77e6ba12 000001d0 ffffffff 00000000 kernel32!WaitForSingleObjectEx+0xac<br>017dfb0c 5a3b8147 000001d0 ffffffff 00000000 kernel32!WaitForSingleObject+0x12<br>017dffb8 77e66063 00000000 00000000 00000000 w3core!HTTP_COMPRESSION::CompressionThread+0x126<br>017dffec 00000000 5a3b8021 00000000 00000000 kernel32!BaseThreadStart+0x34</font></p></td></tr></tbody></table></p>
<p>&nbsp;</p>
<p><font size="4"><b>RPC Threads</b> </font>
<p><font face="맑은 고딕" size="2">놀고 있는 (Idle) LRPC Worker Thread들이 보인다면 이는 프로세스가 좀더 많은 리모트 COM 객체를 활성화 하거나 로컬 또는 리모트 COM method call들을 처리 할 수 있다는 뜻 입니다.</font>
<p><font face="맑은 고딕" size="2">RPC Threading Model에 대해서는 </font><a href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/rpc/rpc/scalability.asp"><font face="맑은 고딕" size="2">http://msdn.microsoft.com/library/default.asp?url=/library/en-us/rpc/rpc/scalability.asp</font></a><font face="맑은 고딕" size="2">&nbsp; 을 참고하세요.</font>
<p>&nbsp; <p><strong>Idle RPC Worker Thread</strong> </p>
<p>
<table cellspacing="0" cellpadding="0" width="800" border="0">
<tbody>
<tr>
<td valign="top" width="800" bgcolor="#e0e0e0">
<p><font face="Courier New" size="2">&nbsp; 29&nbsp; Id: fb8.7fc Suspend: 0 Teb: 7ffa1000 Unfrozen<br>ChildEBP RetAddr&nbsp; Args to Child&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>02ddfeac 7c821bf4 77e6611a 00000078 02ddff04 ntdll!KiFastSystemCallRet<br>02ddfeb0 77e6611a 00000078 02ddff04 02ddfef4 ntdll!NtRemoveIoCompletion+0xc<br>02ddfedc 77c604c3 00000078 02ddff14 02ddff04 kernel32!GetQueuedCompletionStatus+0x29<br>02ddff18 77c60655 ffffffff 02ddff6c 02ddff70 rpcrt4!COMMON_ProcessCalls+0xa1<br>02ddff84 77c5f9f1 02ddffac 77c5f7dd 00090250 rpcrt4!LOADABLE_TRANSPORT::ProcessIOEvents+0x117<br>02ddff8c 77c5f7dd 00090250 00000000 00000000 rpcrt4!ProcessIOEventsWrapper+0xd<br>02ddffac 77c5de88 0008e610 02ddffec 77e66063 rpcrt4!BaseCachedThreadRoutine+0x9d<br>02ddffb8 77e66063 029515e8 00000000 00000000 rpcrt4!ThreadStartRoutine+0x1b<br>02ddffec 00000000 77c5de6d 029515e8 00000000 kernel32!BaseThreadStart+0x34</font></p></td></tr></tbody></table></p>
<p>&nbsp;</p>
<p><strong>Idle LRPC Worker Thread</strong> 
<table cellspacing="0" cellpadding="0" width="800" border="0">
<tbody>
<tr>
<td valign="top" width="800" bgcolor="#e0e0e0">
<p><font face="Courier New" size="2">&nbsp; 33&nbsp; Id: fb8.b24 Suspend: 0 Teb: 7ffdb000 Unfrozen<br>ChildEBP RetAddr&nbsp; Args to Child&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>02e1fe18 7c821c54 77c7538c 00000138 02e1ff74 ntdll!KiFastSystemCallRet<br>02e1fe1c 77c7538c 00000138 02e1ff74 00000000 ntdll!ZwReplyWaitReceivePortEx+0xc<br>02e1ff84 77c5778f 02e1ffac 77c5f7dd 0009d660 rpcrt4!LRPC_ADDRESS::ReceiveLotsaCalls+0x198<br>02e1ff8c 77c5f7dd 0009d660 00000000 00000000 rpcrt4!RecvLotsaCallsWrapper+0xd<br>02e1ffac 77c5de88 0008e610 02e1ffec 77e66063 rpcrt4!BaseCachedThreadRoutine+0x9d<br>02e1ffb8 77e66063 05057c08 00000000 00000000 rpcrt4!ThreadStartRoutine+0x1b<br>02e1ffec 00000000 77c5de6d 05057c08 00000000 kernel32!BaseThreadStart+0x34</font></p></td></tr></tbody></table><pre><b></b>&nbsp;</pre><pre><font size="4"><font face="Trebuchet MS"><b>기타 COM Threads</b> 
</font></font></pre>
<p><font face="맑은 고딕" size="2">STA컴퍼넌트(Single threaded component)들은 Main STA Thread에서 처리가 됩니다. Main STA는 최초로 실행된 COM STA Thread가 생성을 하게 되구요.</font>
<p><font face="맑은 고딕" size="2">이전과 마찬 가지로 STA Thread들이 놀고 있다는 얘기는 현재 전달되어&nbsp; Request가 적거나 없고 앞으로 전달 되는 Request들을 더 많이 처리 할 수 있다는 뜻 입니다.</font>
<p><strong>Host STA Thread</strong> 
<table cellspacing="0" cellpadding="0" width="800" border="0">
<tbody>
<tr>
<td valign="top" width="800" bgcolor="#e0e0e0">
<p><font face="Courier New" size="2">31&nbsp; Id: fb8.b3c Suspend: 0 Teb: 7ff4e000 Unfrozen<br>ChildEBP RetAddr&nbsp; Args to Child&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>049cff14 7739c78d 7739c7c0 049cff58 00000000 ntdll!KiFastSystemCallRet<br>049cff34 77694ff1 049cff58 00000000 00000000 user32!NtUserGetMessage+0xc<br>049cff74 776cf35b 00007530 77e6ba20 02a40fe0 ole32!CDllHost::STAWorkerLoop+0x72<br>049cff90 776cf2a3 049cffb8 776b2307 77790438 ole32!CDllHost::WorkerThread+0xc8<br>049cff98 776b2307 77790438 00000000 02a40fe0 ole32!DLLHostThreadEntry+0xd<br>049cffac 776b2374 00000000 049cffec 77e66063 ole32!CRpcThread::WorkerLoop+0x1e<br>049cffb8 77e66063 02a40fe0 00000000 00000000 ole32!CRpcThreadCache::RpcWorkerThreadEntry+0x20<br>049cffec 00000000 776b2354 02a40fe0 00000000 kernel32!BaseThreadStart+0x34</font></p></td></tr></tbody></table><pre>&nbsp;</pre>
<p><strong>Idle STA Thread</strong> 
<table cellspacing="0" cellpadding="0" width="800" border="0">
<tbody>
<tr>
<td valign="top" width="800" bgcolor="#e0e0e0">
<p><font face="Courier New" size="2">14&nbsp; Id: e5c.d90 Suspend: 1 Teb: 7ffac000 Unfrozen<br>ChildEBP RetAddr&nbsp; Args to Child&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>0140fdcc 77f4372d 77e41bfa 00000003 0140fe1c SharedUserData!SystemCallStub+0x4<br>0140fdd0 77e41bfa 00000003 0140fe1c 00000001 ntdll!NtWaitForMultipleObjects+0xc<br>0140fe78 77d076f5 00000003 0140fea0 00000000 kernel32!WaitForMultipleObjectsEx+0x11a<br>0140fed4 77d077f5 00000002 0140ff74 ffffffff USER32!RealMsgWaitForMultipleObjectsEx+0x13f<br>0140fef0 7563439d 00000002 0140ff74 00000000 USER32!MsgWaitForMultipleObjects+0x1d<br>0140ff84 77bc91ed 000b6eb8 00000000 00000000 COMSVCS!CSTAThread::WorkerLoop+0x1e3<br>0140ffb8 77e4a990 00268a58 00000000 00000000 msvcrt!_threadstartex+0x6f<br>0140ffec 00000000 77bc917e 00268a58 00000000 kernel32!BaseThreadStart+0x34</font></p></td></tr></tbody></table>
<p>&nbsp; <p>COM Threading에 대해서는 다음의 URL을 참고 하세요. 
<p><strong>COM Threading and Application Architecture in COM+ Applications </strong>
<p><a href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dncomser/html/comthread.asp">http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dncomser/html/comthread.asp</a></p>]]></content:encoded>
    </item>
    <item>
      <title>BizTalk Adapter Pack 1.0과 SAP Server 4.6c간의 RFC 통신시 XML Validation Error</title>
      <link>https://docs.microsoft.com/archive/blogs/yonghp/biztalk-adapter-pack-1-0-sap-server-4-6c-rfc-xml-validation-error</link>
      <pubDate>Mon, 06 Apr 2009 03:12:52 GMT</pubDate>
      <dc:creator><![CDATA[yonghp]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/yonghp/2009/04/06/biztalk-adapter-pack-1-0-sap-server-4-6c-rfc-xml-validation-error/</guid>
      <description><![CDATA[최근 고객사에서 발생한 BizTalk Server 2006 R2(BizTalk Adapter 1.0)과 SAP Server (4.6c) 간의 RFC통신(Inbound) 시에...]]></description>
      <content:encoded><![CDATA[<p>최근 고객사에서 발생한 BizTalk Server 2006 R2(BizTalk Adapter 1.0)과 SAP Server (4.6c) 간의 RFC통신(Inbound) 시에 Table 형 자료의 필드 값이 한글이 지정되는 경우 이상한 Garbage 문자들이 끼여들어서 오류가 발생하는 문제가 접수 되었습니다.</p> <p>&nbsp;</p> <p>문제가 발생하는 시점에 보면 아래와 같은 오류 메시지가 이벤트에 기록이 되면 Orchestration으로의 자료 전달시 오류가 발생합니다.</p> <p>&nbsp;</p> <blockquote> <p>3/19/2009&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 오후 2:27:10&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 5815&nbsp;&nbsp;&nbsp;&nbsp; BizTalk Server 2006&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; N/A&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HCIFWEB1 <br>A response message sent to adapter "WCF-Custom" on receive port "ReceivePort_From_SAP_RFC" with URI "sap://Client=XXX;lang=EN;@A/SOME_IP_ADDR/12?ListenerGwHost=SOME_IP_ADDR&amp;ListenerGwServ=SAP_GW_SRV&amp;ListenerProgramId=SAP_BIZTALK" is suspended.</p> <p>&nbsp;&nbsp;&nbsp;&nbsp; <em><font color="#ff0000"><strong>Error details: System.Xml.XmlException: '.', 16진수 값 0x00은(는) 잘못된 문자입니다. 줄 1, 위치 377</strong></font></em></p> <p>&nbsp;&nbsp;&nbsp;&nbsp; 위치: Microsoft.BizTalk.Component.XmlAsmStreamWrapper.Read(Byte[] buffer, Int32 offset, Int32 count)</p> <p>&nbsp;&nbsp;&nbsp;&nbsp; 위치: System.Xml.XmlTextReaderImpl.InitStreamInput(Uri baseUri, String baseUriStr, Stream stream, Byte[] bytes, Int32 byteCount, Encoding encoding)</p> <p>&nbsp;&nbsp;&nbsp;&nbsp; 위치: System.Xml.XmlTextReaderImpl..ctor(Stream stream, Byte[] bytes, Int32 byteCount, XmlReaderSettings settings, Uri baseUri, String baseUriStr, XmlParserContext context, Boolean closeInput)</p> <p>&nbsp;&nbsp;&nbsp;&nbsp; 위치: System.Xml.XmlReader.CreateReaderImpl(Stream input, XmlReaderSettings settings, Uri baseUri, String baseUriStr, XmlParserContext inputContext, Boolean closeInput)</p> <p>&nbsp;&nbsp;&nbsp;&nbsp; 위치: System.Xml.XmlReader.Create(Stream input, XmlReaderSettings settings, String baseUri)</p> <p>&nbsp;&nbsp;&nbsp;&nbsp; 위치: System.Xml.XmlReader.Create(Stream input, XmlReaderSettings settings)</p> <p>&nbsp;&nbsp;&nbsp;&nbsp; 위치: Microsoft.BizTalk.Adapter.Wcf.Runtime.BizTalkBodyWriter.WriteBizTalkBody(XmlDictionaryWriter writer)</p> <p>&nbsp;&nbsp;&nbsp;&nbsp; 위치: Microsoft.BizTalk.Adapter.Wcf.Runtime.BizTalkBodyWriter.OnWriteBodyContents(XmlDictionaryWriter writer)</p> <p>&nbsp;&nbsp;&nbsp;&nbsp; 위치: System.ServiceModel.Channels.BodyWriter.WriteBodyContents(XmlDictionaryWriter writer)</p> <p>&nbsp;&nbsp;&nbsp;&nbsp; 위치: System.ServiceModel.Channels.BodyWriterMessage.OnWriteBodyContents(XmlDictionaryWriter writer)</p> <p>&nbsp;&nbsp;&nbsp;&nbsp; 위치: System.ServiceModel.Channels.Message.OnGetReaderAtBodyContents()</p> <p>&nbsp;&nbsp;&nbsp;&nbsp; 위치: System.ServiceModel.Channels.Message.GetReaderAtBodyContents()</p> <p>&nbsp;&nbsp;&nbsp;&nbsp; 위치: Microsoft.Adapters.SAP.SAPInboundCountractReply.AdapterReply(Message message, TimeSpan timeout)</p> <p>&nbsp;&nbsp;&nbsp;&nbsp; 위치: Microsoft.Adapters.AdapterUtilities.AdapterInboundReply.Reply(Message message, TimeSpan timeout)</p> <p>&nbsp;&nbsp;&nbsp;&nbsp; 위치: Microsoft.ServiceModel.Channels.Common.Channels.AdapterRequestContext.Reply(Message message, TimeSpan timeout)</p> <p>&nbsp;&nbsp;&nbsp;&nbsp; 위치: Microsoft.ServiceModel.Channels.Common.Channels.AdapterRequestContext.Reply(Message message)</p> <p>&nbsp;&nbsp;&nbsp;&nbsp; 위치: System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.Reply(MessageRpc&amp; rpc)&nbsp;&nbsp;&nbsp;&nbsp; MessageId:&nbsp; {xxxxxxxxx}&nbsp;&nbsp;&nbsp; InstanceID: {YYYYYYYYYY}</p></blockquote> <p>&nbsp;</p> <p>문제는 자료를 아래와 같이 필드의 길이에 맞는 ASCII 문자만을 보낼 경우는 문제가 없었습니다. (아래의 Schema는 원래 자료의 내용을 바탕으로 재구성하였으며 SAP 서버에서 실제 생성된 것은 아닙니다.)</p> <p>&nbsp;</p> <blockquote> <p>&lt;?xml version="1.0" encoding="utf-8"?&gt;<br>&lt;SAP_Data_Root xmlns="<a href="http://Microsoft.LobServices.Sap/2007/03/Rfc/&quot;">http://Microsoft.LobServices.Sap/2007/03/Rfc/"</a>&gt;<br>&nbsp; &lt;TableDataElement&gt;<br>&nbsp;&nbsp;&nbsp; &lt;TableData01 xmlns="<a href="http://Microsoft.LobServices.Sap/2007/03/Types/Rfc/&quot;">http://Microsoft.LobServices.Sap/2007/03/Types/Rfc/"</a>&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;ProductCode&gt;A100&lt;/ProductCode&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;StandardCode&gt;111&lt;/StandardCode&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;TransitionType&gt;2&lt;/TransitionType&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;ProductName&gt;333&lt;/ProductName&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;RealNAME&gt;&lt;/RealNAME&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;ShippingDate&gt;&lt;/ShippingDate&gt;<br>&nbsp;&nbsp;&nbsp; &lt;/TableData01&gt;<br>&nbsp; &lt;/TableDataElement&gt;<br>&lt;/SAP_Data_Root&gt;</p></blockquote> <p>&nbsp;</p> <p>한글을 포함한 자료를 SAP에서 보내게 되면 아래와 같이 공백과 함께 NULL Entity(&amp;#x0;) 가 Field의 길이에 맞게 Padding 되는 듯하면서 추가되고 있는 것을 볼 수 있습니다. 이들 문자에 의해서 XML Validation이 실패하면서 Request를 정상처리하지 못하고 있었습니다.</p> <blockquote> <p>&lt;?xml version="1.0" encoding="utf-8"?&gt;<br>&lt;SAP_Data_Root xmlns="<a href="http://Microsoft.LobServices.Sap/2007/03/Rfc/&quot;">http://Microsoft.LobServices.Sap/2007/03/Rfc/"</a>&gt;<br>&nbsp; &lt;TableDataElement&gt;<br>&nbsp;&nbsp;&nbsp; &lt;TableData01 xmlns="<a href="http://Microsoft.LobServices.Sap/2007/03/Types/Rfc/&quot;">http://Microsoft.LobServices.Sap/2007/03/Types/Rfc/"</a>&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;ProductCode&gt;A100&lt;/ProductCode&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;StandardCode&gt;111&lt;/StandardCode&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;TransitionType&gt;1&lt;/TransitionType&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;ProductName&gt;한글 한글 한글<strike>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &amp;#x0;&amp;#x0;&amp;#x0;&amp;#x0;&amp;#x0;&amp;#x0;&lt;/</strike>ProductName&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;RealNAME&gt;한글 2 한<strike>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &amp;#x0;&amp;#x0;&amp;#x0;</strike>&lt;/RealNAME&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;ShippingDate&gt;&lt;/ShippingDate&gt;<br>&nbsp;&nbsp;&nbsp; &lt;/TableData01&gt;<br>&nbsp; &lt;/TableDataElement&gt;<br>&lt;/SAP_Data_Root&gt; </p></blockquote> <p>&nbsp;</p> <p>관련 문제는 SAP RFC SDK 7.1 UNICODE 를 SAP RFC SDK 7.0 UNICODE로 downgrade 하면서 해결 되었습니다. 아마도 SAP RFC SDK 7.1 UNICODE 버젼에 MBCS 스트링 자료 처리에 문제가 있었을 것으로 보입니다만 정확한 원인 확인은 좀 더 시간일 걸릴 것으로 보입니다.</p> <p>&nbsp;</p> <p>SAP RFC SDK를 다운로드 하는 방법은 아래의 Blog 글을 참고하세요. 물론 SAP쪽의 지원 계약이 있으셔야 다운로드가 가능합니다.</p> <p><a href="http://blogs.msdn.com/adapters/archive/2007/10/07/obtaining-the-rfc-sdk-unicode-libraries-from-sap-service-marketplace.aspx">http://blogs.msdn.com/adapters/archive/2007/10/07/obtaining-the-rfc-sdk-unicode-libraries-from-sap-service-marketplace.aspx</a> <p>&nbsp;</p> <p>BizTalk Server 설치 이후에 SAP의 TABLE Type이 지원되는 않을 경우, 아래의 KB에서 언급하는 Hotfix를 설치해야 할 수 있습니다.</p> <p>&nbsp;</p> <p>FIX: The Windows Communication Foundation (WCF) based SAP adapter from BizTalk Server 2006 Adapter Pack v1.0 does not support the SAP TABLE type <p><a href="http://support.microsoft.com/kb/956635">http://support.microsoft.com/kb/956635</a>]]></content:encoded>
    </item>
    <item>
      <title>Microsoft .NET Micro Framework (NETMF) Porting Kit 3.0</title>
      <link>https://docs.microsoft.com/archive/blogs/yonghp/microsoft-net-micro-framework-netmf-porting-kit-3-0</link>
      <pubDate>Thu, 26 Mar 2009 12:11:00 GMT</pubDate>
      <dc:creator><![CDATA[yonghp]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/yonghp/2009/03/26/microsoft-net-micro-framework-netmf-porting-kit-3-0/</guid>
      <description><![CDATA[PDA들은 Windows&nbsp;Mobile(Windows CE라고 불린던) 을 쓴다 치더라도&nbsp;기능이 좀 어중간한 ARM7&nbsp;CPU 보드에서 .Net...]]></description>
      <content:encoded><![CDATA[<P>PDA들은 Windows&nbsp;Mobile(Windows CE라고 불린던) 을 쓴다 치더라도&nbsp;기능이 좀 어중간한 ARM7&nbsp;CPU 보드에서 .Net Framework을 쓸 수 있으면 좋겠구나 하는 생각을&nbsp;&nbsp;왔습니다.&nbsp;</P>
<P>처음 .Net Micro Framework에 대해서 들었을 때는 드디어 그게 가능해 졌구나 하는 생각을 했습니다. 하지만, 좀 자세히 들어가서 보니 조금은 실망스러운 것이 역시나 인증된 (즉, 상대적으로 가격이 비싼) 보드 매이커의 제품만을 사용해야 한다는 것 이었습니다.</P>
<P>얼마전에 출시된&nbsp; .Net Micro Framework Porting Kit을 이용해서 새로운 플랫폼이나 기존의 플랫폼에&nbsp; .NetMF의 포팅이 쉬워졌네요.</P>
<P>Getting Started with the Porting Kit<BR><A href="http://blogs.msdn.com/netmfteam/pages/getting-started-with-the-porting-kit.aspx">http://blogs.msdn.com/netmfteam/pages/getting-started-with-the-porting-kit.aspx</A></P>
<P>그런데, 여기에 더 놀라운 것은 기존의 Embedded Software 개발시 구입해야 했던 비싼 개발 도구를 반드시 쓸 필요는 없다는 것 이지요.&nbsp; .NetMF팀에서 GCC로 이미 테스트를 했고 써도 된 답니다. </P>
<P>Update on Using GCC to Port the .NET Micro Framework in .NET Micro Framework Porting <BR><A href="https://www.microsoft.com/communities/newsgroups/en-us/default.aspx?dg=microsoft.public.dotnet.framework.microframework.porting&amp;tid=e6575c5e-f1ce-4bab-897f-96be45b818f9&amp;cat=en_US_38A7B5A8-BCC6-4cc8-BE52-832E765A449B&amp;lang=en&amp;cr=US&amp;sloc=&amp;p=1">https://www.microsoft.com/communities/newsgroups/en-us/default.aspx?dg=microsoft.public.dotnet.framework.microframework.porting&amp;tid=e6575c5e-f1ce-4bab-897f-96be45b818f9&amp;cat=en_US_38A7B5A8-BCC6-4cc8-BE52-832E765A449B&amp;lang=en&amp;cr=US&amp;sloc=&amp;p=1</A></P>
<P><EM>In version 3.0, .NET Micro Framework team added support for the Gnu Compiler <BR>Collection (GCC) for evaluation purposes as noted in the documentation. Due <BR>to customer requests, we have reviewed this policy and <FONT style="BACKGROUND-COLOR: #ffff00">now fully support the <BR>GCC as a toolchain for porting the .NET Micro Framework.</FONT> We on the .NET Micro <BR>Framework team wish to thank all of our partners, customers, and enthusiasts <BR>for their feedback, ideas, and input. </EM></P>
<P><FONT color=#ff0000>Please be aware that it is our experience that using GCC to port the .NET <BR>Micro Framework results in firmware that is larger and slower than the <BR>firmware produced by toolchains such as RVDS or MDK.</FONT> We have reduced the <BR>memory footprint of the framework in the version 3.0 release to extend the <BR>.NET Micro Framework support for even smaller processors. To get the smallest <BR>and most efficient binaries, we still recommend the use of the ARM or Keil <BR>toolchains. </P>
<P mce_keep="true">&nbsp;</P>
<P>아래의 링크들을 참고 하시기 바랍니다.</P>
<P><BR>Precompiled GCC Toolchains for the Porting Kit<BR><A href="http://msmicroframework.blogspot.com/2009/02/precompiled-gcc-toolchains-for-porting.html">http://msmicroframework.blogspot.com/2009/02/precompiled-gcc-toolchains-for-porting.html</A></P>
<P>Configuring Eclipse + OpenOCD + GCC to Debug NativeSample<BR><A href="http://msmicroframework.blogspot.com/2009/02/configuring-eclipse-openocd-gcc-to.html">http://msmicroframework.blogspot.com/2009/02/configuring-eclipse-openocd-gcc-to.html</A></P>
<P>How to use Eclipse and GDB to debug the .NET Micro Framework<BR><A href="http://discovertheexperience.blogspot.com/2008/11/how-to-use-eclipse-and-gdb-to-debug-net_09.html">http://discovertheexperience.blogspot.com/2008/11/how-to-use-eclipse-and-gdb-to-debug-net_09.html</A></P>
<P>Sourcery G++ Lite 2007q3-53 for ARM EABI <BR><A href="http://www.codesourcery.com/sgpp/lite/arm/portal/release316">http://www.codesourcery.com/sgpp/lite/arm/portal/release316</A></P>
<P>.NET Micro Framework Porting Kit V3.0 with GCC Support?<BR><A href="http://discovertheexperience.blogspot.com/2008/11/net-micro-framework-porting-kit-v30.html">http://discovertheexperience.blogspot.com/2008/11/net-micro-framework-porting-kit-v30.html</A></P>
<P mce_keep="true">&nbsp;</P>]]></content:encoded>
    </item>
    <item>
      <title>Windows 버젼별 메모리 관련 설정들 및 링크들</title>
      <link>https://docs.microsoft.com/archive/blogs/yonghp/windows</link>
      <pubDate>Fri, 13 Mar 2009 02:33:55 GMT</pubDate>
      <dc:creator><![CDATA[yonghp]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/yonghp/2009/03/13/windows/</guid>
      <description><![CDATA[자주 참고하는 정보들이라 스크랩 을 겸해서 올립니다. 링크에서 Physical Memory관련 설정도 확인 할 수 있습니다. &nbsp; Memory Limits for...]]></description>
      <content:encoded><![CDATA[<p>자주 참고하는 정보들이라 스크랩 을 겸해서 올립니다.</p> <p>링크에서 Physical Memory관련 설정도 확인 할 수 있습니다.</p> <p><strong></strong>&nbsp;</p> <p><strong>Memory Limits for Windows Releases</strong></p> <p><a title="http://msdn.microsoft.com/en-us/library/aa366778(VS.85).aspx" href="http://msdn.microsoft.com/en-us/library/aa366778(VS.85).aspx">http://msdn.microsoft.com/en-us/library/aa366778(VS.85).aspx</a></p> <p>&nbsp;</p> <p class="MsoNormal"><span lang="EN-US" style="font-size: 9pt; color: black; line-height: 140%; font-family: 'Verdana','sans-serif'"><strong>Memory and Address Space Limits<?xml:namespace prefix = o /><o:p></o:p></strong></span></p> <p style="vertical-align: top; line-height: 140%"><span lang="EN-US" style="font-size: 8pt; color: black; line-height: 140%; font-family: 'Verdana','sans-serif'">The following table specifies the limits on memory and address space for supported releases of Windows.<o:p></o:p></span></p> <table class="MsoNormalTable" style="border-right: #dddddd 1pt solid; border-top: #dddddd 1pt solid; margin-left: 4.2pt; border-left: #dddddd 1pt solid; width: 97%; border-bottom: #dddddd 1pt solid; mso-cellspacing: 1.5pt; mso-border-alt: solid #dddddd .75pt; mso-yfti-tbllook: 1184" cellpadding="0" width="97%" border="1"> <tbody> <tr style="mso-yfti-irow: 0; mso-yfti-firstrow: yes"> <td style="border-right: #cccccc 1pt solid; padding-right: 4.2pt; border-top: #cccccc 1pt solid; padding-left: 4.2pt; background: #cccccc; padding-bottom: 4.2pt; border-left: #cccccc 1pt solid; padding-top: 4.2pt; border-bottom: #c8cdde 1pt solid; mso-border-alt: solid #cccccc .25pt; mso-border-bottom-alt: solid #c8cdde .75pt" valign="bottom"> <p class="MsoNormal" style="margin: 4.2pt 0cm"><b><span lang="EN-US" style="font-size: 8.5pt; color: #000066; font-family: 'Verdana','sans-serif'">Memory type</span></b><b><span lang="EN-US" style="font-size: 8.5pt; color: #000066; font-family: 'Verdana','sans-serif'; mso-fareast-font-family: 굴림; mso-bidi-font-family: 굴림"><o:p></o:p></span></b></p></td> <td style="border-right: #cccccc 1pt solid; padding-right: 4.2pt; border-top: #cccccc 1pt solid; padding-left: 4.2pt; background: #cccccc; padding-bottom: 4.2pt; border-left: #cccccc 1pt solid; padding-top: 4.2pt; border-bottom: #c8cdde 1pt solid; mso-border-alt: solid #cccccc .25pt; mso-border-bottom-alt: solid #c8cdde .75pt" valign="bottom"> <p class="MsoNormal" style="margin: 4.2pt 0cm"><b><span lang="EN-US" style="font-size: 8.5pt; color: #000066; font-family: 'Verdana','sans-serif'">Limit in 32-bit Windows</span></b><b><span lang="EN-US" style="font-size: 8.5pt; color: #000066; font-family: 'Verdana','sans-serif'; mso-fareast-font-family: 굴림; mso-bidi-font-family: 굴림"><o:p></o:p></span></b></p></td> <td style="border-right: #cccccc 1pt solid; padding-right: 4.2pt; border-top: #cccccc 1pt solid; padding-left: 4.2pt; background: #cccccc; padding-bottom: 4.2pt; border-left: #cccccc 1pt solid; padding-top: 4.2pt; border-bottom: #c8cdde 1pt solid; mso-border-alt: solid #cccccc .25pt; mso-border-bottom-alt: solid #c8cdde .75pt" valign="bottom"> <p class="MsoNormal" style="margin: 4.2pt 0cm"><b><span lang="EN-US" style="font-size: 8.5pt; color: #000066; font-family: 'Verdana','sans-serif'">Limit in 64-bit Windows</span></b><b><span lang="EN-US" style="font-size: 8.5pt; color: #000066; font-family: 'Verdana','sans-serif'; mso-fareast-font-family: 굴림; mso-bidi-font-family: 굴림"><o:p></o:p></span></b></p></td></tr> <tr style="mso-yfti-irow: 1"> <td style="border-right: #d5d5d3 1pt solid; padding-right: 4.2pt; border-top: #cccccc 1pt solid; padding-left: 4.2pt; background: white; padding-bottom: 4.2pt; border-left: #cccccc 1pt solid; padding-top: 4.2pt; border-bottom: #cccccc 1pt solid; mso-border-alt: solid #cccccc .75pt; mso-border-right-alt: solid #d5d5d3 .75pt" valign="top"> <p class="MsoNormal" style="margin: 0.85pt"><span lang="EN-US" style="font-size: 8.5pt; color: black; font-family: 'Verdana','sans-serif'">User-mode virtual address space for each 32-bit process</span><span lang="EN-US" style="font-size: 8.5pt; color: black; font-family: 'Verdana','sans-serif'; mso-fareast-font-family: 굴림; mso-bidi-font-family: 굴림"><o:p></o:p></span></p></td> <td style="border-right: #d5d5d3 1pt solid; padding-right: 4.2pt; border-top: #cccccc 1pt solid; padding-left: 4.2pt; background: white; padding-bottom: 4.2pt; border-left: #cccccc 1pt solid; padding-top: 4.2pt; border-bottom: #cccccc 1pt solid; mso-border-alt: solid #cccccc .75pt; mso-border-right-alt: solid #d5d5d3 .75pt" valign="top"> <p class="MsoNormal" style="margin: 0cm 0.85pt 0pt"><span lang="EN-US" style="font-size: 8.5pt; color: black; font-family: 'Verdana','sans-serif'">2 GB<o:p></o:p></span></p> <p class="MsoNormal" style="margin: 0cm 0.85pt 0pt"><span lang="EN-US" style="font-size: 8.5pt; color: black; font-family: 'Verdana','sans-serif'">Up to 3 GB with IMAGE_FILE_LARGE_ADDRESS_AWARE and 4GT</span><span lang="EN-US" style="font-size: 8.5pt; color: black; font-family: 'Verdana','sans-serif'; mso-fareast-font-family: 굴림; mso-bidi-font-family: 굴림"><o:p></o:p></span></p></td> <td style="border-right: #d5d5d3 1pt solid; padding-right: 4.2pt; border-top: #cccccc 1pt solid; padding-left: 4.2pt; background: white; padding-bottom: 4.2pt; border-left: #cccccc 1pt solid; padding-top: 4.2pt; border-bottom: #cccccc 1pt solid; mso-border-alt: solid #cccccc .75pt; mso-border-right-alt: solid #d5d5d3 .75pt" valign="top"> <p class="MsoNormal" style="margin: 0cm 0.85pt 0pt"><span lang="EN-US" style="font-size: 8.5pt; color: black; font-family: 'Verdana','sans-serif'">2 GB with IMAGE_FILE_LARGE_ADDRESS_AWARE cleared (default)<o:p></o:p></span></p> <p class="MsoNormal" style="margin: 0cm 0.85pt 0pt"><span lang="EN-US" style="font-size: 8.5pt; color: black; font-family: 'Verdana','sans-serif'">4 GB with IMAGE_FILE_LARGE_ADDRESS_AWARE set</span><span lang="EN-US" style="font-size: 8.5pt; color: black; font-family: 'Verdana','sans-serif'; mso-fareast-font-family: 굴림; mso-bidi-font-family: 굴림"><o:p></o:p></span></p></td></tr> <tr style="mso-yfti-irow: 2"> <td style="border-right: #d5d5d3 1pt solid; padding-right: 4.2pt; border-top: #cccccc 1pt solid; padding-left: 4.2pt; background: white; padding-bottom: 4.2pt; border-left: #cccccc 1pt solid; padding-top: 4.2pt; border-bottom: #cccccc 1pt solid; mso-border-alt: solid #cccccc .75pt; mso-border-right-alt: solid #d5d5d3 .75pt" valign="top"> <p class="MsoNormal" style="margin: 0.85pt"><span lang="EN-US" style="font-size: 8.5pt; color: black; font-family: 'Verdana','sans-serif'">User-mode virtual address space for each 64-bit process</span><span lang="EN-US" style="font-size: 8.5pt; color: black; font-family: 'Verdana','sans-serif'; mso-fareast-font-family: 굴림; mso-bidi-font-family: 굴림"><o:p></o:p></span></p></td> <td style="border-right: #d5d5d3 1pt solid; padding-right: 4.2pt; border-top: #cccccc 1pt solid; padding-left: 4.2pt; background: white; padding-bottom: 4.2pt; border-left: #cccccc 1pt solid; padding-top: 4.2pt; border-bottom: #cccccc 1pt solid; mso-border-alt: solid #cccccc .75pt; mso-border-right-alt: solid #d5d5d3 .75pt" valign="top"> <p class="MsoNormal" style="margin: 0cm 0.85pt 0pt"><span lang="EN-US" style="font-size: 8.5pt; color: black; font-family: 'Verdana','sans-serif'">Not applicable</span><span lang="EN-US" style="font-size: 8.5pt; color: black; font-family: 'Verdana','sans-serif'; mso-fareast-font-family: 굴림; mso-bidi-font-family: 굴림"><o:p></o:p></span></p></td> <td style="border-right: #d5d5d3 1pt solid; padding-right: 4.2pt; border-top: #cccccc 1pt solid; padding-left: 4.2pt; background: white; padding-bottom: 4.2pt; border-left: #cccccc 1pt solid; padding-top: 4.2pt; border-bottom: #cccccc 1pt solid; mso-border-alt: solid #cccccc .75pt; mso-border-right-alt: solid #d5d5d3 .75pt" valign="top"> <p class="MsoNormal" style="margin: 0cm 0.85pt 0pt"><span lang="EN-US" style="font-size: 8.5pt; color: black; font-family: 'Verdana','sans-serif'">With IMAGE_FILE_LARGE_ADDRESS_AWARE set (default):<o:p></o:p></span></p> <p class="MsoNormal" style="margin: 0cm 0.85pt 0pt"><strong><span lang="EN-US" style="font-size: 8.5pt; color: black; font-family: 'Verdana','sans-serif'; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi">x64:&nbsp; </span></strong><span lang="EN-US" style="font-size: 8.5pt; color: black; font-family: 'Verdana','sans-serif'">8 TB <o:p></o:p></span></p> <p class="MsoNormal" style="margin: 0cm 0.85pt 0pt"><strong><span lang="EN-US" style="font-size: 8.5pt; color: black; font-family: 'Verdana','sans-serif'; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi">Intel IPF:&nbsp; </span></strong><span lang="EN-US" style="font-size: 8.5pt; color: black; font-family: 'Verdana','sans-serif'">7 TB <o:p></o:p></span></p> <p class="MsoNormal" style="margin: 0cm 0.85pt 0pt"><span lang="EN-US" style="font-size: 8.5pt; color: black; font-family: 'Verdana','sans-serif'">2 GB with IMAGE_FILE_LARGE_ADDRESS_AWARE cleared</span><span lang="EN-US" style="font-size: 8.5pt; color: black; font-family: 'Verdana','sans-serif'; mso-fareast-font-family: 굴림; mso-bidi-font-family: 굴림"><o:p></o:p></span></p></td></tr> <tr style="mso-yfti-irow: 3"> <td style="border-right: #d5d5d3 1pt solid; padding-right: 4.2pt; border-top: #cccccc 1pt solid; padding-left: 4.2pt; background: white; padding-bottom: 4.2pt; border-left: #cccccc 1pt solid; padding-top: 4.2pt; border-bottom: #cccccc 1pt solid; mso-border-alt: solid #cccccc .75pt; mso-border-right-alt: solid #d5d5d3 .75pt" valign="top"> <p class="MsoNormal" style="margin: 0.85pt"><span lang="EN-US" style="font-size: 8.5pt; color: black; font-family: 'Verdana','sans-serif'">Kernel-mode virtual address space</span><span lang="EN-US" style="font-size: 8.5pt; color: black; font-family: 'Verdana','sans-serif'; mso-fareast-font-family: 굴림; mso-bidi-font-family: 굴림"><o:p></o:p></span></p></td> <td style="border-right: #d5d5d3 1pt solid; padding-right: 4.2pt; border-top: #cccccc 1pt solid; padding-left: 4.2pt; background: white; padding-bottom: 4.2pt; border-left: #cccccc 1pt solid; padding-top: 4.2pt; border-bottom: #cccccc 1pt solid; mso-border-alt: solid #cccccc .75pt; mso-border-right-alt: solid #d5d5d3 .75pt" valign="top"> <p class="MsoNormal" style="margin: 0cm 0.85pt 0pt"><span lang="EN-US" style="font-size: 8.5pt; color: black; font-family: 'Verdana','sans-serif'">2 GB<o:p></o:p></span></p> <p class="MsoNormal" style="margin: 0cm 0.85pt 0pt"><span lang="EN-US" style="font-size: 8.5pt; color: black; font-family: 'Verdana','sans-serif'">From 1 GB to a maximum of 2 GB with 4GT</span><span lang="EN-US" style="font-size: 8.5pt; color: black; font-family: 'Verdana','sans-serif'; mso-fareast-font-family: 굴림; mso-bidi-font-family: 굴림"><o:p></o:p></span></p></td> <td style="border-right: #d5d5d3 1pt solid; padding-right: 4.2pt; border-top: #cccccc 1pt solid; padding-left: 4.2pt; background: white; padding-bottom: 4.2pt; border-left: #cccccc 1pt solid; padding-top: 4.2pt; border-bottom: #cccccc 1pt solid; mso-border-alt: solid #cccccc .75pt; mso-border-right-alt: solid #d5d5d3 .75pt" valign="top"> <p class="MsoNormal" style="margin: 0cm 0.85pt 0pt"><span lang="EN-US" style="font-size: 8.5pt; color: black; font-family: 'Verdana','sans-serif'">8 TB</span><span lang="EN-US" style="font-size: 8.5pt; color: black; font-family: 'Verdana','sans-serif'; mso-fareast-font-family: 굴림; mso-bidi-font-family: 굴림"><o:p></o:p></span></p></td></tr> <tr style="mso-yfti-irow: 4"> <td style="border-right: #d5d5d3 1pt solid; padding-right: 4.2pt; border-top: #cccccc 1pt solid; padding-left: 4.2pt; background: white; padding-bottom: 4.2pt; border-left: #cccccc 1pt solid; padding-top: 4.2pt; border-bottom: #cccccc 1pt solid; mso-border-alt: solid #cccccc .75pt; mso-border-right-alt: solid #d5d5d3 .75pt" valign="top"> <p class="MsoNormal" style="margin: 0.85pt"><span lang="EN-US" style="font-size: 8.5pt; color: black; font-family: 'Verdana','sans-serif'">Paged pool</span><span lang="EN-US" style="font-size: 8.5pt; color: black; font-family: 'Verdana','sans-serif'; mso-fareast-font-family: 굴림; mso-bidi-font-family: 굴림"><o:p></o:p></span></p></td> <td style="border-right: #d5d5d3 1pt solid; padding-right: 4.2pt; border-top: #cccccc 1pt solid; padding-left: 4.2pt; background: white; padding-bottom: 4.2pt; border-left: #cccccc 1pt solid; padding-top: 4.2pt; border-bottom: #cccccc 1pt solid; mso-border-alt: solid #cccccc .75pt; mso-border-right-alt: solid #d5d5d3 .75pt" valign="top"> <p class="MsoNormal" style="margin: 0cm 0.85pt 0pt"><span lang="EN-US" style="font-size: 8.5pt; color: black; font-family: 'Verdana','sans-serif'">Limited by available kernel-mode virtual address space or the <a id="ctl00_rs1_mainContentContainer_ctl05" href="http://msdn.microsoft.com/en-us/library/bb870880(VS.85).aspx">PagedPoolLimit</a> registry key value. <o:p></o:p></span></p> <p class="MsoNormal" style="margin: 0cm 0.85pt 0pt"><strong><span lang="EN-US" style="font-size: 8.5pt; color: black; font-family: 'Verdana','sans-serif'; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi">Windows Vista:&nbsp; </span></strong><span lang="EN-US" style="font-size: 8.5pt; color: black; font-family: 'Verdana','sans-serif'">Limited only by kernel mode virtual address space. Starting with Windows Vista with Service Pack 1 (SP1), the paged pool can also be limited by the PagedPoolLimit registry key value.<o:p></o:p></span></p> <p class="MsoNormal" style="margin: 0cm 0.85pt 0pt"><strong><span lang="EN-US" style="font-size: 8.5pt; color: black; font-family: 'Verdana','sans-serif'; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi">Windows Home Server and Windows Server 2003:&nbsp; </span></strong><span lang="EN-US" style="font-size: 8.5pt; color: black; font-family: 'Verdana','sans-serif'">530 MB<o:p></o:p></span></p> <p class="MsoNormal" style="margin: 0cm 0.85pt 0pt"><strong><span lang="EN-US" style="font-size: 8.5pt; color: black; font-family: 'Verdana','sans-serif'; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi">Windows XP:&nbsp; </span></strong><span lang="EN-US" style="font-size: 8.5pt; color: black; font-family: 'Verdana','sans-serif'">490 MB<o:p></o:p></span></p> <p class="MsoNormal" style="margin: 0cm 0.85pt 0pt"><strong><span lang="EN-US" style="font-size: 8.5pt; color: black; font-family: 'Verdana','sans-serif'; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi">Windows 2000:&nbsp; </span></strong><span lang="EN-US" style="font-size: 8.5pt; color: black; font-family: 'Verdana','sans-serif'">350 MB</span><span lang="EN-US" style="font-size: 8.5pt; color: black; font-family: 'Verdana','sans-serif'; mso-fareast-font-family: 굴림; mso-bidi-font-family: 굴림"><o:p></o:p></span></p></td> <td style="border-right: #d5d5d3 1pt solid; padding-right: 4.2pt; border-top: #cccccc 1pt solid; padding-left: 4.2pt; background: white; padding-bottom: 4.2pt; border-left: #cccccc 1pt solid; padding-top: 4.2pt; border-bottom: #cccccc 1pt solid; mso-border-alt: solid #cccccc .75pt; mso-border-right-alt: solid #d5d5d3 .75pt" valign="top"> <p class="MsoNormal" style="margin: 0cm 0.85pt 0pt"><span lang="EN-US" style="font-size: 8.5pt; color: black; font-family: 'Verdana','sans-serif'">128 GB <o:p></o:p></span></p> <p class="MsoNormal" style="margin: 0cm 0.85pt 0pt"><strong><span lang="EN-US" style="font-size: 8.5pt; color: black; font-family: 'Verdana','sans-serif'; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi">Windows Server 2003 and Windows XP:&nbsp; </span></strong><span lang="EN-US" style="font-size: 8.5pt; color: black; font-family: 'Verdana','sans-serif'">Up to 128 GB depending on configuration and RAM.<o:p></o:p></span></p> <p class="MsoNormal" style="margin: 0cm 0.85pt 0pt"><strong><span lang="EN-US" style="font-size: 8.5pt; color: black; font-family: 'Verdana','sans-serif'; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi">Windows 2000:&nbsp; </span></strong><span lang="EN-US" style="font-size: 8.5pt; color: black; font-family: 'Verdana','sans-serif'">Not applicable</span><span lang="EN-US" style="font-size: 8.5pt; color: black; font-family: 'Verdana','sans-serif'; mso-fareast-font-family: 굴림; mso-bidi-font-family: 굴림"><o:p></o:p></span></p></td></tr> <tr style="mso-yfti-irow: 5"> <td style="border-right: #d5d5d3 1pt solid; padding-right: 4.2pt; border-top: #cccccc 1pt solid; padding-left: 4.2pt; background: white; padding-bottom: 4.2pt; border-left: #cccccc 1pt solid; padding-top: 4.2pt; border-bottom: #cccccc 1pt solid; mso-border-alt: solid #cccccc .75pt; mso-border-right-alt: solid #d5d5d3 .75pt" valign="top"> <p class="MsoNormal" style="margin: 0.85pt"><span lang="EN-US" style="font-size: 8.5pt; color: black; font-family: 'Verdana','sans-serif'">Nonpaged pool</span><span lang="EN-US" style="font-size: 8.5pt; color: black; font-family: 'Verdana','sans-serif'; mso-fareast-font-family: 굴림; mso-bidi-font-family: 굴림"><o:p></o:p></span></p></td> <td style="border-right: #d5d5d3 1pt solid; padding-right: 4.2pt; border-top: #cccccc 1pt solid; padding-left: 4.2pt; background: white; padding-bottom: 4.2pt; border-left: #cccccc 1pt solid; padding-top: 4.2pt; border-bottom: #cccccc 1pt solid; mso-border-alt: solid #cccccc .75pt; mso-border-right-alt: solid #d5d5d3 .75pt" valign="top"> <p class="MsoNormal" style="margin: 0cm 0.85pt 0pt"><span lang="EN-US" style="font-size: 8.5pt; color: black; font-family: 'Verdana','sans-serif'">Limited by available kernel-mode virtual address space, the <a id="ctl00_rs1_mainContentContainer_ctl06" href="http://msdn.microsoft.com/en-us/library/bb870880(VS.85).aspx">NonPagedPoolLimit</a> registry key value, or physical memory. <o:p></o:p></span></p> <p class="MsoNormal" style="margin: 0cm 0.85pt 0pt"><strong><span lang="EN-US" style="font-size: 8.5pt; color: black; font-family: 'Verdana','sans-serif'; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi">Windows Vista:&nbsp; </span></strong><span lang="EN-US" style="font-size: 8.5pt; color: black; font-family: 'Verdana','sans-serif'">Limited only by kernel mode virtual address space and physical memory. Starting with Windows Vista with SP1, the nonpaged pool can also be limited by the <a id="ctl00_rs1_mainContentContainer_ctl07" href="http://msdn.microsoft.com/en-us/library/bb870880(VS.85).aspx">NonPagedPoolLimit</a> registry key value.<o:p></o:p></span></p> <p class="MsoNormal" style="margin: 0cm 0.85pt 0pt"><strong><span lang="EN-US" style="font-size: 8.5pt; color: black; font-family: 'Verdana','sans-serif'; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi">Windows Home Server, Windows Server 2003, and Windows XP/2000:&nbsp; </span></strong><span lang="EN-US" style="font-size: 8.5pt; color: black; font-family: 'Verdana','sans-serif'">256 MB, or 128 MB with 4GT.</span><span lang="EN-US" style="font-size: 8.5pt; color: black; font-family: 'Verdana','sans-serif'; mso-fareast-font-family: 굴림; mso-bidi-font-family: 굴림"><o:p></o:p></span></p></td> <td style="border-right: #d5d5d3 1pt solid; padding-right: 4.2pt; border-top: #cccccc 1pt solid; padding-left: 4.2pt; background: white; padding-bottom: 4.2pt; border-left: #cccccc 1pt solid; padding-top: 4.2pt; border-bottom: #cccccc 1pt solid; mso-border-alt: solid #cccccc .75pt; mso-border-right-alt: solid #d5d5d3 .75pt" valign="top"> <p class="MsoNormal" style="margin: 0cm 0.85pt 0pt"><span lang="EN-US" style="font-size: 8.5pt; color: black; font-family: 'Verdana','sans-serif'">75% of RAM up to a maximum of 128 GB <o:p></o:p></span></p> <p class="MsoNormal" style="margin: 0cm 0.85pt 0pt"><strong><span lang="EN-US" style="font-size: 8.5pt; color: black; font-family: 'Verdana','sans-serif'; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi">Windows Vista:&nbsp; </span></strong><span lang="EN-US" style="font-size: 8.5pt; color: black; font-family: 'Verdana','sans-serif'">40% of RAM up to a maximum of 128 GB.<o:p></o:p></span></p> <p class="MsoNormal" style="margin: 0cm 0.85pt 0pt"><strong><span lang="EN-US" style="font-size: 8.5pt; color: black; font-family: 'Verdana','sans-serif'; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi">Windows Server 2003 and Windows XP:&nbsp; </span></strong><span lang="EN-US" style="font-size: 8.5pt; color: black; font-family: 'Verdana','sans-serif'">Up to 128 GB depending on configuration and RAM.<o:p></o:p></span></p> <p class="MsoNormal" style="margin: 0cm 0.85pt 0pt"><strong><span lang="EN-US" style="font-size: 8.5pt; color: black; font-family: 'Verdana','sans-serif'; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi">Windows 2000:&nbsp; </span></strong><span lang="EN-US" style="font-size: 8.5pt; color: black; font-family: 'Verdana','sans-serif'">Not applicable</span><span lang="EN-US" style="font-size: 8.5pt; color: black; font-family: 'Verdana','sans-serif'; mso-fareast-font-family: 굴림; mso-bidi-font-family: 굴림"><o:p></o:p></span></p></td></tr> <tr style="mso-yfti-irow: 6; mso-yfti-lastrow: yes"> <td style="border-right: #d5d5d3 1pt solid; padding-right: 4.2pt; border-top: #cccccc 1pt solid; padding-left: 4.2pt; background: white; padding-bottom: 4.2pt; border-left: #cccccc 1pt solid; padding-top: 4.2pt; border-bottom: #cccccc 1pt solid; mso-border-alt: solid #cccccc .75pt; mso-border-right-alt: solid #d5d5d3 .75pt" valign="top"> <p class="MsoNormal" style="margin: 0.85pt"><span lang="EN-US" style="font-size: 8.5pt; color: black; font-family: 'Verdana','sans-serif'">System cache virtual address space (physical size limited only by physical memory)</span><span lang="EN-US" style="font-size: 8.5pt; color: black; font-family: 'Verdana','sans-serif'; mso-fareast-font-family: 굴림; mso-bidi-font-family: 굴림"><o:p></o:p></span></p></td> <td style="border-right: #d5d5d3 1pt solid; padding-right: 4.2pt; border-top: #cccccc 1pt solid; padding-left: 4.2pt; background: white; padding-bottom: 4.2pt; border-left: #cccccc 1pt solid; padding-top: 4.2pt; border-bottom: #cccccc 1pt solid; mso-border-alt: solid #cccccc .75pt; mso-border-right-alt: solid #d5d5d3 .75pt" valign="top"> <p class="MsoNormal" style="margin: 0cm 0.85pt 0pt"><span lang="EN-US" style="font-size: 8.5pt; color: black; font-family: 'Verdana','sans-serif'">Limited by available kernel-mode virtual address space or the <a id="ctl00_rs1_mainContentContainer_ctl08" href="http://msdn.microsoft.com/en-us/library/bb870880(VS.85).aspx">SystemCacheLimit</a> registry key value.<o:p></o:p></span></p> <p class="MsoNormal" style="margin: 0cm 0.85pt 0pt"><strong><span lang="EN-US" style="font-size: 8.5pt; color: black; font-family: 'Verdana','sans-serif'; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi">Windows Vista:&nbsp; </span></strong><span lang="EN-US" style="font-size: 8.5pt; color: black; font-family: 'Verdana','sans-serif'">Limited only by kernel mode virtual address space. Starting with Windows Vista with SP1, system cache virtual address space can also be limited by the <a id="ctl00_rs1_mainContentContainer_ctl09" href="http://msdn.microsoft.com/en-us/library/bb870880(VS.85).aspx">SystemCacheLimit</a> registry key value.<o:p></o:p></span></p> <p class="MsoNormal" style="margin: 0cm 0.85pt 0pt"><strong><span lang="EN-US" style="font-size: 8.5pt; color: black; font-family: 'Verdana','sans-serif'; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi">Windows Home Server, Windows Server 2003, and Windows XP/2000:&nbsp; </span></strong><span lang="EN-US" style="font-size: 8.5pt; color: black; font-family: 'Verdana','sans-serif'">860 MB with <a id="ctl00_rs1_mainContentContainer_ctl10" href="http://go.microsoft.com/fwlink/?LinkId=97918" target="_blank">LargeSystemCache</a> registry key set and without 4GT; up to 448 MB with 4GT.</span><span lang="EN-US" style="font-size: 8.5pt; color: black; font-family: 'Verdana','sans-serif'; mso-fareast-font-family: 굴림; mso-bidi-font-family: 굴림"><o:p></o:p></span></p></td> <td style="border-right: #d5d5d3 1pt solid; padding-right: 4.2pt; border-top: #cccccc 1pt solid; padding-left: 4.2pt; background: white; padding-bottom: 4.2pt; border-left: #cccccc 1pt solid; padding-top: 4.2pt; border-bottom: #cccccc 1pt solid; mso-border-alt: solid #cccccc .75pt; mso-border-right-alt: solid #d5d5d3 .75pt" valign="top"> <p class="MsoNormal" style="margin: 0cm 0.85pt 0pt"><span lang="EN-US" style="font-size: 8.5pt; color: black; font-family: 'Verdana','sans-serif'">Always 1 TB regardless of physical RAM <o:p></o:p></span></p> <p class="MsoNormal" style="margin: 0cm 0.85pt 0pt"><strong><span lang="EN-US" style="font-size: 8.5pt; color: black; font-family: 'Verdana','sans-serif'; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi">Windows Server 2003 and Windows XP:&nbsp; </span></strong><span lang="EN-US" style="font-size: 8.5pt; color: black; font-family: 'Verdana','sans-serif'">Up to 1 TB depending on configuration and RAM.<o:p></o:p></span></p> <p class="MsoNormal" style="margin: 0cm 0.85pt 0pt"><strong><span lang="EN-US" style="font-size: 8.5pt; color: black; font-family: 'Verdana','sans-serif'; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi">Windows 2000:&nbsp; </span></strong><span lang="EN-US" style="font-size: 8.5pt; color: black; font-family: 'Verdana','sans-serif'">Not applicable</span><span lang="EN-US" style="font-size: 8.5pt; color: black; font-family: 'Verdana','sans-serif'; mso-fareast-font-family: 굴림; mso-bidi-font-family: 굴림"><o:p></o:p></span></p></td></tr></tbody></table> <p class="MsoNormal"><span lang="EN-US" style="font-family: 'Verdana','sans-serif'"><o:p>&nbsp;</o:p></span></p> <p class="MsoNormal">Advances in Memory Management for Windows</p> <p class="MsoNormal"><a title="http://www.microsoft.com/whdc/system/sysinternals/memmgt.mspx" href="http://www.microsoft.com/whdc/system/sysinternals/memmgt.mspx">http://www.microsoft.com/whdc/system/sysinternals/memmgt.mspx</a></p> <p class="MsoNormal">&nbsp;</p> <p><a name="_Toc179885589">Dynamic Allocation of Kernel Virtual Address Space</a></p> <p>In Windows Vista and later Windows releases, kernel VA space is dynamically allocated. The sizes and locations of important system resources—including the paged and nonpaged memory pools—are no longer fixed, but instead are dynamically adjusted according to operational requirements. As a result, system tuning is automatic. Administrators are not typically required to manually reconfigure systems to prevent resource imbalances.</p> <p><a href="https://msdnshared.blob.core.windows.net/media/TNBlogsFS/BlogFileStorage/blogs_msdn/yonghp/WindowsLiveWriter/Windows_DAC4/image_2.png" original-url="http://blogs.msdn.com/blogfiles/yonghp/WindowsLiveWriter/Windows_DAC4/image_2.png"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="281" alt="image" src="https://msdnshared.blob.core.windows.net/media/TNBlogsFS/BlogFileStorage/blogs_msdn/yonghp/WindowsLiveWriter/Windows_DAC4/image_thumb.png" original-url="http://blogs.msdn.com/blogfiles/yonghp/WindowsLiveWriter/Windows_DAC4/image_thumb.png" width="482" border="0"></a> </p> <p>Figure 2. Kernel Virtual Address Space</p> <p>&nbsp;</p> <p>기타 메모리 관련 참고 사항 (위 문서에서 언급하고 있는 내용들 입니다) :</p> <h4><span lang="EN-US">MSDN:</span></h4> <p class="DT"><span lang="EN-US">Windows Vista ISV Security</span></p> <p class="DL"><span lang="EN-US"><a href="http://msdn2.microsoft.com/en-us/library/bb430720.aspx">http://msdn2.microsoft.com/en-us/library/bb430720.aspx</a></span></p> <p class="DL"><span lang="EN-US"></span>&nbsp;</p> <p class="DT"><span lang="EN-US">Memory Management Registry Keys</span></p> <p class="DL"><span lang="EN-US"><a href="http://msdn2.microsoft.com/en-us/library/bb870880.aspx">http://msdn2.microsoft.com/en-us/library/bb870880.aspx</a><span class="MsoHyperlink"><o:p></o:p></span></span></p> <p class="DT"><span lang="EN-US"></span>&nbsp;</p> <p class="DT"><span lang="EN-US">Windows Driver Kit:</span></p> <p class="DL"><span lang="EN-US"><a href="http://msdn2.microsoft.com/en-us/library/aa972908.aspx">http://msdn2.microsoft.com/en-us/library/aa972908.aspx</a><b style="mso-bidi-font-weight: normal"><o:p></o:p></b></span></p> <p class="MsoBodyTextIndent2"><b><span lang="EN-US"></span></b>&nbsp;</p> <p class="MsoBodyTextIndent2"><b><span lang="EN-US">Kernel-Mode Driver Architecture Design Guide<br></span></b><span lang="EN-US">Memory Management<br>Interrupt Affinity and Priority<br>Standard Event Objects</span></p> <p class="MsoBodyTextIndent2"><b><span lang="EN-US"></span></b>&nbsp;</p> <p class="MsoBodyTextIndent2"><b><span lang="EN-US">Kernel-Mode Driver Architecture Reference<br></span></b><span lang="EN-US">Standard Driver Routines<br>Driver Support Routines</span></p> <p class="MsoBodyTextIndent2"><b><span lang="EN-US">Driver Development Tools<br></span></b><span lang="EN-US" style="mso-bidi-font-weight: bold">Boot Options for Driver Testing and Debugging<o:p></o:p></span></p> <p class="MsoBodyTextIndent2"><b style="mso-bidi-font-weight: normal"><span lang="EN-US"></span></b>&nbsp;</p> <p class="MsoBodyTextIndent2"><b style="mso-bidi-font-weight: normal"><span lang="EN-US">Network Design Guide</span></b><span lang="EN-US"><br>NDIS MSI-X</span></p> <h4><span lang="EN-US"></span>&nbsp;</h4> <h4><span lang="EN-US">Windows Hardware and Driver Central:</span></h4> <p class="DT"><span lang="EN-US">Driver Signing Requirements for Windows [home page]</span></p> <p class="DL"><span lang="EN-US"><a href="http://www.microsoft.com/whdc/winlogo/drvsign/drvsign.mspx">http://www.microsoft.com/whdc/winlogo/drvsign/drvsign.mspx</a><span style="color: #1f497d"><o:p></o:p></span></span></p> <p class="MsoBodyTextIndent2"><b style="mso-bidi-font-weight: normal"><span lang="EN-US"></span></b>&nbsp;</p> <p class="MsoBodyTextIndent2"><b style="mso-bidi-font-weight: normal"><span lang="EN-US">Digital Signatures for Kernel Modules on Systems Running <br><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="mso-spacerun: yes">&nbsp;</span>Windows Vista<br>Summary of Windows Kernel-Mode Driver Signing Requirements<o:p></o:p></span></b></p> <p class="DT"><span lang="EN-US"></span>&nbsp;</p> <p class="DT"><span lang="EN-US">Windows PC Accelerators: Performance Technology for Windows Vista</span></p> <p class="DL"><span lang="EN-US"><a href="http://www.microsoft.com/whdc/system/sysperf/accelerator.mspx">http://www.microsoft.com/whdc/system/sysperf/accelerator.mspx</a></span></p> <p class="DT"><span lang="EN-US"></span>&nbsp;</p> <p class="DT"><span lang="EN-US">What Is Really in That MDL?</span></p> <p class="DL"><span lang="EN-US"><a href="http://www.microsoft.com/whdc/driver/tips/mdl.mspx">http://www.microsoft.com/whdc/driver/tips/mdl.mspx</a></span></p> <p class="DT"><span lang="EN-US"></span>&nbsp;</p> <p class="DT"><span lang="EN-US">Interrupt Architecture Enhancements in Windows</span></p> <p class="DL"><span lang="EN-US"><a href="http://www.microsoft.com/whdc/system/bus/PCI/MSI.mspx">http://www.microsoft.com/whdc/system/bus/PCI/MSI.mspx</a></span></p> <p class="DT"><span lang="EN-US"></span>&nbsp;</p> <p class="DT"><span lang="EN-US">NUMA I/O Optimizations</span></p> <p class="DL"><span lang="EN-US"><a href="http://download.microsoft.com/download/a/f/d/afdfd50d-6eb9-425e-84e1-b4085a80e34e/SVR-T332_WH07.pptx">http://download.microsoft.com/download/a/f/d/afdfd50d-6eb9-425e-84e1-b4085a80e34e/SVR-T332_WH07.pptx</a></span></p> <h4><span lang="EN-US"></span>&nbsp;</h4> <h4><span lang="EN-US">Microsoft TechNet:</span></h4> <p class="DT"><span lang="EN-US">Inside the Windows Vista Kernel: Part 3 (April 2007)</span></p> <p class="DL"><span lang="EN-US"><a href="http://www.microsoft.com/technet/technetmag/issues/2007/04/VistaKernel/">http://www.microsoft.com/technet/technetmag/issues/2007/04/VistaKernel/</a></span></p> <h4><span lang="EN-US"></span>&nbsp;</h4> <h4><span lang="EN-US">Book:</span></h4> <p class="DT"><span class="Italic"><span lang="EN-US" style="mso-bidi-font-weight: bold">Windows Internals, Fourth Edition,</span></span><span class="Italic"><span lang="EN-US" style="font-weight: normal; mso-bidi-font-weight: bold"> <br></span></span><span lang="EN-US" style="font-weight: normal">Russinovich, Mark, and David A. Solomon. Redmond, WA: Microsoft Press, 2005</span></p> <p class="DL"><span lang="EN-US"><a href="http://www.microsoft.com/MSPress/books/6710.aspx">http://www.microsoft.com/MSPress/books/6710.aspx</a></span></p>]]></content:encoded>
    </item>
    <item>
      <title>DebugDiag 1.1에서 LeakTrack을 이용하여 Memory 와 Handle 관련 Leak 확인을 위한 덤프 생성 방법</title>
      <link>https://docs.microsoft.com/archive/blogs/yonghp/debugdiag-1-1-leaktrack-memory-handle-leak-49457</link>
      <pubDate>Fri, 13 Mar 2009 01:47:52 GMT</pubDate>
      <dc:creator><![CDATA[yonghp]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/yonghp/2009/03/13/debugdiag-1-1-leaktrack-memory-handle-leak-49457/</guid>
      <description><![CDATA[1. 시작 &gt; 모든 프로그램 &gt; Debug Diagnostics Tool 1.1 &gt; DebugDiag 1.1 (x86) 을 선택하셔서 DebugDiag 1.1 을...]]></description>
      <content:encoded><![CDATA[<p>1. 시작 &gt; 모든 프로그램 &gt; Debug Diagnostics Tool 1.1 &gt; DebugDiag 1.1 (x86) 을 선택하셔서 DebugDiag 1.1 을 실행 하세요.  <p>2. 기본 설정일 경우 아래와 같은 다이얼로그 박스가 기본적으로 표시됩니다. 그렇지 않은 경우 DebugDiag 의 메인 화면에서 “Add Rule” 버튼을 클릭 하시기 바랍니다.  <p>3. Rule Type을 선택하는 화면에서 3번째 형태인 “Memory and Handle Leak”을 선택하시고 “Next”버튼을 클릭 하세요.  <p><a href="https://msdnshared.blob.core.windows.net/media/TNBlogsFS/BlogFileStorage/blogs_msdn/yonghp/WindowsLiveWriter/DebugDiag1.1LeakTrackMemoryHandleLeak_CFA9/clip_image002_2.jpg" original-url="http://blogs.msdn.com/blogfiles/yonghp/WindowsLiveWriter/DebugDiag1.1LeakTrackMemoryHandleLeak_CFA9/clip_image002_2.jpg"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="311" alt="clip_image002" src="https://msdnshared.blob.core.windows.net/media/TNBlogsFS/BlogFileStorage/blogs_msdn/yonghp/WindowsLiveWriter/DebugDiag1.1LeakTrackMemoryHandleLeak_CFA9/clip_image002_thumb.jpg" original-url="http://blogs.msdn.com/blogfiles/yonghp/WindowsLiveWriter/DebugDiag1.1LeakTrackMemoryHandleLeak_CFA9/clip_image002_thumb.jpg" width="355" border="0"></a>  <p>4. 현재 버젼에서는 DebugDiag의 LeakTrack Rule 을 이용해서 여러개의 프로세스를 동시에 감시할 수 없습니다. 아래 그림과 같이 현재 실행 중인 프로세스 중에 문제 프로세스를 선택하시고 “Next”를 선택 합니다.  <p><a href="https://msdnshared.blob.core.windows.net/media/TNBlogsFS/BlogFileStorage/blogs_msdn/yonghp/WindowsLiveWriter/DebugDiag1.1LeakTrackMemoryHandleLeak_CFA9/clip_image004_2.jpg" original-url="http://blogs.msdn.com/blogfiles/yonghp/WindowsLiveWriter/DebugDiag1.1LeakTrackMemoryHandleLeak_CFA9/clip_image004_2.jpg"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="311" alt="clip_image004" src="https://msdnshared.blob.core.windows.net/media/TNBlogsFS/BlogFileStorage/blogs_msdn/yonghp/WindowsLiveWriter/DebugDiag1.1LeakTrackMemoryHandleLeak_CFA9/clip_image004_thumb.jpg" original-url="http://blogs.msdn.com/blogfiles/yonghp/WindowsLiveWriter/DebugDiag1.1LeakTrackMemoryHandleLeak_CFA9/clip_image004_thumb.jpg" width="358" border="0"></a>  <p>5. 다음 화면에서 아래 그림과 같이 Leak Rule을 설정 합니다. 일단 프로세스에 대한 Leak Rule의 작동과 동시에 Tracking을 시작하도록 하고  <p>6. 원래 10개의 덤프를 수집하도록 한 “Maximum number of userdumps created by this rule”을 적절한 값을 설정해 주시기 바랍니다. 아래 그림에서는 5로 변경해 놓은 상태 입니다.  <p>7. 좀더 자세한 모니터링을 위해서 화면 중간의 “Configure…” 버튼을 클릭 합니다.  <p><a href="https://msdnshared.blob.core.windows.net/media/TNBlogsFS/BlogFileStorage/blogs_msdn/yonghp/WindowsLiveWriter/DebugDiag1.1LeakTrackMemoryHandleLeak_CFA9/clip_image006_2.jpg" original-url="http://blogs.msdn.com/blogfiles/yonghp/WindowsLiveWriter/DebugDiag1.1LeakTrackMemoryHandleLeak_CFA9/clip_image006_2.jpg"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="324" alt="clip_image006" src="https://msdnshared.blob.core.windows.net/media/TNBlogsFS/BlogFileStorage/blogs_msdn/yonghp/WindowsLiveWriter/DebugDiag1.1LeakTrackMemoryHandleLeak_CFA9/clip_image006_thumb.jpg" original-url="http://blogs.msdn.com/blogfiles/yonghp/WindowsLiveWriter/DebugDiag1.1LeakTrackMemoryHandleLeak_CFA9/clip_image006_thumb.jpg" width="367" border="0"></a>  <p>8. 새로 표시되는 아래와 같은 다이얼로그 박스 화면에서 “Generate a userdump when virtual bytes reach” 를 설정하세요.  <p>9. 이경우 프로세스의 메모리 사용량이 500메가 바이트가 넘는 시점 부터 덤프를 생성하기 시작합니다. 프로세스 초기 실행시 메모리 사용량에 따라서 이값을 변경해 주시면 됩니다.  <p>즉, 최초 실행 시 Private Bytes가 200메가 바이트라면 이값을 250메가 바이트로 설정해 주시면 메모리 사용량이 증가하기 시작하는 시점에 덤프를 생성하기 시작합니다.  <p>10. LeakTrace은 프로세스 실행시에 메모리나 핸들을 사용하는 콜들을 Hooking해서 관련 Call이 일어나는 Thread의 Stack Trace를 메모리에 저장하게 됩니다. 이들 메모리에 의해서 실제 프로세스에서 나타나는 메모리 문제가 좀더 빨리 진행 될 수도 있으니 유의 하시기 바랍니다.  <p>11. “add each addition ???MB there after” 를 선택 하시면 이후 어느 정도 메모리가 증가할 때 마다 추가적으로 덤프를 수집하도록 할 수 있습니다. 아래 설정에서는 200 메가 바이트가 증가하게 되면 덤프를 수집하도록 해 놨습니다.  <p>12. 만일 Leak과 함께 Crash 현상이 같이 발생하는 경우 “Auto-create a crash rule to get userdump on unexpected process exit.”를 선택 하시면 프로세스 종료시에 덤프가 생성 됩니다. 이는 Hang과 Crash를 동시에 감시하도록 합니다.  <p>13. “Save &amp; Close” 버튼을 클릭하셔서 새로 표시된 다이얼로그 박스를 닫으신 후 “Next” 버튼을 클릭하세요.  <p><a href="https://msdnshared.blob.core.windows.net/media/TNBlogsFS/BlogFileStorage/blogs_msdn/yonghp/WindowsLiveWriter/DebugDiag1.1LeakTrackMemoryHandleLeak_CFA9/clip_image008_2.jpg" original-url="http://blogs.msdn.com/blogfiles/yonghp/WindowsLiveWriter/DebugDiag1.1LeakTrackMemoryHandleLeak_CFA9/clip_image008_2.jpg"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="343" alt="clip_image008" src="https://msdnshared.blob.core.windows.net/media/TNBlogsFS/BlogFileStorage/blogs_msdn/yonghp/WindowsLiveWriter/DebugDiag1.1LeakTrackMemoryHandleLeak_CFA9/clip_image008_thumb.jpg" original-url="http://blogs.msdn.com/blogfiles/yonghp/WindowsLiveWriter/DebugDiag1.1LeakTrackMemoryHandleLeak_CFA9/clip_image008_thumb.jpg" width="384" border="0"></a>  <p>14. 다음 화면에서 새로생성된 “Rule”의 이름과 덤프가 저장될 기본 위치를 확인 하세요.  <p>15. “Next” 버튼을 클릭하세요.  <p><a href="https://msdnshared.blob.core.windows.net/media/TNBlogsFS/BlogFileStorage/blogs_msdn/yonghp/WindowsLiveWriter/DebugDiag1.1LeakTrackMemoryHandleLeak_CFA9/clip_image010_2.jpg" original-url="http://blogs.msdn.com/blogfiles/yonghp/WindowsLiveWriter/DebugDiag1.1LeakTrackMemoryHandleLeak_CFA9/clip_image010_2.jpg"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="273" alt="clip_image010" src="https://msdnshared.blob.core.windows.net/media/TNBlogsFS/BlogFileStorage/blogs_msdn/yonghp/WindowsLiveWriter/DebugDiag1.1LeakTrackMemoryHandleLeak_CFA9/clip_image010_thumb.jpg" original-url="http://blogs.msdn.com/blogfiles/yonghp/WindowsLiveWriter/DebugDiag1.1LeakTrackMemoryHandleLeak_CFA9/clip_image010_thumb.jpg" width="313" border="0"></a>  <p>16. 마지막으로 “Activate the rule now”를 선택 하셔서 Rule이 바로 모니터링을 시작하도록 하신 후 “Finish” 버튼을 클릭 하세요.  <p><a href="https://msdnshared.blob.core.windows.net/media/TNBlogsFS/BlogFileStorage/blogs_msdn/yonghp/WindowsLiveWriter/DebugDiag1.1LeakTrackMemoryHandleLeak_CFA9/clip_image012_2.jpg" original-url="http://blogs.msdn.com/blogfiles/yonghp/WindowsLiveWriter/DebugDiag1.1LeakTrackMemoryHandleLeak_CFA9/clip_image012_2.jpg"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="277" alt="clip_image012" src="https://msdnshared.blob.core.windows.net/media/TNBlogsFS/BlogFileStorage/blogs_msdn/yonghp/WindowsLiveWriter/DebugDiag1.1LeakTrackMemoryHandleLeak_CFA9/clip_image012_thumb.jpg" original-url="http://blogs.msdn.com/blogfiles/yonghp/WindowsLiveWriter/DebugDiag1.1LeakTrackMemoryHandleLeak_CFA9/clip_image012_thumb.jpg" width="318" border="0"></a>  <p>&nbsp; <p>17. 여러개의 프로세스에 대한 LeakTrack을 하고 싶으신 경우 각각의 프로세스에 대해서 별도의 Rule을 추가하시거나 아래 그림과 같이 개별 프로세스에 대한 LeakTrace을 Eanble하시고 메모리 상태를 감시하면서 감시하시면서 Hang Dump를 수집하실 수 있습니다.  <p>* LeakTrack이 Enable된 프로세스는 아래 그림과 같이 “LeakTrack Status” column에 “Tracking”이라고 표시가 됩니다.  <p><a href="https://msdnshared.blob.core.windows.net/media/TNBlogsFS/BlogFileStorage/blogs_msdn/yonghp/WindowsLiveWriter/DebugDiag1.1LeakTrackMemoryHandleLeak_CFA9/clip_image014_2.jpg" original-url="http://blogs.msdn.com/blogfiles/yonghp/WindowsLiveWriter/DebugDiag1.1LeakTrackMemoryHandleLeak_CFA9/clip_image014_2.jpg"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="200" alt="clip_image014" src="https://msdnshared.blob.core.windows.net/media/TNBlogsFS/BlogFileStorage/blogs_msdn/yonghp/WindowsLiveWriter/DebugDiag1.1LeakTrackMemoryHandleLeak_CFA9/clip_image014_thumb.jpg" original-url="http://blogs.msdn.com/blogfiles/yonghp/WindowsLiveWriter/DebugDiag1.1LeakTrackMemoryHandleLeak_CFA9/clip_image014_thumb.jpg" width="355" border="0"></a>  <p>&nbsp; <p><font size="2"> Private Bytes와 Virtual Bytes 및 성능모니터로 Leak 을 확인하는 방법은 아래의 링크 내용을 참고하세요.</font> <p>&nbsp; <p>Using Performance Monitor to Find a User-Mode Memory Leak <p><a title="http://msdn.microsoft.com/en-us/library/cc267846.aspx" href="http://msdn.microsoft.com/en-us/library/cc267846.aspx">http://msdn.microsoft.com/en-us/library/cc267846.aspx</a> <p>&nbsp; <p>The <strong>Private Bytes</strong> counter indicates <u>the total amount of memory that a process has allocated, not including memory shared with other processes</u>. <p>The <strong>Virtual Bytes</strong> counter indicates<u> the current size of the virtual address space</u> that the process is using. ]]></content:encoded>
    </item>
    <item>
      <title>Registry를 이용한 BizTalk Server Version 확인 방법</title>
      <link>https://docs.microsoft.com/archive/blogs/yonghp/registry-biztalk-server-version</link>
      <pubDate>Wed, 04 Feb 2009 03:54:57 GMT</pubDate>
      <dc:creator><![CDATA[yonghp]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/yonghp/2009/02/04/registry-biztalk-server-version/</guid>
      <description><![CDATA[이 포스트는 아래 블로그 포스팅 내용을 한글화 한 것 입니다. Identify the version of installed...]]></description>
      <content:encoded><![CDATA[<p><font face="맑은 고딕" size="2">이 포스트는 아래 블로그 포스팅 내용을 한글화 한 것 입니다.</font></p> <p><font face="맑은 고딕" size="2">Identify the version of installed BizTalk<br></font><a href="http://blogs.msdn.com/kerreybpi/archive/2009/01/12/identify-the-version-of-installed-biztalk.aspx"><font face="맑은 고딕" size="2">http://blogs.msdn.com/kerreybpi/archive/2009/01/12/identify-the-version-of-installed-biztalk.aspx</font></a> <p><font face="맑은 고딕" size="2"></font>&nbsp; <p><font face="맑은 고딕" size="2">현재 서버에서 작동 중인 BizTalk Server의 버젼을 확인을 쉽게 할 수 있는 방법 입니다.</font> <p><font face="맑은 고딕" size="2"></font>&nbsp; <p><font face="맑은 고딕" size="2">아래그림과 같이 레지스트리 에티터를 여신 후 HKEY_LOCAL_MACHINE -&gt; Software -&gt; Microsoft -&gt; BizTalk Server -&gt; 3.0 아래에 ProductVersion 값을 확인 하시면 됩니다.</font> <p><a href="https://msdnshared.blob.core.windows.net/media/TNBlogsFS/BlogFileStorage/blogs_msdn/yonghp/WindowsLiveWriter/RegistryBizTalkServerVersion_FBE2/image_2.png" original-url="http://blogs.msdn.com/blogfiles/yonghp/WindowsLiveWriter/RegistryBizTalkServerVersion_FBE2/image_2.png"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="340" alt="image" src="https://msdnshared.blob.core.windows.net/media/TNBlogsFS/BlogFileStorage/blogs_msdn/yonghp/WindowsLiveWriter/RegistryBizTalkServerVersion_FBE2/image_thumb.png" original-url="http://blogs.msdn.com/blogfiles/yonghp/WindowsLiveWriter/RegistryBizTalkServerVersion_FBE2/image_thumb.png" width="484" border="0"></a>  <p>&nbsp; <p><font face="맑은 고딕" size="2">위의 값고 아래 테이블을 참고하세요.</font> <p>&nbsp;</p> <table cellspacing="0" cellpadding="0" width="400" border="1"> <tbody> <tr> <td valign="top" width="200"> <p align="center"><font size="2">ProductVersion Value</font></p></td> <td valign="top" width="200"> <p align="center"><font size="2">BizTalk Server Version</font></p></td></tr> <tr> <td valign="top" width="200"><font size="2"> 3.0.4902.0</font></td> <td valign="top" width="200"><font size="2"> BizTalk Server 2004</font></td></tr> <tr> <td valign="top" width="200"><font size="2"> 3.0.6070.0</font></td> <td valign="top" width="200"><font size="2"> BizTalk Server 2004 SP1</font></td></tr> <tr> <td valign="top" width="200"><font size="2"> 3.0.7405.0</font></td> <td valign="top" width="200"><font size="2"> BizTalk Server 2004 SP2</font></td></tr> <tr> <td valign="top" width="200"><font size="2"> 3.5.1602.0</font></td> <td valign="top" width="200"><font size="2"> BizTalk Server 2006</font></td></tr> <tr> <td valign="top" width="200"><font size="2"> 3.6.1404.0</font></td> <td valign="top" width="200"><font size="2"> BizTalk Server 2006 R2</font></td></tr> <tr> <td valign="top" width="200"><font size="2"> 3.6.1404.0 보다 큰 경우</font></td> <td valign="top" width="200"><font size="2"> BizTalk Server 2009</font></td></tr></tbody></table>]]></content:encoded>
    </item>
    <item>
      <title>Pickup 폴더내 파일의 복사본을 유지하는 방법</title>
      <link>https://docs.microsoft.com/archive/blogs/yonghp/pickup</link>
      <pubDate>Tue, 03 Feb 2009 03:11:05 GMT</pubDate>
      <dc:creator><![CDATA[yonghp]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/yonghp/2009/02/03/pickup/</guid>
      <description><![CDATA[BizTalk Server 용 응용프로그램을 만들때 일반적으로 File Receive Location(또는 FTP Receive Location)을 이용하게 됩니다. 일단 메시지...]]></description>
      <content:encoded><![CDATA[<p><font face="맑은 고딕" size="2">BizTalk Server 용 응용프로그램을 만들때 일반적으로 File Receive Location(또는 FTP Receive Location)을 이용하게 됩니다.</font></p> <p><font face="맑은 고딕" size="2">일단 메시지 파일을 Receive Location에서 설정된 Pickup 폴더에 복사하고 이파일이 없어지는 것을 보고 일단 메시지가 전달된 것으로 생각할 수 있습니다.</font></p> <p><font face="맑은 고딕" size="2"></font>&nbsp;</p> <p><font face="맑은 고딕" size="2">문제는 이 파일의 복사본을 유지하고 싶은 경우 현재 BizTalk Server가 지원하지 않는다는 것 입니다. 관련 기능을 원하시는 경우 </font><font face="맑은 고딕" size="2">아래의 CodePlex에서 제공되는 Message Archive Pipeline Component를 사용해 보시기 바랍니다.</font></p> <p><font face="맑은 고딕" size="2"></font>&nbsp;</p> <p><font face="맑은 고딕" size="2">대신 소스 코드가 같이 제공이 되고 있기 때문에 관련 Component에 기능추가 역시 가능 합니다. 물론 기능사용 전에 라이센스 역시 주의 해서 읽어 보시기 바랍니다.</font></p> <p><font face="맑은 고딕" size="2"></font>&nbsp;</p> <p><b><font face="맑은 고딕" size="2">BizTalk 2006 Message Archiving Pipeline Component</font></b></p> <p><a href="http://www.codeplex.com/btsmsgarchcomp"><font face="맑은 고딕" size="2">http://www.codeplex.com/btsmsgarchcomp</font></a> <p><font face="맑은 고딕" size="2"></font>&nbsp; <p><font face="맑은 고딕" size="2">위의 URL에서 다운로드 가능한 컴퍼넌트를 BizTalk Server에 설치 하신 후 Receive/Send Pipeline의 Decode stage에 넣어주신 후 관련 컴퍼넌트의 Properties를 설정해 주시면 됩니다.</font> <p><font face="맑은 고딕" size="2">사용법은 다음과 같습니다.</font> <p><font face="맑은 고딕" size="2"></font>&nbsp; <p><font face="맑은 고딕" size="2">1. 웹사이트에서 복사하신 파일의 압축을 푸신 후 Modhul.BizTalk.Pipelines.ArchiveMessages.dll 파일을 BizTalk 서버의 설치 폴더내 Pipeline Component 폴더 (일반적으로 C:\Program Files\Microsoft BizTalk Server 2006\Pipeline Components) 에 복사 하세요.</font> <p>&nbsp;</p> <p><a href="https://msdnshared.blob.core.windows.net/media/TNBlogsFS/BlogFileStorage/blogs_msdn/yonghp/WindowsLiveWriter/Pickup_F11C/clip_image002_2.jpg" original-url="http://blogs.msdn.com/blogfiles/yonghp/WindowsLiveWriter/Pickup_F11C/clip_image002_2.jpg"><font face="맑은 고딕" size="2"><a href="https://msdnshared.blob.core.windows.net/media/TNBlogsFS/BlogFileStorage/blogs_msdn/yonghp/WindowsLiveWriter/Pickup_F11C/clip_image002_2.jpg" original-url="http://blogs.msdn.com/blogfiles/yonghp/WindowsLiveWriter/Pickup_F11C/clip_image002_2.jpg"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="243" alt="clip_image002" src="https://msdnshared.blob.core.windows.net/media/TNBlogsFS/BlogFileStorage/blogs_msdn/yonghp/WindowsLiveWriter/Pickup_F11C/clip_image002_thumb.jpg" original-url="http://blogs.msdn.com/blogfiles/yonghp/WindowsLiveWriter/Pickup_F11C/clip_image002_thumb.jpg" width="377" border="0"></a></font></a></p> <p><font face="맑은 고딕" size="2"></font>&nbsp; <p><font face="맑은 고딕" size="2">2. Message File의 Archive 기능이 필요한 BizTalk Application Project에서 Receive Pipeline 을 추가하시고 (이미 있는 경우는 다음으로 진행하세요)</font> <p><font face="맑은 고딕" size="2"></font>&nbsp; <p><font face="맑은 고딕" size="2">3. 파이프 라인 파일을 여신 후 BizTalk Pipeline Components Toolxbox 에서 오른쪽 마우스 버튼을 클릭하셔서 “아이템 선택”을 클릭하시면 아래와 같은 다이얼로그 박스가 나타납니다.</font> <p><font face="맑은 고딕" size="2"></font>&nbsp; <p><font face="맑은 고딕" size="2">4. 아래 그림과 같이 “BizTalk Pipeline Components” 탭을 선택 하시고 Browser 버튼을 선택하셔서 1번에서 복사한 폴더로 이동 하신 후 컴퍼넌트를 선택하세요.</font> <p>&nbsp; <p><a href="https://msdnshared.blob.core.windows.net/media/TNBlogsFS/BlogFileStorage/blogs_msdn/yonghp/WindowsLiveWriter/Pickup_F11C/clip_image004_2.jpg" original-url="http://blogs.msdn.com/blogfiles/yonghp/WindowsLiveWriter/Pickup_F11C/clip_image004_2.jpg"><font face="맑은 고딕" size="2"><a href="https://msdnshared.blob.core.windows.net/media/TNBlogsFS/BlogFileStorage/blogs_msdn/yonghp/WindowsLiveWriter/Pickup_F11C/clip_image004_2.jpg" original-url="http://blogs.msdn.com/blogfiles/yonghp/WindowsLiveWriter/Pickup_F11C/clip_image004_2.jpg"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="257" alt="clip_image004" src="https://msdnshared.blob.core.windows.net/media/TNBlogsFS/BlogFileStorage/blogs_msdn/yonghp/WindowsLiveWriter/Pickup_F11C/clip_image004_thumb.jpg" original-url="http://blogs.msdn.com/blogfiles/yonghp/WindowsLiveWriter/Pickup_F11C/clip_image004_thumb.jpg" width="349" border="0"></a></font></a> <p><font face="맑은 고딕" size="2"></font>&nbsp; <p><font face="맑은 고딕" size="2">5. 컴퍼넌트의 선택이 정상적으로 완료되면 아래와 같이 Toolbox 내에 “Archive Messages”라는 컴퍼넌트가 추가 됩니다.</font> <p>&nbsp; <p><a href="https://msdnshared.blob.core.windows.net/media/TNBlogsFS/BlogFileStorage/blogs_msdn/yonghp/WindowsLiveWriter/Pickup_F11C/clip_image006_2.jpg" original-url="http://blogs.msdn.com/blogfiles/yonghp/WindowsLiveWriter/Pickup_F11C/clip_image006_2.jpg"><font face="맑은 고딕" size="2"><a href="https://msdnshared.blob.core.windows.net/media/TNBlogsFS/BlogFileStorage/blogs_msdn/yonghp/WindowsLiveWriter/Pickup_F11C/clip_image006_2.jpg" original-url="http://blogs.msdn.com/blogfiles/yonghp/WindowsLiveWriter/Pickup_F11C/clip_image006_2.jpg"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="264" alt="clip_image006" src="https://msdnshared.blob.core.windows.net/media/TNBlogsFS/BlogFileStorage/blogs_msdn/yonghp/WindowsLiveWriter/Pickup_F11C/clip_image006_thumb.jpg" original-url="http://blogs.msdn.com/blogfiles/yonghp/WindowsLiveWriter/Pickup_F11C/clip_image006_thumb.jpg" width="397" border="0"></a></font></a> <p><font face="맑은 고딕" size="2"></font>&nbsp; <p><font face="맑은 고딕" size="2">6. 추가된 컴퍼넌트를 선택하신 후 Drag 하셔서 “Decode” stage내의 추가 하시기 바랍니다.</font> <p>&nbsp; <p><a href="https://msdnshared.blob.core.windows.net/media/TNBlogsFS/BlogFileStorage/blogs_msdn/yonghp/WindowsLiveWriter/Pickup_F11C/clip_image008_2.jpg" original-url="http://blogs.msdn.com/blogfiles/yonghp/WindowsLiveWriter/Pickup_F11C/clip_image008_2.jpg"><font face="맑은 고딕" size="2"><a href="https://msdnshared.blob.core.windows.net/media/TNBlogsFS/BlogFileStorage/blogs_msdn/yonghp/WindowsLiveWriter/Pickup_F11C/clip_image008_2.jpg" original-url="http://blogs.msdn.com/blogfiles/yonghp/WindowsLiveWriter/Pickup_F11C/clip_image008_2.jpg"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="450" alt="clip_image008" src="https://msdnshared.blob.core.windows.net/media/TNBlogsFS/BlogFileStorage/blogs_msdn/yonghp/WindowsLiveWriter/Pickup_F11C/clip_image008_thumb.jpg" original-url="http://blogs.msdn.com/blogfiles/yonghp/WindowsLiveWriter/Pickup_F11C/clip_image008_thumb.jpg" width="338" border="0"></a></font></a> <p><font face="맑은 고딕" size="2"></font>&nbsp; <p><font face="맑은 고딕" size="2">7. 선택된 컴퍼넌트의 설정가능한 속성은 아래와 같습니다. 저장될 폴더 위치와 파일 이름등이 제공되고 있습니다. 기존에 사용 중인 MacroDefinition 파일이 있으시면 File이나 FTP 관련 부분을 추가 하신 후 MacroDefinitionFile Property에 위치를 적어주셔도 됩니다.</font> <p>&nbsp; <p><a href="https://msdnshared.blob.core.windows.net/media/TNBlogsFS/BlogFileStorage/blogs_msdn/yonghp/WindowsLiveWriter/Pickup_F11C/clip_image010_2.jpg" original-url="http://blogs.msdn.com/blogfiles/yonghp/WindowsLiveWriter/Pickup_F11C/clip_image010_2.jpg"><font face="맑은 고딕" size="2"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="231" alt="clip_image010" src="https://msdnshared.blob.core.windows.net/media/TNBlogsFS/BlogFileStorage/blogs_msdn/yonghp/WindowsLiveWriter/Pickup_F11C/clip_image010_thumb.jpg" original-url="http://blogs.msdn.com/blogfiles/yonghp/WindowsLiveWriter/Pickup_F11C/clip_image010_thumb.jpg" width="244" border="0"></font></a> <p><font face="맑은 고딕" size="2"></font>&nbsp; <p><font face="맑은 고딕" size="2">좀더 자세한 기능은 Readme.txt파일을 확인하시기 바랍니다.</font> <p><font face="맑은 고딕" size="2"></font>&nbsp; <p><font face="맑은 고딕" size="2">실제 파일을 저장하는 부분은 “ArchiveMessages.cs” 파일내의 StreamOnReadEvent EnentHandler에서 아래와 같이 코딩되어 있습니다.</font> <p><font face="맑은 고딕" size="2"></font>&nbsp; <p><font size="2">private void StreamOnReadEvent(object src, EventArgs args)<br>{<br>&nbsp;&nbsp;&nbsp; ReadEventArgs rargs = args as ReadEventArgs; </font> <p><font size="2">&nbsp;&nbsp;&nbsp; if (rargs != null)<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br></font><font color="#0000ff" size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; using (<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FileStream FileArchiveStream =<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; new FileStream(_archiveFilePath, FileMode.Append, FileAccess.Write))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; using (BinaryWriter FileBinaryWriter = new BinaryWriter(FileArchiveStream))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FileBinaryWriter.Write(rargs.buffer, 0, rargs.bytesRead); </font> <p><font size="2"><font color="#0000ff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Close the file writer.<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FileBinaryWriter.Flush();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FileBinaryWriter.Close();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</font><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; catch (IOException Ex)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ...<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; else<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ....</font></p> <p><font size="2">&nbsp;&nbsp;&nbsp; }<br>}</font></p> <p><font face="맑은 고딕" size="2"></font>&nbsp;</p> <p><font face="맑은 고딕" size="2">파일이 저장되도록 하기 위한 Event Handler의 등록은 IComponent Interface의 Execute Method를 Implement하는 코드에 나타납니다.</font></p> <p><font face="맑은 고딕" size="2"></font>&nbsp;</p> <p>IComponent.Execute Method <p><a title="http://msdn.microsoft.com/en-us/library/microsoft.biztalk.component.interop.icomponent.execute.aspx" href="http://msdn.microsoft.com/en-us/library/microsoft.biztalk.component.interop.icomponent.execute.aspx">http://msdn.microsoft.com/en-us/library/microsoft.biztalk.component.interop.icomponent.execute.aspx</a> <p>&nbsp;</p> <p><font size="2">public IBaseMessage Execute(IPipelineContext Context, IBaseMessage InMsg)<br>{<br>&nbsp;&nbsp;&nbsp; // Validate the Macro Definition configuration file.<br>&nbsp;&nbsp;&nbsp; if (ValidationHelper.ValidateMacroDefinitionsXmlConfiguration(_macroDefinitionsFile))<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Validate number of macro identifiers.<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if ((ValidationHelper.ValidateMacros(InMsg.MessageID, "Archive Directory", _archiveDirectoryMacroPath) &amp;&amp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (ValidationHelper.ValidateMacros(InMsg.MessageID, "Archive Filename", _archiveFilenameMacroPath))))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br></font><font color="#0000ff" size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (InMsg.BodyPart != null)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Expand macros and build the archive file path.<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _archiveFilePath = BuildArchiveFilePath(InMsg); </font> <p><font color="#0000ff" size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Wrap original stream in a Forward Only Event Stream (FOES) and<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // configure the read-event.<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Stream dataStream = InMsg.BodyPart.GetOriginalDataStream();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CForwardOnlyEventingReadStream eventingStream = new CForwardOnlyEventingReadStream(dataStream);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; eventingStream.ReadEvent += new ReadEventHandler(StreamOnReadEvent); </font> <p><font size="2"><font color="#0000ff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Assign FOES wrapper back to the BodyPart.<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; InMsg.BodyPart.Data = eventingStream;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</font><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; } </font> <p><font size="2">&nbsp;&nbsp;&nbsp; return (InMsg);<br>}</font></p>]]></content:encoded>
    </item>
    <item>
      <title>Maximum job history Log의 크기로 SQL Blocking이 발생할 수 있다.</title>
      <link>https://docs.microsoft.com/archive/blogs/yonghp/maximum-job-history-log-sql-blocking</link>
      <pubDate>Tue, 03 Feb 2009 02:48:46 GMT</pubDate>
      <dc:creator><![CDATA[yonghp]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/yonghp/2009/02/03/maximum-job-history-log-sql-blocking/</guid>
      <description><![CDATA[아래의 블로그 글에 약간의 살을 붙여서 글을 올립니다. &nbsp; Blocking on sql can occur if the Maximum job history log size...]]></description>
      <content:encoded><![CDATA[<p><font face="맑은 고딕" size="2">아래의 블로그 글에 약간의 살을 붙여서 글을 올립니다.</font></p> <p><font size="2"></font>&nbsp;</p> <p><font size="2">Blocking on sql can occur if the Maximum job history log size is greater than 1000 on the sql server agent</font></p> <p><a title="http://blogs.msdn.com/biztalkcpr/archive/2008/05/08/blocking-on-sql-can-occur-if-the-maximum-job-history-log-size-is-greater-than-1000-on-the-sql-server-agent.aspx" href="http://blogs.msdn.com/biztalkcpr/archive/2008/05/08/blocking-on-sql-can-occur-if-the-maximum-job-history-log-size-is-greater-than-1000-on-the-sql-server-agent.aspx"><font size="2">http://blogs.msdn.com/biztalkcpr/archive/2008/05/08/blocking-on-sql-can-occur-if-the-maximum-job-history-log-size-is-greater-than-1000-on-the-sql-server-agent.aspx</font></a></p> <p>&nbsp;</p> <p><font face="맑은 고딕" size="2">위의 글에서 언급하는 것과 같이 특별한 이유 없이 (즉, MessageBox나 DTADB의 크기나 부하에 크게 연관이 없이) 서비스 작동 중 BizTalk 서버의 메시지 전달 속도가 간헐적으로 현저하게 저하되는 문제가 발생하는 경우가 있습니다. 이때 문제 원인 확인을 위해서 SQL Profiler 로그를 확인한 결과 다음의 stored procedure에 의해서 SQL Blocking이 발생하고 있는 경우 아래의 내용을 참고하셔서 SQL Agent Job의 Maximum job history log의 size를 설정해 주시기 바랍니다.</font></p> <p><font size="2"></font>&nbsp;</p> <p><font color="#0000ff" size="1">CREATE PROCEDURE sp_jobhistory_row_limiter&nbsp;&nbsp;&nbsp; @job </font></p> <p><font color="#0000ff" size="1">SELECT @current_rows_per_job = COUNT(*)&nbsp;&nbsp;&nbsp; FROM msdb.dbo.sysjobhistory with (TABLOCKX)&nbsp;&nbsp;&nbsp; WHERE (job_id = @job_id)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ...</font>  <p>&nbsp;</p> <p><font face="맑은 고딕" size="2">위의 SP는 MsgBoxPerfCounters_GetPurgeJobInfo SP에 의해서 호출이되며 각각의 BizTalk Agent Job들이 얼마나 호출되었는지를 확인하는 위해서 사용 됩니다.</font></p> <p><font face="맑은 고딕" size="2">원본 블로그 글의 경우 이 SP가 만드는 Temp Table의 Row Count가 50000을 넘어가면서 문제가 나타났다고 합니다.</font></p> <p><font face="맑은 고딕" size="2"></font>&nbsp;</p> <p><font face="맑은 고딕" size="2">다음 내용은 SQL 2005서버에서의 설정 방법 입니다.</font> <p>&nbsp; <p><font face="맑은 고딕" size="2">1. BizTalk Server가 사용하는 SQL Server 에서 아래의 그림과 같이 “SQL Server Management Studio”를 실행 하신 후 왼쪽의 Object Explorer에서 “SQL Server Agent”를 선택 하시고 오른쪽 마우스 버튼을 클릭 하신 후 속성창을 실행하세요.</font> <p><font face="맑은 고딕" size="2"></font>&nbsp; <p><a href="https://msdnshared.blob.core.windows.net/media/TNBlogsFS/BlogFileStorage/blogs_msdn/yonghp/WindowsLiveWriter/MaximumjobhistoryLogSQLBlocking_EC0F/clip_image002_2.jpg" original-url="http://blogs.msdn.com/blogfiles/yonghp/WindowsLiveWriter/MaximumjobhistoryLogSQLBlocking_EC0F/clip_image002_2.jpg"><font face="맑은 고딕" color="#000000" size="2"><a href="https://msdnshared.blob.core.windows.net/media/TNBlogsFS/BlogFileStorage/blogs_msdn/yonghp/WindowsLiveWriter/MaximumjobhistoryLogSQLBlocking_EC0F/clip_image002_2.jpg" original-url="http://blogs.msdn.com/blogfiles/yonghp/WindowsLiveWriter/MaximumjobhistoryLogSQLBlocking_EC0F/clip_image002_2.jpg"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="383" alt="clip_image002" src="https://msdnshared.blob.core.windows.net/media/TNBlogsFS/BlogFileStorage/blogs_msdn/yonghp/WindowsLiveWriter/MaximumjobhistoryLogSQLBlocking_EC0F/clip_image002_thumb.jpg" original-url="http://blogs.msdn.com/blogfiles/yonghp/WindowsLiveWriter/MaximumjobhistoryLogSQLBlocking_EC0F/clip_image002_thumb.jpg" width="471" border="0"></a></font></a> <p>&nbsp; <p><font face="맑은 고딕" size="2">2. 아래의 그림과 같은 SQL Server Agent Properties 창에서 왼쪽 항목의 마지막에 있는 “History” 를 선태하세요.</font> <p><font face="맑은 고딕" size="2">3. 아래의 그림에서 오른쪽의 붉은 박스 내용과 비교하셔서 “Limit size of history log” 항목을 선택하시고 “Maximum job history rows per job” 항목의 값이 1000을 넘지 않도록 설정해 주시기 바랍니다.</font> <p><a href="https://msdnshared.blob.core.windows.net/media/TNBlogsFS/BlogFileStorage/blogs_msdn/yonghp/WindowsLiveWriter/MaximumjobhistoryLogSQLBlocking_EC0F/clip_image004_2.jpg" original-url="http://blogs.msdn.com/blogfiles/yonghp/WindowsLiveWriter/MaximumjobhistoryLogSQLBlocking_EC0F/clip_image004_2.jpg"><font face="맑은 고딕" color="#000000" size="2"><a href="https://msdnshared.blob.core.windows.net/media/TNBlogsFS/BlogFileStorage/blogs_msdn/yonghp/WindowsLiveWriter/MaximumjobhistoryLogSQLBlocking_EC0F/clip_image004_2.jpg" original-url="http://blogs.msdn.com/blogfiles/yonghp/WindowsLiveWriter/MaximumjobhistoryLogSQLBlocking_EC0F/clip_image004_2.jpg"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="273" alt="clip_image004" src="https://msdnshared.blob.core.windows.net/media/TNBlogsFS/BlogFileStorage/blogs_msdn/yonghp/WindowsLiveWriter/MaximumjobhistoryLogSQLBlocking_EC0F/clip_image004_thumb.jpg" original-url="http://blogs.msdn.com/blogfiles/yonghp/WindowsLiveWriter/MaximumjobhistoryLogSQLBlocking_EC0F/clip_image004_thumb.jpg" width="590" border="0"></a></font></a></p>]]></content:encoded>
    </item>
  </channel>
</rss>