一、【症状】
- XEON处理器,4G内存,WINDOWS 2003 最新企业版,IIS 6,ASP环境。
- 应用程序池达到6个,其中有一个程序池配置了20个进程。其余5个单独运行其它应用~
- 其中一个应用的ASP程序不间断报错:500.13–服务器太忙
- 在【应用程序日志】中大量报错:The run-time environment has detected an inconsistency in its internal state.This indicates a potential instability in the process that could be caused by the custom components running in the COM+ application, the components they make use of, or other factors. Error in d:\nt\com\complus\src\comsvcs\threads\stathread.cpp(285), hr = 8007000e: CSTAThread: CoGetApartmentID failed
- 中文版本错误:运行时环境检测到其内部状态存在不一致。这说明进程中存在潜在的不稳定性,可能是由于 COM+ 应用程序中运行自定义组件、COM+ 应用程序使用的组件或其他因素引起的。d:\nt\com\complus\src\comsvcs\threads \stathread.cpp(285)中的错误,hr = 80070008: CSTAThread: CoGetApartmentID failed
- 查看W3C版本的IIS日志,报错ASP_0148|Server_Too_Busy。
- 日志查看器中的EVENT为4689
- 使用性能查看器,查看Active Server Page-> Request Queued 队列,大于系统的Max Requsest Queued队列值。
二、【原因】
具体原因可参考【参考链接4】,MSDN微软官方团队的说法,针对桌面程序堆(HEAP)错误。简单的解释就是应用程序池太多,导致 DLLHOST.EXE达到最大的HEAP限制,不是WINDOWS底层的程序员,所以只明白这个错误大概的原理,具体原因还得参考【链接4】
三、【解决方案】
HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\SubSystems\Windows –>SharedSection =1024,3072,512
打开注册表编辑器,将红字部分稍稍调大一些,比如1024,就可以避免堆错误。可以反复试验,也可以用链接4中的堆观察器(需要拥有最高权限才可安 装的小工具,底层驱动),观察每个进程的堆情况,进而根据IIS中应用程序池的设置,推算出最合适的大小。
===================================
四、【参考链接】
- http://bytes.com/topic/asp-classic/answers/632420-error-500-13-server-too-busy-event-4689-a
- http://forums.iis.net/p/1146213/1866717.aspx
- http://msmvps.com/blogs/alvin/archive/2008/04/07/com-the-run-time-environment-has-detected-an-inconsistency-in-its-internal-state.aspx
- http://blogs.msdn.com/ntdebugging/archive/2007/01/04/desktop-heap-overview.aspx
链接1为英文的问题,链接2为解决方法但作者理解不对,链接3解决方法正确,且概念正确。链接4为官方解决方案,最权威。