IIS系统.OutOfMemoryException问题网络服务

3
我们有一个Asp.Net Web Service,出现了System.OutOfMemoryException异常:类型为“System.OutOfMemoryException”的异常被引发。在System.Threading.Thread.StartInternal(IPrincipal principal, StackCrawlMark& stackMark)和System.Threading.Thread.Start()中出现异常。我们正在刷新应用程序池来临时解决问题。问题似乎每4-5个小时就会重新发生。该Web服务基本上返回来自SQL Server DB的存储过程中的数据。这是一个传统的应用程序,在几年内没有进行任何代码更改。一个长期稳定的应用程序是否可能突然出现内存泄漏问题?

仅凭直觉... 您在IIS配置中更改了任何内容吗?例如,您将应用程序分配给另一个应用程序池了吗?您是否勾选了每X分钟重置池的选项? - Francesco B.
1个回答

2
你需要分析IIS应用程序池的内存转储文件来解决此问题。我以前也做过同样的事情,一旦你熟悉了这些工具,它并不太困难。
以下是需要安装的工具:
1. WinDbg - https://go.microsoft.com/fwlink/p/?LinkId=536682 - 确保只安装Windows调试工具组件,因为它链接到完整的SDK。 2. Windows符号服务器 - srvc:\symbolshttps://msdl.microsoft.com/download/symbols。在WinDbg的“文件”菜单中,选择“符号文件路径”,并添加此路径(您可以更改c:\symbols的位置,但请确保该目录存在且位于进行调试工作的系统本地)。 3. SOS WinDbg扩展 - C:\Windows\Microsoft.NET\Framework64\v4.0.30319\SOS.dll。将此DLL复制到Windows调试工具目录中。
安装好这些工具后,您需要获取内存转储文件并对其进行分析。
以下是分析步骤:
1. 通过任务管理器获取应用程序的内存转储文件。请确保使用与应用程序相同的位数的任务管理器,即如果您的IIS应用程序池在64位上运行,则使用64位的任务管理器。 2. 使用适当的32/64位WinDbg版本,然后通过WinDbg的“文件”菜单打开内存转储文件。 3. 加载sos,请使用此命令:​.loadby sos clr 4. 有一堆有用的sos命令可用于故障排除,但我们对内存问题感兴趣的是这个命令:!dumpheap -stat。这将为您提供所有当前加载的类型以及它们正在使用的内存量。 5. 您还可能需要确认它不是线程争用问题。可以帮助解决这些问题的命令是:!sos.syncblk,以查看是否有任何线程被阻塞,以及!runaway​,以查看是否有任何线程运行了过长时间。这两种情况都可能导致应用程序变得无响应,并且可以通过IISRESET或回收站来解决。
再次强调,WinDbg有一定的学习曲线,但一旦您掌握了它,就可以快速诊断此类问题。

1
谢谢,这确实有帮助。我们有一个本地内存泄漏问题。但我找不到问题的根本原因。 - Gopinath
很高兴能帮助 @Gopinath。 - Always Learning

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接