我正在尝试缩小范围并调试相当难以捉摸的错误:
State: 08001
Code: 258
Msg: [Microsoft][SQL Server Native Client 10.0]TCP Provider: Timeout error [258].
State: HYT00
Code: 0
Msg: [Microsoft][SQL Server Native Client 10.0]Login timeout expired
State: 08001
Code: 258
Msg: [Microsoft][SQL Server Native Client 10.0]Unable to complete login process due to delay in prelogin response
到目前为止我已经尝试过:
- 确保最大 RAM 设置正确,并且比 RAM 的物理大小小 2GB
- 确保工作线程不受限制
- 确保远程连接限制比“高峰时段”测量的负载大几倍
- 确保远程连接登录超时设置为 20 秒
- 确保 PHP 服务器和 DB 服务器之间的连接稳定(每 1 分钟跟踪一次路由,最大连接时间为 23 毫秒)
- 确保 DNS 没有问题(PHP 使用 DB 的 IP 进行连接)
- 确保应用程序具有唯一的登录凭据,不与任何其他应用程序共享
- 确保 TCP/IP 端口没有耗尽
- 确保应用程序登录是 SQL 登录,以排除任何与 AD 相关的问题
- 确保连接池已打开
- 确保查询超时设置为非常高的秒数
到目前为止,上述操作均未对数据库/网络配置造成任何问题,也没有对应用程序代码造成任何明显问题。
大多数情况下,连接创建都会成功。
问:还有哪些方面会影响连接创建?并产生这种看似随机的故障?
答案1
检查问题是否存在于服务器的本地主机上,以排除网络硬件导致超时的可能性。假设在本地主机上测试时问题消失,那么它很可能与网络有关。
您提到每 1 分钟检查一次跟踪路由时有 23 毫秒的延迟。23 毫秒似乎不像是 LAN 连接,而且很可能有多个跳数,您还可能会看到偶尔的数据包丢失。
您不应该每 1 分钟执行一次跟踪路由,而应该执行一次不带超时的 ping,ping -t servername
然后让它静置。然后过一会儿,您就可以检查统计数据,CTRL + BREAK并查找数据包丢失或延迟波动。
另一个选择(除非你已经这样做了)是使用 PDO 连接