网站这么长时间后就死了

本文关键字:长时间 网站 | 更新日期: 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调试演示-信息和设置说明

他们已经把我从泡菜里救出来好几次了,花点时间熟悉他们是非常值得的。