诊断 IIS 7.0 中长时间运行请求的原因

诊断 IIS 7.0 中长时间运行请求的原因

我们在 IIS 7.0、Windows Server 2008 R2 上运行 ASP.NET Web 应用程序,并使用 SQL Server 2008 R2 作为数据库。

在周末,当流量很高时,IIS 服务器中的请求队列长度大约每分钟就会增加一次(最多 800 个请求),然后下降。

我可以看到服务器正在处理一些请求,根据 IIS 管理器中的“当前请求”视图,这些请求正在长时间运行(其“已用时间”值范围为 20 到 50 秒)。

这些请求不一定是繁重的查询,实际上,我不明白为什么它们要花费这么长时间。

可能是因为客户端正在关闭其那边的连接吗?

谢谢,Shlomi

答案1

这似乎是连接池和打开过多连接的常见问题。在您的 DAL 上,您应该有类似以下内容(无论是 mssql 还是 mysql):

(我假设您正在使用 DataReader)

    /// <summary>
    /// Selects a single record from the Media table.
    /// </summary>
    public virtual Media Select(int mediaID)
    {
        SqlParameter[] parameters = new SqlParameter[]
        {
            new SqlParameter("@MediaID", mediaID)
        };

        using (SqlDataReader dataReader = SqlClientUtility.ExecuteReader(connectionStringName, CommandType.StoredProcedure, "MediaSelect", parameters))
        {
            if (dataReader.Read())
            {
                return MakeMedia(dataReader);
            }
            else
            {
                return null;
            }
        }
    }

使用保证 SqlDataReader 将被正确处置。这只是一个基本示例,但通常你应该(可能)有一个用于所有 DAL 操作的通用类,该类提供连接助手并实现 IDisposable。我建议有一个所有 DAL 类都从其派生的基类。

如果 DAL 不是问题,我建议使用以下方法深入挖掘数据库SQL Server 事件探查器评估查询执行情况。

您还可以使用 SQL Server Monitor 检查平均执行时间和未关闭的连接。如果您的 DAL 有问题,您会看到很多待处理/等待的连接。

相关内容