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,甚至没有真正尝试连接到数据库。
解决方案:我们使用此答案中显示的模式限制了正在分离的线程数。
- cecil:Instruction.Operand类型对应于Instruction.OpCode.Code值
- 如何更正“qual.employee_id = recruitment.employee_id”中的错误“无法将类型’int’隐式转换为’string’”; “?
- 如何编组指向结构指针数组的指针?
- C#中的SqlServer校验和
- 没有多重inheritance且没有代码重复的多重inheritance
- IL中的属性getter / setter的方法命名是否标准化?
- Graphics.DrawString以printdocument宽度为中心
- 启动后获取Process的友好名称
- 使用ITextSharp从内存流中附加PDF文件时遇到问题