【问题标题】:Debugging ASP.Net shared pool techniques调试 ASP.Net 共享池技术
【发布时间】:2010-11-15 17:01:23
【问题描述】:

我在一家托管公司工作,提供 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 支持吗?

非常感谢!

【问题讨论】:

  • 您在每个池中运行多少个站点?
  • 了解服务器有多少内存以及它是 32 位还是 64 位 windows2003 也很有用。
  • 感谢 Kev,同一个池中有 200 到 250 个(小)网站。现在出现了第一个问题。 4GB RAM,Windows 2003 32 标准。据我所知,服务器拥有他需要的所有内存。

标签: asp.net web-applications iis-6 shared-hosting


【解决方案1】:

非常好的问题,一个糟糕的 asp.net 可以将所有共享网络应用程序挂在同一个池中......

好的,让我们看看...如果问题出在内存上,请从 Sysinternals 获取 VMMap,以及 Process Explorer

同时运行它们,然后从进程资源管理器中找到您要调查的池的 PID 编号,它位于 inetinfo.exe 下,并且可能名称为 aspnet_wp.exe强>。

现在在 VMMap 上添加用于监视此池的 PID 帮助,瞧,您会看到可能很多的内存和打开的图像(aspx 文件)并导致问题...您要去的文件to see 位于 asp.net Framework 的临时位置,但您可以连接它们并查看它们来自的女巫网站。

好吧,如果问题不在内存上,但程序员创建了错误的循环,甚至创建了线程休眠,那么我认为进程资源管理器是一种调查池并搜索消耗能量的方法。

附加

也许每 15 分钟循环一次池可以解决这个问题?

更多关于

在这些视频中,有很多关于 VMMap 和内存管理器的信息。 Mysteries of Windows Memory Management, Part 1, Part 2

【讨论】:

  • 感谢 Aristos,目前结果并不乐观,但工具非常有趣。我曾在其他时候使用过 Process Monitor,但在这些情况下这是一个好主意。至少我注意到在共享池中实例化 'php-cgi.exe' 使用了多少资源。
  • 与VMMap相关,最大的两个内存用于'Private data'。我没有看到可疑的 DLL。出于好奇,我知道这可能是不可能的,当我用 ProcessMonitor 观看时,似乎挂起消失了 :) 我不知道我们必须在这里提取的教训是否是我们已经放置了这么多网络在同一个池中,这已被高度弃用。欢迎任何想法!再次感谢 Aristos ;)
  • @Jacob84 有些人还在开发他的网站并犯了一些错误/糟糕的编程,他发现它是因为页面堆栈,并修复它,所以现在一切正常。
  • @Jacob84 你有多少页面取决于服务器上的内存/速度/流量和页面的类型。例如一些非常好的站点几乎需要独占运行,其他只有2-10页且没有数据库的点网站点就像不存在一样。为什么不将站点分成 2-3 个池(如果你有记忆的话)。您从 iis 执行此操作,而 Plesk 与它无关。在我的 3Gb 机器上,我有 4 个池,2 个用于一个应用程序,另外 2 个将其余站点分成两半(我们也有 Plesk)
  • @Jacob84 您需要搜索的是dot net dll,它实际上是编译页面,占用大量内存或有其他问题。
【解决方案2】:

有很多工具,但听起来您的主要目标是确定导致问题的原因。这可以通过二分搜索非常简单地完成。

将池子分成两半,看看哪一个会崩溃。重复,直到您的池中只有一个应用程序崩溃。

这已经是O(log2n)了,但是你可以通过分成两个以上的子池来任意加快这个过程。

【讨论】:

  • 好主意,但最好将它与至少一些可疑站点结合起来。为了找到可疑站点,他需要一些方法来查看系统上发生了什么。
  • 感谢 Steven 和 Aristos。不幸的是,我们谈论的是在同一个池中运行的 200 到 250 个网站。也许我们将不得不重新考虑这一点。这必须与 Paralells Plesk 控制面板及其权限管理相结合。所以,我们没有嫌疑人,我们不能(至少很容易)拆分池。非常感谢!
  • @Aristos:如果有一些可能的嫌疑人,可以将他们移到一个池中,看看它是否崩溃。如果是,那太好了,您节省了时间。如果否,则返回二进制搜索。 @Jacob84:很抱歉听到这个消息。我会继续考虑这个。
猜你喜欢
  • 2014-08-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-24
  • 2010-10-14
  • 1970-01-01
  • 2021-07-26
  • 1970-01-01
相关资源
最近更新 更多