我在我的系统上运行负载测试。在某个加载级别,我开始在日志中收到SQL错误:
System.Data.SqlClient.SqlException(0x80131904):建立与SQL Server的连接时发生与网络相关或特定于实例的错误。服务器未找到或无法访问。验证实例名称是否正确,以及SQL Server是否配置为允许远程连接。 (提供者:命名管道Prprovidererror:40 - 无法连接到SQL Server)---> System.ComponentModel.Win32Exception(0x80004005):找不到网络路径
通过在有问题的SQL服务器上运行性能监视器,我发现了以下内容:
还有哪些因素可能会导致Sql Server无法接受连接?
更新:额外信息:我正在使用Entity Framework Core(EF7)进行数据库连接,如果这有帮助的话。
答案 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中显示的模式限制了正在分离的线程数。