网站这么长时间后就死了
本文关键字:长时间 网站 | 更新日期: 2023-09-27 18:09:48
我有一个网站做一些我以前从未见过的事情。我的服务器是win2003 w/IIS6,我使用c#和。net 4.0。
该网站是一个房地产网站,数据直接存储在我的数据库。网站会运行一段时间,然后就死了。我的意思是,你将尝试查看一个属性的详细信息,它将花费网站2-3分钟加载,如果它加载。如果我只是简单地挽救网络。配置文件并重新加载它来重新启动应用程序,它会正常运行一段时间,然后又会死机。这种情况一遍又一遍地发生。我去了本地副本,而活的站点已经"死亡",本地副本运行得很好,然后它也会在很长一段时间后死亡。时间范围从5分钟到30分钟不等,我认为这与请求的数量有关。
有人知道发生了什么事吗?页面上唯一的数据查询是提取主数据,即下面的LINQ查询:
public Listing GetListingByMLNumber(string MLNumber)
{
try
{
DatabaseDataContext db = new DatabaseDataContext();
var item = (from a in db.Listings
where a.ML_.ToLower() == MLNumber.ToLower()
select a).FirstOrDefault();
return item;
}
catch (Exception ex)
{
Message = ex.Message;
return null;
}
}
未关闭数据库上下文是您提供的代码中明显的错误。将它包装在using
语句中,以确保它被正确处理。
只要上下文存在,您将保留sql连接,这是一种有限的资源。对返回的实体进行更改跟踪也会浪费内存。给定您的代码,上下文应该在某些时候被垃圾收集,但它仍然可能是问题所在(并且,无论这是否是问题,您都应该处理数据库上下文)。
尝试在本地进行负载测试,看看是否可以重现该问题。如果可以,那么使用调试器找出问题所在。如果没有,您可能需要添加日志记录来缩小问题范围。
您还可以查看IIS进程,看看它是否使用了大量的内存、句柄等。还要检查IIS设置的性能和应用程序池回收,这是另一个答案中的建议。
我会查看应用程序池设置,看看工作进程是如何被回收的,我还会查看IIS中的性能选项卡,看看是否指定了带宽阈值。
如果你再次遇到这种类型的问题,那么你应该将DebugDiag/ADPlus和WinDBG添加到你的诊断工具带中。
当您的应用程序再次挂起或花费很长时间来响应请求时,请使用DebugDiag或ADPlus获取工作进程的转储。把这个加载到WinDBG中,加载SOS (Son of Strike),这是一个WinDBG扩展,用于托管代码调试,然后开始挖掘。
Tess Ferrandez有一套关于如何有效使用这些工具的教程和实验:
。. NET调试演示-信息和设置说明
他们已经把我从泡菜里救出来好几次了,花点时间熟悉他们是非常值得的。