很抱歉,这是一个非常长的问题,但需要具体说明。
我工作的公司有许多站点已经运行了一段时间没有问题。应用程序使用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 的某个设置导致了问题吗? - 其他我现在忘记的东西。
希望能得到任何想法、经验或其他有助于解决这个问题的信息!