我有这个网站用C#写的。 大约有400-500个用户在线。 它是在Windows 2008的32位机之前,并永远不会locking/减速,由于增加内存消耗,直到我升级它的服务器赢得2008 R2 R2 64位。
老服务器只有4吉格RAM和四核CPU在2ghz。 网站工作得很好。 因为我已经升级了我注意到的服务器(在10天内2次),它开始吃ram。 昨晚它升到了4GB的RAM。 随着公羊增加反应减慢相当多。 回收应用程序池并没有帮助。 我必须重新启动它的工作进程才能恢复。
我注意到这通常发生,如果有连续的错误。 因为我没有改变代码中的任何东西,我安全地认为它是不相关的代码中的内存泄漏?
有没有人遇到类似的东西?
同样的事情发生,如果我用传统的ASP创build连续的错误。
谢谢
首先,作为一般性build议,除非您的应用程序确实需要64位寻址,否则请在32位应用程序池中运行。 这自然限制了每个进程的内存使用量为4GB。
为什么这可能很重要? 那么,因为4GB到64位应用程序是一个四舍五入的错误! 如果.Net框架感觉不到内存压力,它可能不会打扰执行垃圾回收。 这不是一个很好的答案,我不知道为什么这是R2下的情况,而不是R1,除了可能的内存大小的答案。
回收:回收应该在下一个请求中创build一个新的工作进程,默认情况下会给旧的进程提供高达90秒的时间来终止 – 回收会重新启动工作进程(或者至less告诉WAS下次启动一个新的WP请求到达,并礼貌地通知最后的WP,它正在被回收)。 除非重叠回收被禁用,否则只要接收到下一个请求,就会看到一个带有新PID的新w3wp。
如果您仍然看到32位应用程序池中的泄漏,则需要将其作为内存泄漏进行故障排除 – 考虑在处于高内存状态时进行内存转储,然后查看debugging情况用sos.dll或psscor2.dllfind内存的主要使用者。
我可能find了原因。 我不知道为什么iis7或6没有发生,但是会发生什么呢?
如果您将iis / asp.net错误页面设置为dynamic页面(例如500.aspx,404.aspx),并且错误是站点范围,则会发生这种情况,因此每个请求都会得到相同的错误。 这看起来像是由于会话阻塞,iis在处理dynamic错误页面之前等待之前完成并排队您的请求。 随着请求数量增加,内存增加。