SQL Server non utilizza tutta la memoria


10

Ho SQL Server 2014 con memoria massima impostata su 6 GB (la memoria fisica è 8 GB).

La memoria del server di destinazione è talvolta 6 GB e quindi torna alla memoria totale del server (circa 5,3 GB, non raggiunge mai i 6 GB). Ho usato committed_kb in sys.dm_os_sys_info per controllare la memoria utilizzata da SQL Server.

Quando controllo sys.dm_os_buffer_descriptors , vedo che le pagine vengono eliminate dalla cache, ma rimangono ancora 700 MB di memoria. Se nulla avesse bisogno della memoria, come spiegheresti il ​​fatto che le pagine vengono rimosse dalla cache? Mi aspetto che SQL Server rimuova le pagine solo quando ha bisogno di memoria.

Le tabelle temporanee deallocate non sono un problema su questo server. Il mio PLE è 3632. La cache delle procedure è 2182 MB.

Mi aspetto che le pagine vengano eliminate solo quando non è rimasta memoria, ma ho 700 MB di spazio libero o non lo capisco?

Qualcuno può provare a spiegare questo comportamento?

Anche SQL Server legge dal disco, quindi penso di poter concludere che non tutte le pagine necessarie sono in memoria.

Ho fatto qualche ricerca in più e ho letto un'enorme quantità di pagine dal disco in memoria e ho notato qualcosa nel taskmanager durante le letture:

  • La memoria in uso è passata da 7,0 GB -> 7,2 GB -> 7,0 GB -> 7,2 GB -> ...
  • Sqlservr.exe è passato da 5,3 GB -> 5,5 GB -> 5,3 GB -> 5,5 GB -> ...

È proprio come Windows non consente a sqlservr.exe di crescere fino a 6 GB.

Ho eseguito la query fornita da Shanky:

select
(physical_memory_in_use_kb/1024) Physical_Memory_usedby_Sqlserver_MB,
(locked_page_allocations_kb/1024 )Locked_pages_used_Sqlserver_MB,
(Virtual_address_committed_kb/1024 )Total_Memory_in_MB,--RAM+ Pagefile
process_physical_memory_low,
process_virtual_memory_low
from sys. dm_os_process_memory

Ciò ha dato il seguente risultato:

Physical_Memory_usedby_Sqlserver_MB: 5247
Locked_pages_used_Sqlserver_MB: 0
Total_Memory_in_MB: 5625
process_physical_memory_low: 0
process_virtual_memory_low: 0

Quello che non capisco è perché Total_Memory_in_MB non è uguale a 6144 (memoria massima)?

In sys.dm_os_ring_buffers l' ho trovato RESOURCE_MEMPHYSICAL_LOW, quindi penso che Windows abbia esaurito la memoria e che SQL Server debba restituirne alcuni. Ma è disponibile circa 1 GB di memoria => perché Windows dice che sta esaurendo la memoria?

<Record id="13861" type="RING_BUFFER_RESOURCE_MONITOR" time="20635079241">   
   <ResourceMonitor>
        <Notification>RESOURCE_MEMPHYSICAL_LOW</Notification>
        <IndicatorsProcess>0</IndicatorsProcess>
        <IndicatorsSystem>2</IndicatorsSystem>
        <NodeId>0</NodeId>
        <Effect type="APPLY_LOWPM" state="EFFECT_OFF" reversed="0">0</Effect>
        <Effect type="APPLY_HIGHPM" state="EFFECT_IGNORE" reversed="0">85827186</Effect>
        <Effect type="REVERT_HIGHPM" state="EFFECT_OFF" reversed="0">0</Effect>   
   </ResourceMonitor>   
   <MemoryNode id="0">
        <TargetMemory>6050080</TargetMemory>
        <ReservedMemory>67208656</ReservedMemory>
        <CommittedMemory>5423548</CommittedMemory>
        <SharedMemory>0</SharedMemory>
        <AWEMemory>0</AWEMemory>
        <PagesMemory>4975656</PagesMemory>   
   </MemoryNode>   
   <MemoryRecord>
        <MemoryUtilization>100</MemoryUtilization>
        <TotalPhysicalMemory>8387608</TotalPhysicalMemory>
        <AvailablePhysicalMemory>1048452</AvailablePhysicalMemory>
        <TotalPageFile>11142348</TotalPageFile>
        <AvailablePageFile>2887916</AvailablePageFile>
        <TotalVirtualAddressSpace>137438953344</TotalVirtualAddressSpace>
        <AvailableVirtualAddressSpace>137371168056</AvailableVirtualAddressSpace>
        <AvailableExtendedVirtualAddressSpace>0</AvailableExtendedVirtualAddressSpace
   </MemoryRecord> 
</Record>

Aggiornamento
Dopo ulteriori ricerche sul perché fosse sempre disponibile 1 GB di memoria, penso di aver trovato qualcosa.
È possibile che solo SQL Server possa allocare memoria libera e che la memoria disponibile venga ignorata? Durante l'esecuzione di Process Explorer (Sysinternals) ho visto che la memoria libera era 0.

Risposte:


3

Per cominciare, devo dire che hai impostato la memoria massima del server su 6 GB e la memoria totale è di 8 GB, quindi hai appena lasciato 2 GB per il sistema operativo, che in molti casi, anche se nulla è installato a parte SQL Server su un computer Windows , è troppo poca memoria fornita al sistema operativo. Per funzionare correttamente, su un sistema con antivirus installato, il sistema operativo deve disporre di almeno 4 GB. Lascio subito 2 GB per OS e 1,5 G per AV.

La memoria del server di destinazione è talvolta 6 GB e quindi torna alla memoria totale del server (circa 5,3 GB, non raggiunge mai i 6 GB).

La memoria del server di destinazione indica la quantità di memoria richiesta da SQL Server per funzionare correttamente nel caso ideale. La memoria del server di destinazione sta tentando di essere 6 GB perché il valore massimo della memoria del server è stato impostato su 6 GB. Sta cercando di consumare tutta la memoria a cui è permesso.

La memoria totale del server è ciò che SQL Server è effettivamente in grado di consumare in questo momento. Questa memoria è impegnata e supportata dalla RAM fisica. Si tratta di 5,5 GB max nel tuo caso.

SQL Server sta tentando di aumentare il consumo di memoria, ma dopo aver raggiunto i 5,3 o 5,5 GB, il sistema operativo chiede a SQL Server di non aumentare ulteriormente il consumo di memoria e potrebbe in realtà segnalare la memoria insufficiente. Questo sta accadendo perché il sistema operativo potrebbe trovarsi di fronte a memoria insufficiente, come già detto sopra. SQLOS risponde se il sistema operativo Windows affronta la pressione della memoria chiedendo alle cache di ridurne il consumo. È possibile eseguire una query sul Ring Buffer per verificare se è stata segnalata una notifica di memoria insufficiente. Devo aggiungere DMV sys.dm_os_ring_buffer non è documentato ma è sicuro.

Vedo che le pagine vengono eliminate dalla cache, ma rimangono ancora 700 MB di memoria. Se nulla avesse bisogno della memoria, come spiegheresti il ​​fatto che le pagine vengono rimosse dalla cache? Mi aspetto che SQL Server rimuova le pagine solo quando ha bisogno di memoria.

Se stai cercando memoria libera, non ti suggerirei di dare un'occhiata al DMV sys.dm_os_buffer_descriptors . Il contatore del sistema operativo Available Mbytes indicherà la quantità di memoria fisica, in byte, disponibile per i processi in esecuzione sul computer. Ti suggerisco di vedere anche Qual è un metodo deterministico per valutare una dimensione sensibile del pool di buffer? e leggi anche SQL Server ha bisogno di più RAM per scoprire quanta RAM SQL Server ha bisogno e se SQL Server si trova ad affrontare la pressione della memoria. Da quello che hai menzionato, se sei sicuro che le pagine vengano rimosse dal pool di buffer, sì, SQL Server ritiene che le pagine debbano essere spostate perché ha bisogno di spazio per accogliere nuove pagine. Non sono sicuro di come hai calcolato i 700 MB gratuiti.

Un'altra cosa, per favore non guardare Task Manager per il consumo di memoria di SQL Server. Non ti dà sempre il valore corretto soprattutto quando l'account del servizio SQL Server ha le pagine di blocco nel privilegio di memoria . Nel tuo caso, anche se SQL Server ha una memoria massima del server di 6 GB, il sistema operativo riceve solo 2 GB, il che obbliga SQL Server a non aumentare il suo consumo perché 2 GB è basso per SQL Server. C'è qualcosa a parte SQL Server in esecuzione sul sistema?

Se si desidera calcolare il consumo di memoria di SQL Server, utilizzare:

select
(physical_memory_in_use_kb/1024) Physical_Memory_usedby_Sqlserver_MB,
(locked_page_allocations_kb/1024 ) Locked_pages_used_Sqlserver_MB,
(virtual_address_space_committed_kb/1024 ) Total_Memory_in_MB,--RAM+ Pagefile
process_physical_memory_low,
process_virtual_memory_low
from sys.dm_os_process_memory

Quello che non capisco è perché Total_Memory_in_MB non è uguale a 6144 (memoria massima).

La colonna Total_Memory_in_MB indica la memoria totale utilizzata da SQL Server (RAM + file di paging). La RAM è in realtà la memoria fisica utilizzata o la memoria impegnata. Alcune parti del processo di SQL Server sono anche paginate su disco e ciò costituisce una memoria virtuale o un file di paging e quindi se vedrai TOTALE memoria consumata da SQL Server, sarebbe la somma della memoria fisica e del file Page.

Mentre la colonna Physical_Memory_usedby_Sqlserver_MB è solo la memoria fisica (memoria supportata da RAM fisica o memoria impegnata) utilizzata. Questo è il motivo per cui entrambi sono diversi. Se vedi la colonna reale, prima viene utilizzata la memoria fisica e l'altra è impegnata nella memoria virtuale.

Se vuoi vedere la memoria paginata che sarebbe la differenza tra Total_Memory_in_MB e Physical_Memory_usedby_Sqlserver_MB .

NOTA: la memoria totale utilizzata sarebbe maggiore della memoria fisica utilizzata.


5

SQL Server utilizza molte più cache diverse dalla cache buffer, sebbene sia di gran lunga la più grande (un esempio ovvio è la cache del piano). Puoi dare un'occhiata più da vicino alla memoriaDBCC MEMORYSTATUS e a una varietà di DMV. La memoria di destinazione e la memoria totale si riferiscono specificamente al pool di buffer / cache.

Estratto da Christian Bolton 's seminale professionale SQL Server 2008 Internals e risoluzione dei problemi :

  • MSSQL$<instance >:Memory Manager\Total Server Memory (KB):
    Indica la dimensione corrente del pool di buffer.
  • MSSQL$<instance >:Memory Manager\Target Server Memory (KB):
    Indica la dimensione ideale per il pool di buffer. Totale e Target dovrebbero essere quasi gli stessi su un server senza pressione di memoria che è in esecuzione da un po '. Se Total è significativamente inferiore a Target , è probabile che SQL Server non riesca a far crescere il pool di buffer a causa della pressione della memoria, nel qual caso è possibile effettuare ulteriori accertamenti.

Solo per aggiungere anche se la memoria del server totale e quella di destinazione sono uguali, non possiamo essere sicuri al 100% che non vi sia pressione sulla memoria. In questo caso, è necessario attivare altri contatori di memoria e ottenere anche i loro dati per giungere a una conclusione.
Shanky,

"Total e Target dovrebbero essere quasi uguali su un server senza alcuna pressione di memoria che è in esecuzione da un po '." Pensiamo a questo Ho installato un nuovo SQL Server con 128 GB di RAM e ho creato un singolo database da 1 GB. Lascialo funzionare per un mese. Devo davvero credere che Total e Target saranno quasi gli stessi alla fine di quel mese? Se non lo sono, devo credere che il server sia sotto pressione della memoria? Lo trovo difficile da credere.
Mike Sherrill 'Cat Recall',
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.