我用 c# 编写了此网站。大约有 400-500 名用户同时在线。它之前在 Windows 2008 32 位机器上运行,从未因内存消耗增加而锁定/减速,直到我将其服务器升级到 Win 2008 r2 64 位。
旧服务器只有 4 GB 内存和 2GHz 四核 CPU。网站运行良好。自从我升级服务器后,我注意到(10 天内升级了 2 次)它开始占用内存。昨晚它升级到了 4 GB 内存。随着内存的增加,响应速度会大大减慢。回收应用程序池没有帮助。我必须重新启动它的工作进程才能恢复。
我注意到如果出现连续错误,通常会发生这种情况。因为我没有更改代码中的任何内容,所以我可以安全地假设它与代码中的内存泄漏无关吗?
有人遇到过这样的事情吗?
如果我使用经典 asp 创建连续错误,也会发生同样的事情。
谢谢
答案1
首先,一般建议,除非您的应用确实需要 64 位寻址,否则请在 32 位应用池中运行它。这自然会将每个进程的内存使用限制为 4GB。
为什么这很重要?因为 4GB 对于 64 位应用程序来说是一个舍入误差!如果 .Net 框架没有感觉到内存压力,它可能不会执行垃圾收集。这不是一个很好的答案,我不知道为什么在 R2 下会出现这种情况而不是 R1 下会出现这种情况,除了可能的内存大小答案。
回收时:回收应在下一次请求时创建一个新的工作进程,并且默认情况下给旧进程最多 90 秒的时间终止 - 回收做重新启动工作进程(或者至少告诉 WAS 在下次请求到达时启动一个新的 WP,并礼貌地通知最后一个 WP 它正在被回收)。除非禁用重叠回收,否则在收到该站点的下一个请求后,您应该会看到一个具有新 PID 的新 w3wp。
如果您仍然看到 32 位应用程序池中的泄漏,则需要将其作为内存泄漏进行故障排除 - 考虑在进程处于高内存状态时对其进行内存转储,然后使用 sos.dll 或 psscor2.dll 对其进行调试以找到内存的主要消耗者。
答案2
我可能已经找到原因了。我不知道为什么在 iis7 或 6 上没有发生这种情况,但确实发生了这种情况。
如果您将 iis/asp.net 错误页面设置为动态页面(例如 500.aspx、404.aspx),并且错误是整个站点的,那么每个请求都会得到相同的错误,就会发生这种情况。看起来是因为会话阻塞,iis 等待之前完成,然后才处理动态错误页面并将您的请求排队。随着请求数量的增加,内存也会增加。