Temos um SQL Server específico que está expirando intermitentemente ao aceitar conexões. O problema é consistente ao longo do dia, mas ocorre em uma incidência muito baixa. Como posso continuar a solucionar problemas?
Tempo limite de conexão expirado. O período de tempo limite decorrido ao tentar consumir a confirmação de handshake de pré-login. Isso pode ocorrer porque o handshake de pré-login falhou ou o servidor não conseguiu responder no tempo. O tempo gasto na tentativa de conexão com este servidor foi - [Pré-Login] inicialização=0; aperto de mão=15002; (Microsoft SQL Server, Erro: -2)
Configuração do servidor:
- SQL Server 2016 SP1 CU5 Enterprise (o problema também ocorreu antes do SP1)
- Windows Server 2012 R2 no servidor e no cliente
- VMware ESXi, 6.5.0 no HP ProLiant DL360 Gen9
- VM tem 8 vCPU, 64 GiB de memória (totalmente reservada)
Script de teste (executado uma vez por segundo):
$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 }});
Observações:
- O problema começou a ocorrer após atualizações do sistema operacional, atualizações do SQL Server, movimentação de San e movimentação do Hyper-V para o VMWare
- A maioria das conexões é bem-sucedida (4 falhas em 1.440 tentativas)
- As falhas são sempre listadas com um número baixo em "[Pré-Login] inicialização=0;" e um número alto em "handshake=15002". Não recebemos erros como "Não encontrado" ou "Nenhum host é conhecido", apenas "Tempo limite de conexão"
- Nenhuma criptografia está habilitada para o ouvinte
- Pings não mostram perda durante um período prolongado (0 perdido de 96.045 enviados)
- Todos os firewalls estão desativados
- As conexões tentadas usando endereços IPv6 e IPv4 falham na mesma taxa
- CPU é baixa (<40%)
- As sessões ativas são persistentemente em torno de 400
- O driver do balão está desativado
- As conexões, uma vez feitas, são estáveis, sem erros inesperados ao executar consultas, sem desconexões estranhas.
- Vários clientes estão tendo problemas para se conectar - ODBC e ADO de vários computadores
Atualização: finalmente obtive um rastreamento do Wireshark do lado do cliente de uma conexão com falha. Nenhuma perda de pacote é aparente, o cliente recebe TCP ACKs em tempo real (<10ms). O cliente estava usando o nome DNS no momento da falha, mas a falha ocorre usando o endereço IPv4 na cadeia de conexão.
Estou correto ao pensar que o fato de eu obter ACKs TCP imediatos para os pacotes de solicitação de pré-login enviados localizaria o problema no sistema operacional ou no SQL Server?
Isso acabou sendo identificado como um efeito colateral do VMWare LRO. A desativação da LRO baseada em host resolveu o problema. Ver