ASP.NET 2.0-4.0 Web应用程序初始启动速度极慢。

(对不起,如果这是一个很长的问题,它说是具体的)

我工作的公司有很多站点,这些站点已经运行了一段时间没有问题。 这些应用程序混合使用ASP.NET 2.0,3.5和4.0,它们都使用ADO.NET连接到一个SQL Server Standard实例(在同一个Web服务器上),所有这些实例都是用IIS7托管的。

当我们转移到升级的网络服务器时,问题就出现了。 我们尽一切努力使用完全相同的设置来设置服务器,数据库实例和IIS(除了不同的机器名称,以及我们从SQLExpress升级到标准的事实),据我们所知,我们做了。 两台服务器都运行Windows Server 2008 R2(已应用所有当前更新),并收到默认安装。

启动其中一个应用程序时,问题非常明显。 当您到达我们应用程序的登录页面时,页面本身加载速度非常快。 即使从禁用IIS缓存的新计算机加载页面也是如此,即使缓存页面也不可能。 当您输入登录信息并单击登录按钮时,问题实际上是可见的。 由于我们的数据库设计(不是很好),登录过程必须访问许多数据库,理论上最多150个独立的数据库,但实际上通常是2.即使只打开2个数据库(最小),问题也会发生。 不是一个伟大的设计,但我们现在必须忍受它。

当尝试最初打开与数据库的连接时,无论您是连接到2 dbs还是40,整个过程每次都会停止大约20秒。我已经针对该进程运行了一个.NET分析器(jetbrains dottrace),并且我可以从中获取的唯一信息是,对sqlconnection.open()的一个或所有调用占90%的时间。 这只发生在第一次使用应用程序时,但问题更加复杂,因为IIS似乎忽略了我们为它设置的回收设置,并在闲置几分钟后回收应用程序,导致问题再次发生。

我还尝试使用SQL Server探查器来查看哪些数据库操作是导致速度减慢的原因,但是由于所有其他数据库活动,(以及我必须在生产服务器上执行此操作的事实,因为问题不会发生在我们的测试环境中)我无法确定导致停止的确切操作。 我将尝试深夜进入并关闭生产站点以运行SQL分析器,但我可能无法立即执行此操作。

在研究这个问题的过程中,我尝试了几种解决方案

  • 认为它可能是名称解析问题,我尝试修改Web服务器上的hosts文件以及给连接字符串提供IP地址而不是要解析的服务器名称,没有区别。 我听说LLMNR协议导致这样的问题,但我认为尝试通过IP连接或解析主机文件应该已经消除了这种可能性,我承认我从未尝试过实际关闭LLMNR。

  • 我在IIS中增加了空闲超时,回收间隔等,但这似乎没有得到尊重,更不用说解决问题了。 这使我相信有一个设置覆盖了计算机上的IIS应用程序设置。

  • 多个其他代码修复,没有任何区别。 SqlServer设置是否导致问题?

  • 其他我现在忘了的东西。

在帮助我解决这个问题时,我们将非常感谢任何想法,经验或行动者!

如果您仍然在本地计算机上运行SQL实例,我建议使用非TCP连接。 SQL Server支持多种协议,tcp,命名管道和共享内存是比较常见的。

命名管道

Data Source=np:computer\instance 

共享内存

 Data Source=lpc:computer\instance 

我个人更喜欢共享内存。 请记住,您需要启用这些协议,并避免配置错误,我建议您禁用所有未使用的协议。

请参阅http://msdn.microsoft.com/en-us/library/ms187892.aspx

IIS重置

在IIS7中,有两种方法可以配置idle-timeout。 两者都从单击“应用程序池”部分开始,然后右键单击相应的应用程序域。 如果单击“回收…”选项,则有一个设置。 另一个是在“过程模型”部分的“高级设置…”中,您会发现“空闲超时(分钟)”设置为零会禁用过程超时。 后面的选项是适用于我们的选项。

如果我是你,我会首先解决这个问题,因为重启appdomain和/或工作进程总是很痛苦,即使你没有20秒的延迟。

一些想法:

  • 从Web服务器,您可以ping数据库服务器并获得“正常”响应,或者您是否看到类似的延迟?
  • 如果您看到延迟,请运行tracert以查看是否可以确定缓慢发生的位置
  • 尝试使用QueryExpress(http://www.albahari.com/queryexpress.aspx)之类的工具,它不需要安装即可运行。 您可以下载此EXE并从Web服务器运行它。 查看是否可以使用此连接到数据库并以正常方式运行查询。
  • 尝试使用SysInternals的TcpView(http://technet.microsoft.com/en-us/sysinternals/bb897437)来查看您的打开连接,看看您的服务器上发生了什么活动以及发送了多少数据并从您的数据库服务器收到。

根据您的问题描述,我可以根据一些初步想法开始查看。 我希望这有帮助。 祝你好运!

IIS不遵守回收设置:重新启动IIS /重新启动会改变行为吗?