Condividi tramite


MSSQLSERVER_19407

Si applica a: SQL Server

Dettagli

Attributo Valore
Nome prodotto SQL Server
ID evento 19407
Origine evento MSSQLSERVER
Componente SQLEngine
Nome simbolico HADR_AG_LEASE_EXPIRED
Testo del messaggio Il lease tra il gruppo di disponibilità '%.*ls' e il cluster di failover di Windows Server è scaduto. Si è verificato un problema di connettività tra l'istanza di SQL Server e il cluster di failover di Windows Server. Per determinare se il failover del gruppo di disponibilità è corretto, controllare la risorsa del gruppo di disponibilità corrispondente nel cluster di failover di Windows Server.

Spiegazione

L'errore 19407 viene generato nel log degli errori di SQL Server quando la comunicazione tra SQL Server e il cluster di failover di Windows Server viene persa. In genere si verifica un'azione correttiva, ovvero un failover in un altro nodo Always-On.

Un lease è un meccanismo di comunicazione basato sul tempo che viene eseguito tra SQL Server e il processo WSFC (Windows Server Failover Cluster), in particolare il processo RHS.EXE. I due processi comunicano periodicamente tra loro per garantire che l'altro processo sia in esecuzione e risponda. Questa comunicazione avviene usando gli oggetti evento di Windows e garantisce che un failover della risorsa del gruppo di disponibilità non venga eseguito senza la conoscenza del cluster WSFC. Se uno dei processi non risponde alla comunicazione leasing in base a un periodo di lease predefinito, si verifica un timeout del leasing. Per informazioni dettagliate, vedere Meccanica e linee guida dei timeout di lease, cluster e controllo integrità per i gruppi di disponibilità AlwaysOn. Vedere anche Funzionamento: Timeout lease AlwaysOn di SQL Server

Cause

Poiché gli eventi di Windows sono oggetti di sincronizzazione leggeri, esiste un numero relativamente ridotto di fattori esterni che li influiscono negativamente. I problemi tipici che possono causare il timeout del lease comportano problemi a livello di sistema. Ecco un elenco di possibilità che possono causare la scadenza del lease e causare un riavvio o un failover:

  • Utilizzo elevato della CPU nel sistema (vicino al 100%).

  • Condizioni di memoria insufficiente: memoria virtuale insufficiente e/o uno dei processi in fase di paging.

  • WSFC in modalità offline a causa della perdita del quorum. Per risolvere i problemi di perdita del quorum, vedere Configurare e gestire il quorum e ripristino di emergenza WSFC tramite quorum forzato (SQL Server).

  • La limitazione delle macchine virtuali influisce sulle prestazioni e causa la scadenza del lease.

  • Il processo di SQL Server non risponde durante la generazione di un dump di memoria di grandi dimensioni. Per altre informazioni sulla generazione di dump dello stack, vedere Impatto della generazione di dump. La generazione di dump dello stack può verificarsi per alcuni dei motivi seguenti:

    • Utilità di pianificazione non yielding
    • Timeout latch
    • Utilità di pianificazione deadlock
    • Deadlock non risolto

Azione utente

Risolvere i problemi di utilizzo elevato della CPU

  1. Aprire Task Manager.

  2. Passare alla scheda Prestazioni e verificare se le CPU sono vicine o al 100% di utilizzo.

  3. Passare alla scheda Processi e ordinare i processi in base alla colonna CPU in ordine decrescente selezionando nella colonna CPU .

  4. Identificare il processo che usa la maggior parte della CPU e lavorare sulla comprensione e sulla risoluzione del motivo per cui causa l'elevato utilizzo della CPU.

  5. Se il processo è SQL Server, vedere Risolvere i problemi di utilizzo elevato della CPU in SQL Server.

  6. È possibile usare lo script di PowerShell seguente per verificare l'utilizzo della CPU nel sistema.

    Get-Counter -Counter "\Processor(_Total)\% Processor Time" -SampleInterval 5 -MaxSamples 30 |
        Select-Object -ExpandProperty CounterSamples | Select-Object TimeStamp, Path, CookedValue
    

Risolvere i problemi di memoria insufficiente

Se nel sistema sono presenti occorrenze di memoria fisica o virtuale insufficiente, il processo sql Server o del servizio host risorse cluster (RHS.exe) potrebbe essere sottoposto a paging. Se il processo viene sottoposto a paging su disco, non viene eseguito attivamente e il timeout del lease potrebbe essere raggiunto dalla memoria temporale disponibile e i byte virtuali del processo vengono inseriti nuovamente nella memoria fisica. La memoria virtuale insufficiente può essere causata da applicazioni, driver o sistemi operativi che consumano l'intera memoria nel sistema. Usare i metodi seguenti per risolvere questo problema:

  1. Controllare il registro eventi dell'applicazione o del sistema per individuare errori come Your system is low on virtual memory. Questo errore potrebbe essere visualizzato sullo schermo anche se si è connessi al server.

  2. Aprire Gestione attività, selezionare Prestazioni -> Memoria per verificare se si sta consumando quasi il 100% di memoria. Usare la scheda Dettagli per identificare le applicazioni che potrebbero essere i consumer di memoria più grandi.

  3. In alternativa, è possibile usare Monitor prestazioni e monitorare questi contatori nel tempo:

    • Process\Working Set : per controllare l'utilizzo della memoria dei singoli processi
    • Memory\Available MBytes : per controllare l'utilizzo complessivo della memoria nel sistema

    È possibile usare lo script di PowerShell seguente per identificare l'utilizzo complessivo della memoria in tutto il processo e la memoria disponibile nel sistema. Se si vuole ottenere l'utilizzo della memoria dei singoli processi, modificarlo "\Process(_Total)\Working Set" in "\Process(*)\Working Set".

    $serverName = $env:COMPUTERNAME
    $Counters = @(
      ("\\$serverName" + "\Process(_Total)\Working Set") , ("\\$serverName" + "\Memory\Available Bytes")
    )
    
    Get-Counter -Counter $Counters -MaxSamples 30 | ForEach-Object {
        $_.CounterSamples | ForEach-Object {
            [pscustomobject]@{
                TimeStamp = $_.TimeStamp
                Path      = $_.Path
                Value_MB  = ([Math]::Round($_.CookedValue, 3)) / 1024 / 1024
            }
            Start-Sleep -s 5
        }
    }
    
  4. Se si identificano applicazioni specifiche che utilizzano grandi quantità di memoria, è consigliabile arrestare o spostare tali applicazioni in un altro sistema o controllare l'utilizzo della memoria.

  5. Se SQL Server utilizza grandi quantità di memoria, è consigliabile usare sp_configure 'max server memory' per ridurre l'utilizzo della memoria.

Monitor prestazioni raccolta dati per CPU, memoria e disco

Questo script di PowerShell facilita la raccolta di dati di Monitoraggio prestazioni (PerfMon) in relazione a CPU, memoria e disco. Lo script è progettato per essere flessibile, consentendo la personalizzazione sia per le istanze predefinite che per le istanze denominate di SQL Server.

#Replace with your instance name if need to collect PerfMon data for named instance
$InstanceName = 'MSSQLSERVER'

# Replace with your desired location
$Location = "D:\PerfMonLogs"

# Function to create performance counter log
function Create-PerfCounterLog {
    param
    (
        [string]$InstanceName,
        [string]$Location
    )
    $counters = @(
        '\Memory\*',
        '\PhysicalDisk(*)\*',
        '\LogicalDisk(*)\*',
        '\Server\*',
        '\System\*',
        '\Process(*)\*',
        '\Processor(*)\*',
        '\SQLServer:Databases(*)\*',
        '"\SQLServer:Buffer Manager\*"',
        '"\SQLServer:SQL Statistics\*"',
        '"\SQLServer:Transactions\*"',
        '"\SQLServer:Database Mirroring\*"',
        '"\SQLServer:Latches\*"',
        '"\SQLServer:General Statistics\*"',
        '"\SQLServer:Availability Replica(*)\*"',
        '"\SQLServer:Plan Cache(*)\*"'
    )
    if ($InstanceName -eq 'MSSQLSERVER') {
        # This is for the default SQL Server instance
        $logmanCommand = "logman create counter MS_perf_log -f bin -c $counters"

    }
    else {
        # This is for a named SQL Server instance
        $InstanceName = "MSSQL`$$InstanceName"
        $counters = $counters -replace 'SQLServer', $InstanceName
        $logmanCommand = "logman create counter MS_perf_log -f bin -c $counters"

    }

    $Location = $Location + '\MS_perf_log.blg'
    $logmanCommand += " -si 00:00:01 -max 500 -o $Location"

    Start-Process -FilePath "cmd.exe" -ArgumentList "/c $logmanCommand" -Verb RunAs -Wait

}

# Function to start the collector
function Start-PerfCounterLog {
    Start-Process -FilePath "cmd.exe" -ArgumentList "/c logman start MS_perf_log" -Verb RunAs -Wait
}

# Function to stop and delete the collector
function Stop-Delete-PerfCounterLog {
    Start-Process -FilePath "cmd.exe" -ArgumentList "/c logman stop MS_perf_log" -Verb RunAs -Wait
    Start-Process -FilePath "cmd.exe" -ArgumentList "/c logman delete MS_perf_log" -Verb RunAs -Wait
}

# Create folder if not exists - update the file path as per your environment
$folderPath = $Location
if (-not (Test-Path $folderPath)) {
    New-Item -Path $folderPath -ItemType Directory
}

# Create performance counter log
Create-PerfCounterLog -InstanceName $InstanceName -Location $Location

# Start the collector
Start-PerfCounterLog

# If the event has occurred again and captured, then stop the collector
# Uncomment below line when you want to stop and delete the collector
# Stop-Delete-PerfCounterLog

Ridurre o evitare dump di memoria di grandi dimensioni del processo di SQL Server o del cluster

In alcuni casi, il processo di SQL Server potrebbe riscontrare eccezioni, asserzioni, problemi dell'utilità di pianificazione e così via. In questi casi, SQL Server attiva il SQLDumper.exe processo per impostazione predefinita per generare un minidump con memoria indiretta. Tuttavia, se la generazione del dump richiede molto tempo, il processo di SQL Server smette di rispondere, che potrebbe attivare un timeout del lease. Le cause comuni per un dump della memoria richiedono molto tempo includono:

  • utilizzo elevato della memoria da parte del processo
  • il sottosistema di I/O in cui viene scritto il dump è lento
  • l'impostazione predefinita è stata modificata da mini dump a un dump filtrato o completo

Per evitare un timeout di lease, seguire questa procedura nei sistemi del gruppo di disponibilità:

  • Aumentare il timeout della sessione, ad esempio 120 secondi per tutte le repliche
  • Modificare il failover automatico di tutte le repliche impostando il failover manuale
  • Aumentare LeaseTimeout a 60.000 ms (60 secondi) e impostare HealthCheckTimeout su 90.000 ms (90 secondi)

Per altre informazioni, vedere Usare lo strumento Sqldumper.exe per generare un file di dump in SQL Server.

Controllare la configurazione della macchina virtuale per il provisioning eccessivo

Se si usa una macchina virtuale, assicurarsi di non eseguire il provisioning eccessivo o l'overcommit delle CPU e delle risorse di memoria. L'overprovisioning delle CPU o della memoria potrebbe causare l'esaurimento delle risorse del sistema operativo guest e mostrare gli stessi problemi descritti in precedenza: CPU elevata e memoria insufficiente. Spesso, se si visualizzano elementi all'interno del sistema operativo guest, spiegando perché si esauriscono le risorse di calcolo è difficile, perché le cose si verificano all'esterno della macchina virtuale stessa. L'overcommit delle risorse può causare interruzioni temporanee dell'elaborazione, che potrebbero causare timeout di lease. Per altre informazioni su come risolvere l'overcommit, vedere Risoluzione dei problemi di prestazioni delle macchine virtuali ESX/ESXi (2001003) e Virtualizzazione - Overcommit della memoria e come rilevarla all'interno della macchina virtuale.

Verificare la migrazione o il backup delle macchine virtuali

Hyper-V, VMware e altre soluzioni vm offrono la possibilità di spostare macchine virtuali tra computer host (Live Migration Hyper-V e VMware vMotion). Nella maggior parte dei casi, queste tecnologie forniscono una migrazione quasi istantanea. Tuttavia, se sono presenti colli di bottiglia della rete o del computer host, queste migrazioni possono essere prolungate, causando la sospensione della macchina virtuale in uno stato non operativo. Ciò può causare la scadenza del timeout del lease tra SQL Server e i processi del cluster. Risolvere i problemi relativi alla migrazione della macchina virtuale prima di risolvere i problemi di timeout del lease.

Le soluzioni di backup delle macchine virtuali possono anche causare tempi di inattività per le macchine virtuali. Se viene eseguito un backup della macchina virtuale nel sistema operativo host o viene eseguita una manutenzione simile nel computer host che richiede molto tempo, può causare un problema di timeout del lease. Il motivo è che, mentre l'orologio è in corso, i processi di SQL Server e cluster non sono in grado di comunicare tra loro nella macchina virtuale sospesa. Risolvere eventuali ritardi causati dai backup delle macchine virtuali o da altre operazioni di manutenzione prima di esaminare i problemi di timeout del lease.