ASP.NET 2.0-4.0网站应用程序启动速度极慢。

20

很抱歉,这是一个非常长的问题,但需要具体说明。

我工作的公司有许多站点已经运行了一段时间没有问题。应用程序使用ASP.NET 2.0、3.5和4.0的混合方式,并且都使用ADO.NET连接到SQL Server标准实例(在同一台Web服务器上),所有站点都使用IIS7进行托管。

问题出现在我们迁移到升级后的Web服务器时。我们尽最大努力设置了相同的服务器、数据库实例和IIS设置(除了不同的机器名称和从SQLExpress升级到Standard之外),就我们所知道的这些设置是相同的。两个服务器都运行Windows Server 2008 R2(应用了所有当前更新),并接受默认安装。

当您启动这些应用程序中的任何一个时,问题就会显而易见。当你达到我们应用程序的登录页面时,页面本身加载非常快。即使您从新机器加载页面,该页面也未被缓存,同时禁用了IIS缓存。当您输入登录信息并单击登录按钮时,问题实际上就变得明显了。由于我们数据库的(不太好的)设计,登录过程必须访问许多数据库,理论上最多可达150个不同的数据库,但实际上通常只有2个。即使只打开2个数据库(最小值),问题也会发生。这不是一个好的设计,但我们现在必须接受它。

当尝试最初打开到数据库的连接时,每次整个过程都会停止约20秒钟,无论您是否连接到2个还是40个数据库。我已经使用.NET分析器(JetBrains DotTrace)对该过程进行了分析,我得出的唯一信息是sqlconnection.open()中的一个或所有调用占据了90%的时间。这仅会在第一次使用应用程序时发生,但问题的复杂性在于,IIS似乎忽略了我们为其设置的回收设置,并在空闲几分钟后重新启动应用程序,导致问题再次发生。

我也尝试使用 SQL Server 分析器查看造成减速的原因是哪些数据库操作,但由于其他所有的数据库活动,以及我必须在我们的生产服务器上进行此操作(因为问题不会出现在我们的测试环境中),我无法确定具体导致停机的操作。我将尝试在深夜进入并关闭生产站点以运行 SQL 分析器,但我可能无法立即执行此操作。
在研究这个问题的过程中,我尝试了一些解决方案。 - 考虑到可能是名称解析问题,我尝试修改 Web 服务器上的 hosts 文件以及将连接字符串更改为 IP 地址而不是服务器名称来解决,但没有任何区别。我听说 LLMNR 协议会导致这样的问题,但我认为通过 IP 连接或使用 hosts 文件进行解析应该已经消除了这种可能性,虽然我承认我从来没有尝试过真正关闭 LLMNR。 - 我增加了 IIS 中的空闲超时时间、循环间隔等设置,但这似乎甚至没有被遵守,更不用说解决问题了。这让我想到有一个设置正在覆盖机器上的 IIS 应用程序设置。 - 多种其他代码修复,但都没有任何效果。是 SqlServer 的某个设置导致了问题吗? - 其他我现在忘记的东西。
希望能得到任何想法、经验或其他有助于解决这个问题的信息!

你尝试连接旧的SQLExpress数据库了吗?只是为了看看速度上是否有差异?还有,连接一个数据库进行测试(简单的SQL操作)呢? - webdad3
很遗憾,我们无法连接到旧实例。一旦我们启动并运行了新服务器,旧服务器就被格式化并重新用于其他用途。即使该实例仍然存在,我们的系统的物理部署也不允许我在不在两端的防火墙等方面进行操作的情况下连接到旧服务器。 - hcp
3个回答

20

如果您仍在本地计算机上运行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中,有两种方法可以配置空闲超时时间。首先单击“应用程序池”部分,然后右键单击相应的应用程序域。如果单击“回收...”选项,则有一个设置。另一个设置位于“进程模型”下的“高级设置...”中,您将找到“空闲超时时间(分钟)”,将其设置为零可禁用进程超时。我们使用的是后一种选项。

如果我是您,我会首先解决这个问题,因为重新启动应用程序域和/或工作进程即使您没有20秒的延迟,也总是令人痛苦的。


1
一些想法:
  • 从 Web 服务器,您能否 ping db 服务器并获得“正常”响应,或者您是否看到类似的延迟?
  • 如果您看到延迟,请运行 tracert 查看是否可以确定延迟发生的位置。
  • 尝试使用 QueryExpress(http://www.albahari.com/queryexpress.aspx)等工具,它不需要安装即可运行。您可以从 Web 服务器下载此 EXE 并运行它。查看是否可以使用此工具连接到您的数据库并以正常方式运行查询。
  • 尝试使用 SysInternals 的 TcpView(http://technet.microsoft.com/en-us/sysinternals/bb897437)查看您的打开连接,并查看服务器上正在发生的活动以及从您的数据库服务器发送和接收的数据量。
这只是根据您的问题描述开始寻找的一些初始想法。希望这有所帮助。祝您好运!

实际上,Web服务器和DB服务器是同一个。目前我们正在运行IIS,并连接到同一台机器上的SQLServer实例,因此在页面提供服务之前不应涉及任何网络流量。(无论如何,该机架内部有一个本地隔离网络用于内部流量)我无论如何都尝试了您提供的其他建议,运行在IIS外部的程序可以轻松连接,而且与“预热”的运行相比,初始运行中没有任何异常的TCP连接,后者可以正常工作。 - hcp

0

IIS 不尊重回收设置:重新启动IIS/重新启动计算机是否更改了行为?


多次尝试,甚至重新启动和冷启动服务器本身,但没有改变。 - hcp
1
您提到SQL Server和IIS在同一台服务器上。WMI /资源监视显示了任何异常吗?机器配置文件/网站配置文件有任何异常吗(IIS7和ASP.NET比IIS6更紧密耦合)? - Leon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接