SQL拒绝加载测试

时间:2017-01-05 14:41:10

标签: c# sql-server tcp load-testing sql-server-2016

我在我的系统上运行负载测试。在某个加载级别,我开始在日志中收到SQL错误:

  

System.Data.SqlClient.SqlException(0x80131904):建立与SQL Server的连接时发生与网络相关或特定于实例的错误。服务器未找到或无法访问。验证实例名称是否正确,以及SQL Server是否配置为允许远程连接。 (提供者:命名管道Prprovidererror:40 - 无法连接到SQL Server)---> System.ComponentModel.Win32Exception(0x80004005):找不到网络路径

通过在有问题的SQL服务器上运行性能监视器,我发现了以下内容:

  • CPU级别很少超过50%。 (在上一次迭代中,我发现它最大值为100%,因此我增加了VM的规格,这有助于将问题推向更高的负载水平。)
  • 用户连接数超过8,000。 Sql Server的默认设置为32,767个最大连接数。
  • 连接字符串指定每个数据库的最大池大小为1000个连接,并且服务器上有100个数据库。负载测试在100个数据库之间随机分布,因此应该有相当均匀的分布,这意味着每个数据库大约有80个连接。没有接近1k的限制。

还有哪些因素可能会导致Sql Server无法接受连接?

更新:额外信息:我正在使用Entity Framework Core(EF7)进行数据库连接,如果这有帮助的话。

4 个答案:

答案 0 :(得分:7)

“找不到网络路径”似乎不是与SQL Server容量相关的错误。作为一名前“IT专家”,我怀疑防火墙正在丢弃你的数据包。如果这是在压力测试期间,防火墙可能会将大量请求解释为拒绝服务攻击,并使用某种预定义规则来删除指定时间段内的连接。

您的网络环境是什么?如果你有一个具有IPS功能的硬件防火墙或路由器,我会检查这些日志,看看你是否找到了一支冒烟的枪。您可能必须创建一个特殊规则以允许无限制地流量到SQL Server。

答案 1 :(得分:1)

有点好奇的是,您正在获得与数据库的许多连接。你应该利用连接池;即使在高负载下,连接池也应该大大减少使用的活动连接数。

您能提供访问数据库的代码吗?您是在调用dispose()方法还是关闭连接?

另外,您是否看过数据数据缓存是否会减轻数据库负载? 2-5秒的datacache可以大大减少数据库调用。

答案 2 :(得分:1)

您正在遇到SQL-Server侦听端口的TCP listen()积压限制。发生这种情况时,Windows平台(但不是* nix平台)将为进一步的传入连接发出“连接被拒绝”。

我不是一个SQL-Server人,但是必须有一个参数可以增加其监听积压。

或者,您应该在客户端查看更好或更多的连接池。

答案 3 :(得分:0)

事实证明问题根本不在SQL上。问题出在我们的API服务器上,其中一些API分离出数百个并行线程,每个线程都与数据库建立了自己的连接。 API服务器的负载太大了,它开始返回" Access Denied"甚至没有真正尝试连接到数据库的异常。

解决方案:我们使用this answer中显示的模式限制了正在分离的线程数。