SQL scarica tutte le pagine dalla cache del buffer ogni pochi minuti


9

Ho un singolo nodo SQL2012 SP4 che esegue diversi database.

Il server ha 20 GB di memoria disponibili, 14 GB allocati a SQL (nient'altro in esecuzione sulla scatola).

Ogni pochi minuti SQL scarica l'intera cache del buffer. L'aspettativa di vita della pagina raggiunge lo zero, i descrittori della cache del buffer mostrano che non c'è nulla nella cache.

Ho dato un'occhiata alle notifiche di monitoraggio delle risorse e le notifiche rimbalzano da alta / costante / bassa ogni pochi millisecondi:

RESOURCE_MEMPHYSICAL_HIGH RESOURCE_MEM_STEADY RESOURCE_MEMPHYSICAL_LOW

Con timestamp distanti diversi millisecondi. Il PLE è essenzialmente un modello a dente di sega.

L'ho visto accadere prima con SQL2012 SP1 e questa domanda:

Pagine libere di SQL Server 2012 non utilizzate nella cache buffer

Sembra essere un problema simile, anche se ho già aggiornato a SP4.

Ho provato ad attivare LPIM per l'account di servizio e ho provato a fare confusione con l'impostazione di memoria massima. L'abbassamento della memoria massima sembra aver causato lo svuotamento più frequente della cache del buffer.

Qualche idea su cosa controllare dopo?

Il carico di lavoro del server è letteralmente nulla (sto scorrendo gli elenchi di elementi in un sistema ERP e arriva a circa 40-50 MB prima che la cache si riduca di nuovo).

È interessante perché ho eseguito l'aggiornamento da SP1 per provare a risolvere questo problema: la cache lì arrivava a circa 500 MB. Da allora ho ridotto l'impostazione di memoria massima a 14 GB, che sembra aver peggiorato le cose.

Mi chiedo se Windows stia andando nel panico e lanciando notifiche errate per la pressione della memoria su SQL - ne consegue che il server con la memoria massima impostata su illimitata sembrava funzionare ok ma non riempie mai la cache più di qualche centinaio di MB - ma ora arriva a malapena a 50 ...

Ulteriori informazioni: per coloro che hanno chiesto

Numero di core: 4

Dimensione del database: 80 GB

Il registro errori mostra: A significant part of sql server process memory has been paged out. This may result in a performance degradation. Duration: 0 seconds. Working set (KB): 247928, committed (KB): 495656, memory utilization: 50%.

Risultati dell'esecuzione degli script da questo link: https://www.sqlskills.com/blogs/jonathan/identifying-external-memory-pressure-with-dm_os_ring_buffers-and-ring_buffer_resource_monitor/

Risultati della query sulla pressione della memoria

Non sono sicuro di come interpretarli: sembra che ci sia pressione della memoria interna ed esterna in varie occasioni.

Ancora più informazioni:

Questo è un ospite Hyper-V seduto su un host con 96 GB di RAM totale di cui circa la metà è assegnata agli ospiti.

I sintomi sembrano simili a questo:

SQL Server 2012 x64: impossibile allocare in modo sicuro più del 50% di RAM

Tuttavia, quando ho assegnato 14 GB a SQL, i sintomi sono entrati immediatamente (a malapena sono stati impegnati solo 3 GB di memoria del server)

Ieri sera ho ridotto la memoria del guest a 32 GB e il problema è scomparso, ma vedo solo 14 GB di commit della memoria totale del server (e il business che gestisce il DB è occupato questa mattina e questo è quando di solito hanno i loro problemi di prestazioni).

Al momento, circa 8-9 GB di dati nella cache sembrano essere stabili.

Sembra suggerire che 20 GB siano sufficienti per il carico di lavoro su questa scatola. Sono felice di lasciarlo con 32 GB per ora, ma mi piacerebbe davvero arrivare alla fine di questo in modo da poter meglio configurare le VM / SQL.

Continuerò a scavare e aggiornerò se trovo la risposta!

Ancora più informazioni:

Non ho riavviato SQL dopo aver attivato LPIM (non rendendomi conto che era un requisito) ma ho lasciato questa impostazione attiva e riavviato per aggiornare la memoria, quindi ora non sono sicuro se l'aumento di memoria o LPIM abbia alleviato i problemi.

Salterà su stasera quando il server è inattivo e controlla come appare di nuovo a 20 GB.

Ancora più Altre informazioni:

Attualmente il server va bene con 32GB allocati e da allora non abbiamo più visto il problema. Se si ripresenta, tornerò a questa domanda e continuerò a scavare.

Attualmente rimane un mistero, ma la mia ipotesi è che al momento sto solo mascherando i problemi.


3
Questa è una macchina virtuale? Sembra che il driver del palloncino di VMware causi pressione alla memoria.
Max Vernon,

1
Se si tratta di una VM in esecuzione su VMWare, dai un'occhiata a questo articolo: Risoluzione dei problemi relativi alle prestazioni della CPU su VMware . So che dice CPU nel titolo, ma ci sono anche informazioni sui contatori di memoria.
Erik Darling,

Sì, è un host hyper-v che esegue 3 server. Grazie per le informazioni che controllerò
Charleh

Ho scoperto che l'host ha memoria sufficiente per aggiungere altri 12 GB. Ho permesso SQL 24 GB (portando l'ospite fino a 32 GB in totale) e finora sembra molto più sano, ma mi piacerebbe ancora capire cosa sta succedendo poiché 14-16 GB sembra più che sufficiente per il carico di lavoro che SQL consumerà tutti i giorni ..
Carlo

1
Hai studiato in mongolfiera? Se VMWare carica il driver del palloncino, il sistema operativo segnalerà poca memoria e SQL Server risponderà di conseguenza. Il primo passo è indagare se si dispone di mongolfiere o meno.
Tibor Karaszi,

Risposte:


4

Anche se sembra che tu abbia risolto il problema da solo, ecco un riepilogo delle informazioni rilevanti che circondano la soluzione.

Server Memory Server Opzioni di configurazione

Microsoft scrive nel suo articolo Opzioni di configurazione del server di memoria server (Microsoft | Documenti SQL) per la sezione Impostazione manuale delle opzioni di memoria

( enfatizzare il mio)

Inoltre, l'impostazione di un valore min_server_memory è essenziale in un ambiente virtualizzato per garantire che la pressione della memoria dall'host sottostante non tenti di deallocare memoria dal pool buffer su una macchina virtuale (VM) guest SQL Server oltre a quanto necessario per prestazioni accettabili.

La sezione riguardante Lock Pages in Memory (stesso documento) ha un paragrafo convincente eguagliante che recita come:

( enfatizzare il mio)

Questo criterio di Windows determina quali account possono utilizzare un processo per conservare i dati nella memoria fisica, impedendo al sistema di eseguire il paging dei dati nella memoria virtuale su disco . Il blocco delle pagine in memoria può mantenere reattivo il server quando si verifica il paging della memoria su disco. L'opzione Blocca pagine in memoria è impostata su ON nelle istanze di SQL Server Standard Edition e successive quando all'account con privilegi per eseguire sqlservr.exe è stato concesso il diritto utente Windows Lock Pages in Memory (LPIM).

La sezione LPIM continua spiegando che:

( enfatizzare il mio)

L'impostazione di questa opzione non influisce sulla gestione dinamica della memoria di SQL Server, consentendone l'espansione o la riduzione su richiesta di altri impiegati di memoria. Quando si utilizza il diritto di blocco pagine in memoria, si consiglia di impostare un limite superiore per la memoria massima del server, come descritto sopra.

... e in un commento importante che:

( enfatizzare il mio)

L'impostazione di questa opzione deve essere utilizzata solo quando necessario, vale a dire se vi sono segnali che il processo sqlservr viene eseguito il paging . In questo caso, l'errore 17890 verrà riportato nel log degli errori, simile all'esempio seguente:

A significant part of sql server process memory has been paged out. 
This may result in a performance degradation. Duration: #### seconds. 
Working set (KB): ####, committed (KB): ####, memory utilization: ##%.  

A partire da SQL Server 2012 (11.x), il flag di traccia 845 non è necessario affinché Standard Edition utilizzi Pagine bloccate.

Soluzione

Sulla base dei risultati di cui sopra e delle tue osservazioni, la soluzione al tuo problema sarebbe quella di configurare le seguenti impostazioni:

  1. min_server_memory (5-10 GB?) In base al tuo commento:

    Al momento, circa 8-9 GB di dati nella cache sembrano essere stabili.

    ... e la raccomandazione di Microsoft di impostare a min_server_memory.

  2. max_server_memory (20-32 GB) in base alla tua osservazione:

    Sembra suggerire che 20 GB siano sufficienti per il carico di lavoro su questa scatola. Sono felice di lasciarlo con 32 GB per ora, ma mi piacerebbe davvero arrivare alla fine di questo in modo da poter meglio configurare le VM / SQL.

    ... e la raccomandazione di Microsoft di impostare a max_server_memory.

  3. Blocca pagine in memoria: abilitato per l'account del servizio SQL Server.
    In base alla voce ERRORLOG dell'istanza di SQL Server menzionata e al riferimento di Microsoft nell'articolo.

    L'impostazione di questa opzione deve essere utilizzata solo quando necessario, vale a dire se vi sono segnali che il processo sqlservr viene eseguito il paging .

Prima di continuare ...

(Uno dei) vantaggi di avere un ambiente virtualizzato è che le risorse possono / dovrebbero essere condivise e possibilmente anche impegnate eccessivamente. Tuttavia, l'attivazione di Lock Pages In Memory (LPIM) potrebbe avere un impatto negativo sull'ambiente Hyper-V, se l'hardware ospita più istanze. Un eccessivo impegno della RAM potrebbe esaurire altri casi.

Prima di prendere in considerazione la commutazione di tutte le leve, iniziare con le impostazioni 1. e 2. e se la regolazione fine di queste impostazioni di memoria non funziona, prendere in considerazione l'attivazione di LPIM se si dispone di hardware sufficiente .

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.