短暂闲置后,.NET Webforms应用程序响应缓慢

时间:2019-04-04 15:58:54

标签: asp.net webforms teradata iis-8

我有一个ASP.NET Webforms应用程序,可从Teradata加载数据。我注意到,如果用户闲置一个页面(短至5分钟),则该页面的响应速度会很慢(最多15秒)。如果用户在浏览应用程序时没有空转,则性能会更快(最多1秒)。

该应用程序位于IIS 8上。有趣的是,当通过Visual Studio上的调试器在本地运行该应用程序的开发版本时,我从未遇到过此问题,并且该应用程序响应流畅。

我收到了以下建议,查询优化,将会话超时设置为60分钟(而不是默认的20分钟)以及数据库索引。

  1. 我已将会话超时设置为60分钟,但问题仍然存在。
  2. 用于填充下拉列表的某些查找表最多15行,而性能仍然很慢。即使我使用更好的查询或索引来优化数据库,我也认为性能不会提高。

以下是用于从数据库检索数据集的最常用功能。我正在使用Teradata.Client.Provider来访问Teradata。

public DataSet ExecuteDataSet(string sqlQuery, Dictionary<string, string> parameters)
        {
            ds = new DataSet();
            TdConnection conn = new TdConnection(getConnString());
            using (conn)
            {
                ///Build the TD DB Command
                tdSqlStringCommand = new TdCommand(sqlQuery, conn);
                using (tdSqlStringCommand)
                {
                    //Create an instance for TD data adapter
                    TdDataAdapter adapter = new TdDataAdapter();
                    adapter.SelectCommand = tdSqlStringCommand;

                    ///Append the Parameters
                    AddTdParameters(ref adapter, parameters);

                    ///Execute the dbCommand

                    adapter.Fill(ds);
                }
            }
            return ds;
        }

我希望问题出在IIS上,因为通过Visual Studio上的调试器运行开发版本不会给我带来性能问题。

1 个答案:

答案 0 :(得分:0)

根据您描述的行为,您可能希望查看IIS中的应用程序池空闲超时行为(应用程序池->高级设置->进程模型->空闲超时操作)。

当应用程序池达到其空闲超时时,会发生两件事。

  • 终结
  • 暂停

如果将应用程序池/工作进程设置为在达到空闲超时后立即终止,则在达到超时后的第一个请求必须等待工作进程启动,这将花费几秒钟的时间。正在运行.net代码。我个人使用的应用程序大约需要20秒钟才能从冷启动启动。

有人在某些时候可能终止了默认的应用程序池行为,以降低服务器利用率。这是在我的组织中发生的,这是有充分的理由的,但是对性能下降的认识导致很多挫败感,直到我们意识到发生了什么。

但是,Microsoft非常友好,可以添加更好的行为,Suspend。

Here is the MS article on Idle Worker Process Page-Out, it explains the suspend behavior.

基本上,而不是终止工作进程并使它从冷启动中运行,而是将其交换出磁盘。仍然会有性能损失,但它远没有冷启动那么糟糕。在我的组织中,我们看到它需要2到3秒钟,而不是冷启动需要20秒钟。

它确实提高了资源使用率。现在我们的应用程序池可以挂起,只占用1到5MB的RAM,直到我们需要它为止,而不必一直保持20个应用程序池一直运行并且每个进程消耗约1GB的RAM。

希望有帮助。