我怀疑我的服务器上的一个网站存在内存泄漏,因为 w3wp.exe 进程似乎比正常情况下增长得更快,而且我遇到了几个 OutOfMemoryExceptions。
有没有简单的方法可以确定 IIS 中每个网站/应用程序池使用了多少 RAM?
答案1
我意识到其他人已经给出了答案“将每个网站移到它自己的应用程序池中”,所以我不是想重复,而是想给出一个更彻底的答案。首先将每个网站移到它自己的应用程序池中 - 如果你有“很多”网站,你至少可以先将它们分成几组。真的没有理由将每个应用程序池分配给不同的帐户,有一种更简单的方法可以查看哪个应用程序池导致了问题。
接下来使用 iisapp.vbs:http://www.microsoft.com/technet/prodtechnol/WindowsServer2003/Library/IIS/b8721f32-696b-4439-9140-7061933afa4b.mspx?mfr=true这是一个简单的命令行实用程序。
打开任务管理器,添加列 PID(进程标识符)。从命令行运行 iisapp.vbs,它会告诉您哪个 w3wp.exe 服务属于哪个应用程序池(按 PID),您可以从那里缩小范围。
一旦您将有问题的网络隔离在应用程序池中,并且需要帮助诊断导致泄漏的原因,您可以使用微软 IIS 调试工具:http://www.microsoft.com/downloads/details.aspx?FamilyID=28bd5941-c458-46f1-b24d-f60151d875a3&DisplayLang=en
然后:
IIS 调试诊断工具可以帮助跟踪工作进程中的 CPU 和内存问题。Microsoft 有一篇很好的知识库文章,其中也介绍了基础知识:http://support.microsoft.com/kb/919791。
在系统本地安装 IIS 调试诊断。
在开始 > 程序 > IIS 诊断 > 调试诊断工具 > 调试诊断工具下打开调试诊断工具。
单击“工具”>“选项和设置”>“性能日志”选项卡。选择“启用性能计数器数据记录”选项。单击“确定”。
使用任务管理器找到工作进程的PID。
选择“进程”选项卡并在列表中找到该进程。
右键单击该进程并选择“创建完整用户转储”。这将需要几分钟,然后会弹出一个框,提供转储文件的路径。
选择高级分析选项卡并单击添加数据文件按钮。浏览到创建的转储文件并单击确定。
从可用分析脚本框中选择崩溃/挂起分析器,用于 CPU 性能和崩溃分析。单击开始分析。
几分钟后,应生成一份报告,其中包含堆栈跟踪信息以及有关执行时间超过 90 秒的任何请求的信息。请注意,内存转储将使用几百兆字节的空间,因此请确保将该工具安装在具有足够调试空间的驱动器上。此外,如果机器负载很重,您可以在系统上创建用户转储,将文件复制到工作站,然后在本地执行分析。
答案2
如果您想知道哪个网站消耗的内存比您需要分配专用应用程序池的内存多,您可以通过任务管理器诊断您的问题。
答案3
每个应用程序池都应该在任务管理器中拥有自己的进程。
如果您向几个本地帐户发送垃圾邮件,则可以将每个应用程序池分配给不同的帐户,从而确定哪个应用程序池导致了问题。
您还应该去看看: https://stackoverflow.com/questions/363680/stringbuilder-for-string-concatenation-throws-outofmemoryexception 因为这可能是导致你记忆问题的原因。