SQL 负载测试中拒绝连接
SQL refusing connection in load test
我正在 运行 对我的系统进行负载测试。在一定程度的负载下,我的日志中开始出现 SQL 个错误:
System.Data.SqlClient.SqlException (0x80131904): A network-related or instance-specific error occurred while establishing a connection to SQL Server. The server was not found or was not accessible. Verify that the instance name is correct and that SQL Server is configured to allow remote connections. (provider: Named Pipes Prprovidererror: 40 - Could not operrorconnection to SQL Server) ---> System.ComponentModel.Win32Exception (0x80004005): The network path was not found
通过 运行 有问题的 SQL 服务器上的性能监视器,我发现了以下内容:
- CPU等级很少超过50%。 (在之前的迭代中,我看到它在 100% 时达到最大值,所以我增加了 VM 的规格,这有助于将问题推向更高的负载级别。)
- 用户连接数略微超过 8,000。 Sql 服务器的默认设置为最大连接数 32,767。
- 连接字符串指定每个数据库的最大连接池大小为 1000 个,服务器上有 100 个数据库。负载测试随机分布在 100 个数据库之间,因此分布应该相当均匀,这意味着每个数据库大约有 80 个连接。远未达到 1k 的限制。
还有哪些其他因素可能会导致 Sql 服务器无法接受连接?
更新: 额外信息:我正在为我的数据库连接使用 Entity Framework Core (EF7),如果有帮助的话。
有点奇怪您获得了那么多数据库连接。您应该使用连接池;即使在高负载下,连接池也应该大大减少正在使用的活动连接数。
你能提供访问数据库的代码吗?您是调用 dispose() 方法还是关闭连接?
此外,您是否查看过数据缓存是否会减轻数据库负载? 2-5秒的数据缓存可以大大减少数据库调用。
"Network Path Not Found" 似乎不是与 SQL 服务器容量相关的错误。作为前 "IT Guy," 我怀疑防火墙正在丢弃您的数据包。如果这是在压力测试期间,防火墙可能会将大量请求解释为拒绝服务攻击,并使用某种预定义规则在指定时间段内断开连接。
您的网络环境如何?如果您有硬件防火墙或具有 IPS 功能的路由器,我会检查这些日志以查看您是否找到确凿证据。您可能必须创建一个特殊规则以允许无限流量到您的 SQL 服务器。
您 运行 进入 SQL-Server 侦听端口的 TCP listen()
积压限制。发生这种情况时,Windows 平台(但不是 *nix 平台)将为进一步的传入连接发出 'connection refused'。
我不是 SQL-Server 人,但肯定会有一个参数可以增加它的收听积压。
或者,您应该在客户端研究更好或更多的连接池。
事实证明问题根本不在 SQL 上。问题出在我们的 API 服务器上,其中一些 API 正在分离数百个并行线程,每个线程都建立自己的数据库连接。 API 服务器的负载实在是太大了,它甚至没有真正尝试连接到数据库就开始返回 "Access Denied" 异常。
解决方案:我们使用 this answer.
中所示的模式限制了被分离的线程数
我正在 运行 对我的系统进行负载测试。在一定程度的负载下,我的日志中开始出现 SQL 个错误:
System.Data.SqlClient.SqlException (0x80131904): A network-related or instance-specific error occurred while establishing a connection to SQL Server. The server was not found or was not accessible. Verify that the instance name is correct and that SQL Server is configured to allow remote connections. (provider: Named Pipes Prprovidererror: 40 - Could not operrorconnection to SQL Server) ---> System.ComponentModel.Win32Exception (0x80004005): The network path was not found
通过 运行 有问题的 SQL 服务器上的性能监视器,我发现了以下内容:
- CPU等级很少超过50%。 (在之前的迭代中,我看到它在 100% 时达到最大值,所以我增加了 VM 的规格,这有助于将问题推向更高的负载级别。)
- 用户连接数略微超过 8,000。 Sql 服务器的默认设置为最大连接数 32,767。
- 连接字符串指定每个数据库的最大连接池大小为 1000 个,服务器上有 100 个数据库。负载测试随机分布在 100 个数据库之间,因此分布应该相当均匀,这意味着每个数据库大约有 80 个连接。远未达到 1k 的限制。
还有哪些其他因素可能会导致 Sql 服务器无法接受连接?
更新: 额外信息:我正在为我的数据库连接使用 Entity Framework Core (EF7),如果有帮助的话。
有点奇怪您获得了那么多数据库连接。您应该使用连接池;即使在高负载下,连接池也应该大大减少正在使用的活动连接数。
你能提供访问数据库的代码吗?您是调用 dispose() 方法还是关闭连接?
此外,您是否查看过数据缓存是否会减轻数据库负载? 2-5秒的数据缓存可以大大减少数据库调用。
"Network Path Not Found" 似乎不是与 SQL 服务器容量相关的错误。作为前 "IT Guy," 我怀疑防火墙正在丢弃您的数据包。如果这是在压力测试期间,防火墙可能会将大量请求解释为拒绝服务攻击,并使用某种预定义规则在指定时间段内断开连接。
您的网络环境如何?如果您有硬件防火墙或具有 IPS 功能的路由器,我会检查这些日志以查看您是否找到确凿证据。您可能必须创建一个特殊规则以允许无限流量到您的 SQL 服务器。
您 运行 进入 SQL-Server 侦听端口的 TCP listen()
积压限制。发生这种情况时,Windows 平台(但不是 *nix 平台)将为进一步的传入连接发出 'connection refused'。
我不是 SQL-Server 人,但肯定会有一个参数可以增加它的收听积压。
或者,您应该在客户端研究更好或更多的连接池。
事实证明问题根本不在 SQL 上。问题出在我们的 API 服务器上,其中一些 API 正在分离数百个并行线程,每个线程都建立自己的数据库连接。 API 服务器的负载实在是太大了,它甚至没有真正尝试连接到数据库就开始返回 "Access Denied" 异常。
解决方案:我们使用 this answer.
中所示的模式限制了被分离的线程数