我在托管公司工作,提供ASP.Net 3.5托管服务。老实说,我们通常提供相当好的正常运行时间和速度。但是,我们的共享池有问题。像往常一样,我们尝试最大化可以在一个池中运行的网络数量。
最近我们遭遇连续不断的徘徊。该过程不会崩溃,但会开始显示OutOfMemoryExceptions或停止处理请求。我们认为这是其中一个应用程序的责任(知道哪个应用程序会很好)。
我有一些使用WinDbg处理过的内存转储。我跑了f.e:
!dumpheap -stat
此方法提供对象的全局内存使用。没什么了不起的......我也检查过:
~*e!clrstack
我看到各种非托管线程。在那些被管理的人看来堆栈如:
[HelperMethodFrame_1OBJ: 0f30e320]
System.Threading.WaitHandle.WaitMultiple(System.Threading.WaitHandle...
0f30e3ec 7928b3ff System.Threading.WaitHandle.WaitAny(System.Threading...
0f30e40c 7a55fc89 System.Net.TimerThread.ThreadProc()...
0f30e45c 792d6e46 System.Threading.ThreadHelper.ThreadStart_Context(System...
0f30e468 792f5781 System.Threading.ExecutionContext.runTryCode(System...
至少,我没有看到异常抛掷或类似(在那一刻)。我还可以访问由Tess Ferrandez编写的两个脚本来计算会话数和大小。这里也没有有希望的结果。任何特殊或显着的东西(平均24000字节)。
我想知道你在面对这类问题时通常使用什么样的策略。你曾经使用过Microsoft支持吗?
非常感谢!
答案 0 :(得分:2)
非常好的问题,一个糟糕的asp.net可以在同一个池中挂起所有共享的网络应用程序......
好的,让我们看看......如果问题出现在内存中,请从Sysinternals获取VMMap,以及Process Explorer
运行它们,并从Process explorer中找到您要调查的池的 PID编号,它位于inetinfo.exe下,并且可能名称为 aspnet_wp.exe 强>
现在在VMMap上添加用于监视此Pool的用于帮助PID,瞧,你看到内存和开放图像(aspx文件)可能很多并且产生问题...你要去的文件看看是否位于asp.net Framework的临时,但你可以连接它们,并从巫婆网站看到它们来自。
如果问题不是在内存上,但是程序员已经创建了错误的循环,甚至创建了线程休眠,那么我认为进程资源管理器是一种调查池并搜索最新功能的方法。
也许游泳池每15分钟回收一次可以解决这个问题?
在这些视频中,有很多关于VMMap和内存管理器的信息。 Mysteries of Windows Memory Management, Part 1和, Part 2
答案 1 :(得分:1)
有很多工具,但听起来你的主要目标是确定造成问题的原因。这可以通过二进制搜索非常简单地完成。
将游泳池分成两半,看看哪一个崩溃了。重复,直到你有一个只有一个应用程序的崩溃池。
这已经是O(log2n),但您可以通过划分为两个以上的子池来任意加快进程。