c# – ASP.NET 2.0-4.0 Web应用程序经历了极慢的初始启动.

(抱歉,这是一个很长的问题,它说是具体的)

我工作的公司有一些网站,已经运行了一段时间没有问题.应用程序是ASP.NET 2.0,3.5和4.0的混合,都使用ADO.NET连接到所有由IIS7托管的SQL Server标准实例(位于同一个Web服务器上).

当我们搬到升级的网络服务器时,问题就开始了.我们竭尽全力设置完全相同设置的服务器,数据库实例和IIS(除了不同的机器名称,以及我们已经从SQLExpress升级到标准的事实),据我们所知,我们做了.这两个服务器都运行Windows Server 2008 R2(应用了所有当前更新),并收到默认安装.

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

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

我还试图使用SQL Server分析器来查看哪些数据库操作是导致速度减慢的原因,但是由于所有其他DB活动(以及我必须在我们的生产服务器上这样做,因为没有发生问题)在我们的测试环境中)我无法确定导致停止的确切操作.我会尽快来深夜,关闭生产站点来运行SQL分析器,但是我马上可能无法做到这一点.

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

>想想它可能是一个名称解析问题,我尝试修改网络服务器上的主机文件,以及给连接字符串一个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中有两种配置空闲超时的方法.两者都是通过点击“应用程序池”部分并右键单击相应的应用程序域.如果您点击“回收…”选项,则有一个设置.另一个在“高级设置…”下的“过程模型”部分,您会发现“空闲超时(分钟)”设置为零将禁用进程超时.这个以后的选择是适用于我们的选择.

如果我是你,我会首先解决这个问题,因为重新启动appdomain和/或worker进程总是很痛苦的,即使你没有20秒的滞后.

翻译自:https://stackoverflow.com/questions/8807331/asp-net-2-0-4-0-web-applications-experiencing-extremely-slow-initial-start-up

转载注明原文:c# – ASP.NET 2.0-4.0 Web应用程序经历了极慢的初始启动.