IIS 10 应用程序池回收触发多个 SQL 连接超时和 503 错误
IIS 10 application pool recycle triggers multiple SQL connection timeouts and 503-errors
将基于 .NET 的网站(基于 Dotnetnuke / DNN)移动到新服务器后,当应用程序池被回收时我开始看到多个错误,而网站在几分钟内变得不可用:
System.InvalidOperationException:超时已过。在从池中获取连接之前超时期限已过。这可能是因为所有池连接都在使用中并且达到了最大池大小
错误在:System.Data.ProviderBase.DbConnectionFactory.TryGetConnection
在高峰时段,该错误可能会在事件日志和网站中出现数百次 returns 向用户显示通用的“503 不可用”错误(而不是错误页面的自定义、用户友好版本).
Web 应用程序未更改并且在移动之前一直运行良好,所以我很确定这不是由于错误的编码导致数据库连接处于打开状态。在旧服务器(和本地开发环境)上,站点在回收时将变得无响应,即用户等待 20-30 秒,直到站点启动并 运行。没有抛出异常,绝对没有最终用户错误。
新旧服务器环境的主要区别在于:
新:
- 具有多个虚拟服务器的一台 Hyper-V 主机:
- Windows Server 2019 with IIS 10(虚拟服务器)
- SQL Server 2014(虚拟服务器)
旧:
- 单个 Windows Server 2008 R2 with IIS 7.5
- 直接在网络服务器上本地安装 SQL Server 2014
我怀疑这与处理连接到位于单独服务器上的远程 SQL 服务器的方式不同有关。或者它可能与 IIS 回收应用程序池的方式有关,导致在关闭现有版本的同时启动 Web 应用程序的新实例时出现问题。
有什么想法吗?
编辑:
我尝试通过向连接字符串添加 "Max Pool Size=500" 来增加最大池大小。没有效果。
在重新启动 Web 应用程序时使用 perfmon 监视活动连接数:在回收期间它增加到大约 80 个连接(从大约 25-30 个)。 IE。没有接近最大池大小的地方。
更新:我没有找到这个问题的根本原因,但是通过返回到单服务器设置而不是将 Web 和数据库分离到两个不同的服务器中解决了这个问题。
SQL 服务器直接安装在网络服务器上,数据库已移动。从那以后就没有出现过与连接相关的错误。
将基于 .NET 的网站(基于 Dotnetnuke / DNN)移动到新服务器后,当应用程序池被回收时我开始看到多个错误,而网站在几分钟内变得不可用:
System.InvalidOperationException:超时已过。在从池中获取连接之前超时期限已过。这可能是因为所有池连接都在使用中并且达到了最大池大小
错误在:System.Data.ProviderBase.DbConnectionFactory.TryGetConnection
在高峰时段,该错误可能会在事件日志和网站中出现数百次 returns 向用户显示通用的“503 不可用”错误(而不是错误页面的自定义、用户友好版本).
Web 应用程序未更改并且在移动之前一直运行良好,所以我很确定这不是由于错误的编码导致数据库连接处于打开状态。在旧服务器(和本地开发环境)上,站点在回收时将变得无响应,即用户等待 20-30 秒,直到站点启动并 运行。没有抛出异常,绝对没有最终用户错误。
新旧服务器环境的主要区别在于:
新:
- 具有多个虚拟服务器的一台 Hyper-V 主机:
- Windows Server 2019 with IIS 10(虚拟服务器)
- SQL Server 2014(虚拟服务器)
旧:
- 单个 Windows Server 2008 R2 with IIS 7.5
- 直接在网络服务器上本地安装 SQL Server 2014
我怀疑这与处理连接到位于单独服务器上的远程 SQL 服务器的方式不同有关。或者它可能与 IIS 回收应用程序池的方式有关,导致在关闭现有版本的同时启动 Web 应用程序的新实例时出现问题。
有什么想法吗?
编辑:
我尝试通过向连接字符串添加 "Max Pool Size=500" 来增加最大池大小。没有效果。 在重新启动 Web 应用程序时使用 perfmon 监视活动连接数:在回收期间它增加到大约 80 个连接(从大约 25-30 个)。 IE。没有接近最大池大小的地方。
更新:我没有找到这个问题的根本原因,但是通过返回到单服务器设置而不是将 Web 和数据库分离到两个不同的服务器中解决了这个问题。
SQL 服务器直接安装在网络服务器上,数据库已移动。从那以后就没有出现过与连接相关的错误。