IIS中死循环的解决方法 dllhost占用大量内存,cpu占用100%

一、dllhost占用大量内存的可能原因:

 

1 、感染了的病毒
用杀毒软件好好查一查

2、web程序问题

A、在你的程序中,没有及时关闭数据库和记录集的连接很容易造成内存泄漏和sql进程死锁。所以写程序时,一定要尽快释放系统内存资源
rs.close
set rs=nothing
conn.close
set conn=nothing

  除了要尽快释放asp中对象占用的资源,还要及时释放存储有较多数据的变量和数组,尤其是数组,语法同上:

set 变量名=nothing

对于释放数组,

未定义大小的可变数组可直接使用 set 数组名=nothing

已定义大小的固定数组,则使用 set 数组名(n)=nothing ,如,set strArticle(20)=nothing

B、程序中出现了死循环。比如,你的asp调用sql语句出错了。就像有位朋友说的是数据库错了。在用asp执行sql语句时,进入死循环,使得dllhost占用100%的cpu。我在调试程序时,很头疼的。我碰到的几次都是调用update的时候,怎么看都没看出bug来。。后来就干脆自己重写写update的语句。大家在调试asp的网站时,建议大家对update的语句留个心眼。

注:如果由于程序原因导致IIS崩溃,可使用win系统目录下的IIS重启工具

位置在:C:/WINNT/system32/iisreset.exe 重新启动IIS,也可以直接在IIS管理面板进行重启。

3、IIS配置问题

在IIS5.0版本中,你可以通过三个选项来控制ASP应用程序的独立性(isolation.exe)
站点属性==>主目录==>应用程序保护

Application Protection选项影响可执行文件和组件运行的方式。
Application Protection选项如表3-2所示:

低(IIS进程)
带有这种设置的ASP虚拟应用程序的所有可执行文件和组件运行在Web服务器的可执行文件(Inetinfo.exe)的进程(即内存空间)中。因此,如果可执行文件或组件之一失败的话,Web服务器处于危险状态。这提供了最快和以最少的资源执行的选项

中(共用的)
(缺省)带有这种设置的ASP虚拟应用程序的所有应用程序的可执行文件和组件是运行在DLLHost.exe的单个共享实例的进程(即内存空间)中。这就防止了Web服务器可执行文件(Inetinfo.exe)受可执行文件或组件失败的影响。然而,一个失败的可执行文件或组件可能引起DLLHost.exe进程失败,以及所有其他驻留其中的可执行文件和组件失败

高(独立的)
带有这种设置的ASP虚拟应用程序的所有应用程序的可执行部分和组件是运行在DLLHost.exe的单个共享实例的进程(即内存空间)中,但是每个ASP应用程序都有自己的DLLHost.exe实例,该实例对该应用程序是独占的。这就防止了Web服务器可执行文件(Inetinfo.exe)受可执行文件或组件失败的影响,并防止虚拟应用的单个共享实例受另一个虚拟应用程序的一个可执行文件或组件失败的影响。
Microsoft建议最多有十个这样的虚拟应用程序驻留在一个Web服务器上

看看是不是独立配置为高的站点
com+独立运行可能需要采用IWAM_XXX用户运行,可能该用户运行DLL文件出现权限问题或也有可能该站点使用的DLL内部出错,弹出对话框等待关闭,就会出现死寂情况。

办法:
1、检查DLL问题
2、删掉此站点重新配置一次。

二、在进程管理中有两个运行的dllhost.exe,这是什么原因?

Dllhost是Windows 2000上所有COM+应用的宿主进程。例如,IIS使用Dllhost来运行ASP和其他的脚本引擎,如Perl等。如果它们占用大量资源,很可能是您的COM+应用程序发生了问题。下面以IIS为例,介绍一些初步的调试步骤:首先用停止IIS服务,如果这两个进程消失,则确认是IIS的问题。然后逐个停止IIS中的各个站点,找到具体导致问题的站点。再根据站点的具体情况来对相应的web应用程序进行调试。

2个DLLHOST,一个是公共的,一个是独立的

三、相关文章

1、[峰言峰语]wmi实现iis的智能重启
wolfeng 发表于 2005-5-30 9:49:31
公司的web服务器老是由于dllhost.exe 的内存占用过大而当掉,导致asp页面不能正常访问,最可气的是这种情况每每发生在我休假的时候,不得已被拉回来重启一下iis,为了使自己的五一长假能安稳些,写了个iis的自动重启程序,我见网上类似的程序,都是定时重启,我理想的状况是不要过于频繁启动,只在dllhost.exe这个进程当掉的时候,再重启,于是有了下面这段代码,原理是监视应用程序日志,当出现事件id是5的错误时(无法为asp程序提供足够内存),重启iis,呵呵。

strFullName = WScript.FullName
strWshHost = Right(strFullName, 11)
WScript.Echo "Default script host: " & strWshHost
If strWshHost = "WScript.exe" Then
Set objShell = CreateObject("WScript.Shell")
objShell.Run _
"%comspec% /k ""cscript //h:cscript&&cscript fu.vbs""", _
MAXIMIZE_WINDOW
If Err.Number <> 0 Then
WScript.Echo "Error 0x" & hex(Err.Number) & " occurred. " & _
Err.Description & ". " & VbCrLf & _
"Could not temporarily change the default script host to Cscript."
Err.Clear
WScript.Quit
End If
WScript.Quit
End If
’----上面这段代码是强制到cscript命令行,一般要在cmd命令行下输入cscript *.vbs,如果直接执行vbs会用wscript打开,这样只会弹个对话框,我不喜欢,有不想每次都cscript,所以要写点额外的代码,双击后会调用一个wscript执行csript,然后再消灭自己,幸好微软的网站上提供了这个代码------------------------------------
strComputer = "."
Set objWMIService = GetObject("winmgmts:" _
& "{impersonationLevel= impersonate, (Security)}!//" & strComputer & "/root/cimv2")
Set colMonitoredEvents = objWMIService.ExecNotificationQuery _
("Select * from __instancecreationevent where TargetInstance isa’Win32_NTLogEvent’ and TargetInstance.EventCode = ’4’ ")
Wscript.Echo "开始监视iis于 "&now
Do
Set objLatestEvent = colMonitoredEvents.NextEvent
Wscript.Echo "重新启动iis "&now
Set objShell = CreateObject("WScript.Shell")
objShell.Run "%COMSPEC% /c IISRESET.EXE",,1
’------核心程序,呵呵,短吧,wmi万岁

whichfile=("iisresetlog.htm")
set fso=createobject("Scripting.FileSystemObject")
if Not fso.FileExists(whichfile) then
iomode=2 : create=true
’Set MyFile = fso.CreateTextFile(whichfile,True)
else
iomode=8 : create=false
’Set MyFile = fso.CreateTextFile(whichfile)
end if
set MyFile = fso.OpenTextFile(whichfile,iomode,create)
’MyFile.writeLine("事件发生于 "&now&" 重启iis成功"&vbctrf)
if create=true then
MyFile.WriteLine "<html>"
MyFile.WriteLine "<head>"
MyFile.WriteLine "<title>Process Report</title>"
MyFile.WriteLine "</head>"
MyFile.WriteLine "<body bgcolor=#CCCCCC>"
MyFile.WriteLine "<h3>iisreset Report</h3>" & vbCrLf
end if
MyFile.WriteLine "<table BORDER=1 bordercolor=#666666 cellpadding=0 cellspacing=0 width=60%>"
MyFile.WriteLine "<tr>"
MyFile.WriteLine _
"<td>iis重启时间:</td><td>" &now& "</td>"
MyFile.WriteLine "<td>是否成功:</td><td>是</td>"
MyFile.WriteLine "</tr>"
MyFile.WriteLine "</table>"
MyFile.Close
set fso=nothing
Loop
’-----用fso记录iis 重启日志。

注释:■%comspec%
打开一个命令行窗口。%comspec% 是一个指向当前命令行外壳的环境变量。通过使用 %comspec%,您不必担心命令行外壳是 cmd.exe 还是 command.exe;%comspec% 会自动选择正确的一个。

■/k
在调用 Dir 命令后,确保窗口始终保持打开。这就是 /k 参数的用处。如果我们想要确保命令窗口会在 Dir 命令调用完成后被自动关闭,应该将 /k (keep) 修改为 /c (close)。


2、如何在 IIS 5.0 中排查 ASP 故障

文章编号 : 309051
最后修改 : 2005年8月12日

概要
本文逐步介绍当 ASP (Active Server Pages) 在 Internet 信息服务 (IIS) 5.0 Web 服务器上停止响应时所采取的故障排除步骤。平台可以是任意版本的 Windows 2000。

如何在 IIS 5.0 中排查 ASP 故障
注意:在开始之前,请确保在所讨论的 Web 服务器上打开了 .html 或 .htm 文件。如果这些文件未打开,则不属于 ASP 问题。

1. 如果 Global.asa 文件位于网站的根目录中,请将其重命名为 Global.old,停止并重新启动 Web 服务,然后在记事本中使用以下代码创建一个 ASP 测试页:

<%
Response.Write "This is a test ASP page."
%>

在您的网站的根目录中将该文件另存为 Test.asp,并尝试在 Web 服务器上打开该文件。

如果在执行该步骤后,Web 浏览器中加载了 ASP 页,则 Global.asa 文件存在问题。如果 ASP 页仍未加载,请接着执行步骤 2。

有关 Global.asa 文件故障排除方面的其他信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:

288245 (http://support.microsoft.com/kb/288245/) PRB:无法从 Windows 98 上的 Personal Web Server 中激发 Global.asa
265275 (http://support.microsoft.com/kb/265275/) FP2000:Global.asa 无法在 FrontPage 网站中运行
173742 (http://support.microsoft.com/kb/173742/) FIX:如果限制 Web 访问,将无法执行 Global.asa
2. 将网站的应用程序保护设置为低,然后停止并重新启动 IISAdmin 服务。

如果在执行此步骤后 Web 浏览器中加载了 ASP 页,则 IWAM 帐户存在问题,您可以接着执行步骤 3。如果 ASP 页仍未加载,请检查管理工具中的组件服务以确保可以查看 IIS 程序包。这可确保组件服务没有故障。确保在本地用户组中存在以下用户:

• NT AUTHORITY/Authenticated Users
• NT AUTHORITY/INTERACTIVE

有关组件服务管理单元故障排除方面的更多信息,请参阅以下知识库文章:

301919 (http://support.microsoft.com/kb/301919/) PRB:无法在“组件服务”MMC 管理单元中展开“我的电脑”
3. 如果在执行步骤 2 后 Web 浏览器中加载了 ASP 页,请将网站的应用程序保护级别重新设为中或高,并将 IWAM 帐户添加到本地管理员组中。

如果在执行此步骤后 Web 浏览器中加载了 ASP 页,则存在与 IWAM 帐户有关的权限问题,您可以接着执行步骤 4。如果 ASP 页仍未加载,请从命令行运行 Synciwam.vbs 实用工具。为此,请打开命令提示窗口并键入 C:/Inetpub/adminscripts>cscript synciwam.vbs。

有关 IWAM 用户帐户导致 ASP 出现故障的情况的其他信息,请参阅下列知识库文章:

308622 (http://support.microsoft.com/kb/308622/) 如何在 Windows 2000 中从命令提示符执行 IIS 中的管理任务
297989 (http://support.microsoft.com/kb/297989/) PRB:为 IWAM 帐户配置的标识不正确
255770 (http://support.microsoft.com/kb/255770/) PRB:运行进程外 Web 时出现“Logon Failure:Unknown User Name or Bad Password”(登录失败:未知的用户名或错误密码)错误信息
236007 (http://support.microsoft.com/kb/236007/) 降级域控制器导致进程外应用程序失败
4. 要解决 IWAM 帐户的权限问题,请使用适用于 Windows 2000 的 Regmon 和 Filemon 第三方产品。

要下载这些实用工具,请参见下面的网站:
http://www.sysinternals.com ;(http://www.sysinternals.com)
请在请求 ASP 页的同时运行这些实用工具,然后针对 Dllhost.exe 进程,在 Regmon 中搜索“ACCDENIED”,在 Filemon 中搜索“FAILURE”。

注意:如果对于 Iexplore.exe (Microsoft Internet Explorer) 进程,出现“access denied”(拒绝访问)错误信息,请不要惊慌。这是正常现象。

有关 IIS 正常运行所需的最小权限的更多信息,请参阅下列知识库文章:

271071 (http://support.microsoft.com/kb/271071/) 如何为 IIS 5.0 Web 服务器设置必需的 NTFS 权限和用户权限
在识别针对 Dllhost.exe 进程的“access denied”(拒绝访问)错误信息后,请使用 Regedt32 在注册表中对 NTFS 权限进行必要的修改。

5. 在系统事件日志中,查找以下事件:

Source:DCOM
Event ID: 10010
User:NT AUTHORITY/SYSTEM
Description:The server {3D14228D-FBE1-11D0-995D-00C04FD919C1} did not register with DCOM within the required timeout.
在事件日志中,该错误信息之后还有与下面内容类似的警告消息:
Source:W3SVC
Event ID: 36
User:N/A
Description:The server failed to load application ’AppPath’.The error was ’Server execution failed’.
%SystemRoot%/Iis5.log 文件中也可能出现与下面内容类似的条目:
OC_ABOUT_TO_COMMIT_QUEUE:Unreg iis_core:FindModules:FindProcessByNameW failed!
如果收到上述错误信息,则 NT AUTHORITY/Authenticated Users 或 NT AUTHORITY/INTERACTIVE 项已经被从用户组中删除。要解决该问题,请确保 Authenticated Users 和 INTERACTIVE 是该计算机的用户组的成员。

有关其他信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:

327153 (http://support.microsoft.com/kb/327153/) PRB:无法处理 ASP 页并且在系统日志中出现 DCOM 事件 10010
6. 实在迫不得已,您可以重新创建 IIS 程序包。

为此,请按照下列步骤操作:

a. 浏览至“组件服务”并删除下列程序包:注意:要删除这些程序包,必须首先打开程序包的属性,单击高级选项卡,然后单击以清除禁止删除复选框。

• IIS In-Process Applications
• IIS Out-of-Process Pooled Applications
• IIS Utilities

b. 打开命令提示窗口,然后使用以下命令切换目录:
cd %windir%/system32/inetsrv

c. 运行以下命令:
rundll32 wamreg.dll, CreateIISPackage
注意:必须准确键入“CreateIISPackage”;它区分大小写。
regsvr32 asptxn.dll
d. 关闭并重新打开“组件服务”。您应看到已经重新创建的所有这三个 IIS COM+ 应用程序。
e. 从命令行运行 IISRESET,并对先前未正确加载的任意 ASP 页进行测试。 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值