【问题标题】:ASP.NET 2.0-4.0 Web Applications experiencing extremely slow initial start-up.ASP.NET 2.0-4.0 Web 应用程序的初始启动速度极慢。
【发布时间】:2012-01-10 17:06:38
【问题描述】:

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

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

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

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

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

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

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

  • 认为这可能是名称解析问题,我尝试修改网络服务器上的两个主机文件,并为连接字符串提供 IP 地址而不是要解析的服务器名称,没有区别。我听说 LLMNR 协议会导致这样的问题,但我认为尝试通过 IP 连接或使用主机文件解析应该可以消除这种可能性,但我承认我从未尝试过真正关闭 LLMNR。

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

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

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

任何想法、经验或任何东西都将非常感谢帮助我解决这个问题!

【问题讨论】:

  • 您是否尝试连接到旧的 SQLExpress DB 只是为了查看速度是否存在差异?仅连接到 1 db 作为测试(简单的 SQL 内容)怎么样?
  • 不幸的是,我们没有连接到旧实例的选项。一旦我们让新服务器启动并正常工作,旧服务器就会被格式化并重新用于其他用途。即使该实例仍然存在,我们系统的物理部署也不允许我连接到旧服务器,而不需要在两端的防火墙中进行处理等等。

标签: c# .net sql-server iis


【解决方案1】:

如果您仍在本地计算机上运行 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 秒的延迟,重启 appdomain 和/或工作进程总是很痛苦。

【讨论】:

    【解决方案2】:

    一些想法:

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

    根据您的问题描述,我只是对从哪里开始寻找的一些初步想法。我希望这有帮助。祝你好运!

    【讨论】:

    • 实际上,Web 服务器和 DB 服务器是一体的。 Atm 我们正在运行 IIS 并连接到同一台机器上的 SQLServer 实例,因此在提供页面之前不应该涉及网络流量。 (无论如何,该机架的内部流量都有一个本地隔离的网络)无论如何我都尝试了您的其他建议,在 IIS 外部运行的程序可以连接没有问题,并且在初始运行时没有任何异常的 tcp 连接,相比之下到正常运行的“热身”运行。
    【解决方案3】:

    在 IIS 不遵守回收设置的情况下:重新启动 IIS/重新启动是否会改变行为?

    【讨论】:

    • 多次,甚至重启和冷启动服务器本身,没有变化。
    • 您提到 SQL Server 和 IIS 在同一个盒子上。 WMI/资源监控是否显示任何异常?机器配置文件/网站配置文件有什么异常吗(IIS7 和 ASP.NET 比 IIS6 耦合度更高)?
    猜你喜欢
    • 1970-01-01
    • 2013-06-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-16
    • 2023-04-02
    • 1970-01-01
    相关资源
    最近更新 更多