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

Cal*_*leb 18 .net c# sql-server iis

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

我工作的公司有很多站点,这些站点已经运行了一段时间没有问题.这些应用程序是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设置是否导致问题?

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

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

csh*_*net 18

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

命名管道

Data Source=np:computer\instance
Run Code Online (Sandbox Code Playgroud)

共享内存

Data Source=lpc:computer\instance
Run Code Online (Sandbox Code Playgroud)

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

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

IIS重置

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

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