SQL拒绝加载测试中的连接

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

System.Data.SqlClient.SqlException(0x80131904):建立与SQL Server的连接时发生与网络相关或特定于实例的错误。 服务器未找到或无法访问。 validation实例名称是否正确,以及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)进行数据库连接,如果有帮助的话。

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

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

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

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

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

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

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

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

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

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