Mit*_*tch 6 sql-server vmware connectivity sql-server-2016
我们有一个特定的 SQL Server,它在接受连接时会间歇性地超时。该问题全天都是一致的,但发生率非常低。如何继续排除故障?
连接超时已过期。尝试使用登录前握手确认时超时时间已过。这可能是因为登录前握手失败或服务器无法及时响应。尝试连接到此服务器所花费的持续时间是 - [Pre-Login] 初始化 = 0; 握手=15002;(Microsoft SQL Server,错误:-2)
服务器配置:
测试脚本(每秒执行一次):
$failed = $false;
$loginDuration = (Measure-Command {
$ncon = New-Object System.Data.SqlClient.SqlConnection `
@( 'Data Source=1.2.3.4,16143;Database=Test;User=Test;Password=****;Pooling=false;' );
try
{
$ncon.Open();
$cmd = New-Object System.Data.SqlClient.SqlCommand `
@( 'SELECT @@VERSION', $ncon );
$cmd.ExecuteNonQuery();
$ncon.Dispose();
}
catch
{
$failed = $true;
}
}).TotalMilliseconds;
Write-Metric -metric 'itp.dbserver.logintime' -unit 'milliseconds' `
-value (&{if ($failed) { 120000 } else { $loginDuration }});
Run Code Online (Sandbox Code Playgroud)
观察:
更新:我终于得到了连接失败的客户端 Wireshark 跟踪。没有明显的数据包丢失,客户端实时接收 TCP ACK(<10 毫秒)。客户端在失败时正在使用 DNS 名称,但使用连接字符串中的 IPv4 地址确实发生了故障。
我是否正确地认为,我立即收到发送的登录前请求数据包的 TCP ACK 会将问题本地化到操作系统或 SQL Server?
这最终被确定为 VMWare LRO 的副作用。禁用基于主机的 LRO 解决了该问题。看