【问题标题】:.NET Website Crashing.NET 网站崩溃
【发布时间】:2014-02-17 17:19:12
【问题描述】:

我在一个非常大的高流量电子商务网站上工作。我们目前正在将我们的站点从 ColdFusion 迁移到 .NET。我们最近在此转换过程中遇到了一个问题,我希望能得到一些帮助。我们目前的网站大约是 1/3 .net 和 2/3 ColdFusion。

不过,一个问题是,当我们发布最新项目时,这是一个转换“我的帐户”部分的项目,一段时间内一切正常,但在 3 到 24 小时之间,网站就会崩溃。为了恢复它,我们需要重新启动 IIS,有时还需要重新启动 ColdFusion。当我说崩溃时,我的意思是它只是挂起、坐在那里并永远旋转。

我们有非常好的服务器监控,但是当我们查看服务内存时,除了与 SQL 的连接数外,没有什么异常。出于某种原因,在崩溃 SQL 连接数激增之前相当快,它从大约 24 个连接增加到大约 100 个,只是坐在那里,站点停止运行,直到我们重新启动服务。

我们目前使用 SQL Server 2005,实体框架作为我们的数据访问方法,并且我们使用的是 IIS 7.5。我们的网络服务器是虚拟的,但我们的数据库是物理的。

我们的团队中有多个人检查了这个新项目中的所有代码,以确认他们没有任何连接处于打开状态,因为连接问题看起来是这样的。我们找不到任何打开的连接,没有一个。

这是我们当前对实体的数据访问的示例:

    /// <summary>
    /// Get Products by their Primary Category ID.  Default Category ID is 0: Top Level Categories.
    /// </summary>
    /// <param name="languageCode">Two character language code of Categories being searched.  Defined in dbo.Languages, LanguageCode field.</param>
    /// <param name="primaryCategoryId">int - Primary Category ID</param>
    /// <returns>List&lt;Product%gt;</returns>
    public List<Products.Product> GetProducts(string languageCode, int primaryCategoryId = 0)
    {
        CatalogEntity context = null;
        EntityConnection conn = null;

        try
        {
            conn = this.GetConnection();
            context = new CatalogEntity(conn);

            List<I_Products> Products = context.GetProductsByPrimaryCatId(primaryCategoryId, languageCode).Distinct().ToList();
            return Products.Select(Product => new Products.Product(Product)).Distinct().ToList();
        }
        catch (System.Exception ex)
        {
            string message = "Error occurred while calling GetProducts.";
            throw new Exception.CatalogDataException(message, CodeLibrary.Core.Helpers.ProcessHelper.GetProcessName(this), ex);
        }
        finally
        {
            if (conn != null && conn.State == ConnectionState.Open) conn.Close();
            if (context != null) context.Dispose();
            conn.Dispose();
        }
    }

同样,这只是我们在 C# 中的一种数据访问方法的一个示例。没看到这有什么问题吗?同样,我们全面使用这种格式。我们已经确认了这一点。

对于新的 .net 项目,我们使用 .net 会员提供程序。我们使用 CLR 使用哈希加密用户密码,以便我们可以在 CF 中使用相同的哈希方法。不确定这是否是问题,但认为值得一提。

有什么想法吗?

【问题讨论】:

  • SQL 连接数在崩溃前达到峰值的事实表明存在数据库问题。会不会是 SQL Server 中的死锁或超时?
  • 可能弄清楚这些新 SQL 连接中的每一个都在做什么(正在运行什么查询),这可能有助于了解为什么要创建它们。
  • 我们在其中一次崩溃之前和期间运行了 SQL 分析器,但没有发现任何异常情况。
  • 我们运行 SP_WHO2 来查看峰值发生后的活动连接,并且大多数新连接都处于休眠状态
  • 您有更多关于 GetProductsByPrimaryCatId 方法的信息吗?

标签: c# asp.net iis coldfusion


【解决方案1】:

这里有一个可能性列表。例如,当对 SQL Server 的调用未能将数据返回给 CF 时,CF 可能会挂在线程上。它变成了一种“幻线”。然后 CF 创建到数据库服务器的新连接并将它们添加到连接池 - 导致您看到许多额外的连接。它计入 CF 管理员中的“同时请求”设置。当有足够多的“挂起”您的请求队列并且您的服务器锁定时,即使它似乎没有发生任何事情。您可以通过启用指标、使用服务器监视器(如果在 Enterprise 版本上)或使用 fusionreactor(用于 CF/Java 服务器的优秀且廉价的 3rd 方内省监视器)来查看此行为。

当然, 正在发生。你必须找出为什么它会发生。其中的可能性是:

  • 网络 - 有时在交换机端口上的自动同步可能会中断连接并导致挂起“幻像”线程。请参阅Hanging jrun and networking 上的这篇文章。
  • 数据库锁定 - 这可能会产生类似的问题,即使您认为自己没有看到它也可能会发生。有时很难捕捉。一个可能很麻烦的特定锁定问题是“max degree of parallelism”,它可能导致看起来相当空闲的数据库连接仍然挂起。

您可能需要获得更多关于 CF 方面的信息才能准确了解这里发生了什么。


跟进......即使您的问题来自 .NET 方面,我也会从 CF 方面提供一些可能性。我假设 CF 可能正在发挥作用,因为重新启动 CF 有时会解决问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-18
    • 2011-08-24
    • 1970-01-01
    • 1970-01-01
    • 2017-05-07
    • 2018-06-22
    相关资源
    最近更新 更多