接続を受け入れるときに断続的にタイムアウトする特定のSQL Serverがあります。この問題は1日を通して一貫していますが、発生率は非常に低いです。トラブルシューティングを続行するにはどうすればよいですか?
接続タイムアウトの期限が切れました。ログイン前のハンドシェイクの確認応答を消費しようとしたときにタイムアウト期間が経過しました。これは、ログイン前のハンドシェイクが失敗したか、サーバーが時間内に応答できなかったことが原因である可能性があります。このサーバーへの接続試行中に費やされた時間は-[Pre-Login] initialization = 0でした。 handshake = 15002; (Microsoft SQL Server、エラー:-2)
サーバー構成:
テストスクリプト(毎秒1回実行):
$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 }});
観察:
更新:最終的に、失敗した接続のクライアント側のWiresharkトレースを取得しました。パケット損失は明らかではありません。クライアントはTCP ACKをリアルタイム(<10ms)で受信します。クライアントは障害時にDNS名を使用していましたが、接続文字列のIPv4アドレスを使用して障害が発生しました。
送信されたログイン前リクエストパケットに対して即時にTCP ACKが返されるという事実は、問題をOSまたはSQL Serverに限定するものだと思いますか?
これは最終的にVMWare LROの副作用として識別されました。ホストベースのLROを無効にすると、問題が解決しました。見る