SQL Server nie używa całej pamięci

10

Mam SQL Server 2014 z maksymalną pamięcią ustawioną na 6 GB (pamięć fizyczna to 8 GB).

Target Server Pamięć bywa 6GB, a następnie powraca do Całkowita Server Memory (około 5.3GB, nigdy nie osiągnie 6GB). Kiedyś committed_kb w sys.dm_os_sys_info aby sprawdzić pamięć używaną przez SQL Server.

Kiedy monitoruję sys.dm_os_buffer_descriptors , widzę, że strony są usuwane z pamięci podręcznej - ale wciąż pozostaje 700 MB pamięci. Gdyby nic nie potrzebowało pamięci, jak wyjaśniłbyś fakt, że strony są usuwane z pamięci podręcznej? Spodziewałbym się, że SQL Server usuwa strony tylko wtedy, gdy potrzebuje pamięci.

Zwolnione tabele tymczasowe nie stanowią problemu na tym serwerze. Moje PLE to 3632. Pamięć podręczna procedury wynosi 2182 MB.

Spodziewałbym się, że strony zostaną upuszczone tylko wtedy, gdy nie ma już pamięci, ale mam 700 MB wolnego miejsca, czy też źle to rozumiem?

Czy ktoś może spróbować wyjaśnić to zachowanie?

SQL Server również odczytuje z dysku, więc myślę, że mogę dojść do wniosku, że nie wszystkie potrzebne strony są w pamięci.

Zrobiłem trochę więcej badań i przeczytałem ogromną liczbę stron z dysku do pamięci i zauważyłem coś w menedżerze zadań podczas odczytów:

  • Używana pamięć wzrosła z 7,0 GB -> 7,2 GB -> 7,0 GB -> 7,2 GB -> ...
  • Sqlservr.exe przeszedł z 5,3 GB -> 5,5 GB -> 5,3 GB -> 5,5 GB -> ...

To tak, jakby Windows nie pozwalał sqlservr.exe powiększyć się do 6 GB.

Uruchomiłem zapytanie dostarczone przez 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

To dało następujący wynik:

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

Nie rozumiem, dlaczego Total_Memory_in_MB nie jest równy 6144 (maksymalna pamięć)?

W sys.dm_os_ring_buffers znalazłem RESOURCE_MEMPHYSICAL_LOW, więc myślę, że w systemie Windows zaczynało brakować pamięci, a SQL Server musi zwrócić trochę. Ale jest dostępny około 1 GB pamięci => dlaczego system Windows informuje, że zaczyna brakować pamięci?

<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>

Aktualizacja
Po kilku dalszych badaniach, dlaczego zawsze była dostępna 1 GB pamięci, myślę, że coś znalazłem.
Czy to możliwe, że SQL Server może przydzielić tylko wolną pamięć, a dostępna pamięć jest ignorowana? Podczas uruchamiania Process Explorer (Sysinternals) widziałem, że wolna pamięć wynosi 0.

Frederik Vanderhaegen
źródło

Odpowiedzi:

3

Na początek muszę powiedzieć, że ustawiłeś maksymalną pamięć serwera na 6 GB, a całkowita pamięć to 8 GB, więc właśnie zostawiłeś 2 GB dla systemu operacyjnego, co w wielu przypadkach, nawet jeśli nic nie jest zainstalowane poza SQL Server na komputerze z systemem Windows , jest za mało pamięci dostarczonej do systemu operacyjnego. Aby działać poprawnie, w systemie z zainstalowanym programem antywirusowym system operacyjny musi mieć co najmniej 4 GB. Od razu zostawiam 2 GB dla systemu operacyjnego i 1,5 G dla systemu AV.

Pamięć serwera docelowego ma czasami 6 GB, a następnie wraca do całkowitej pamięci serwera (około 5,3 GB, nigdy nie osiąga 6 GB).

Pamięć serwera docelowego oznacza, ile pamięci wymaga SQL Server do poprawnego działania w idealnym przypadku. Pamięć serwera docelowego próbuje wynosić 6 GB, ponieważ ustawiono maksymalną wartość pamięci serwera na 6 GB. Próbuje zużyć całą pamięć, do której wolno.

Całkowita pamięć serwera jest tym, co SQL Server jest obecnie w stanie zużyć. Jest to pamięć zatwierdzona i wspierana przez fizyczną pamięć RAM. W Twoim przypadku jest to maksymalnie 5,5 GB.

SQL Server próbuje zwiększyć zużycie pamięci, ale po osiągnięciu 5,3 lub 5,5 GB system operacyjny prosi SQL Server o dalsze zwiększanie zużycia pamięci i może oznaczać powiadomienie o niskim poziomie pamięci. Dzieje się tak, ponieważ system operacyjny może mieć za mało pamięci, jak już wspomniano powyżej. SQLOS reaguje, jeśli system operacyjny Windows odczuje presję pamięci, prosząc pamięć podręczną o zmniejszenie zużycia. Możesz zapytać o bufor bufora, aby sprawdzić, czy zasygnalizowano powiadomienie o niskim poziomie pamięci. Muszę dodać DMV sys.dm_os_ring_buffer jest nieudokumentowany, ale bezpieczny.

Widzę, że strony są usuwane z pamięci podręcznej - ale wciąż pozostaje 700 MB pamięci. Gdyby nic nie potrzebowało pamięci, jak wyjaśniłbyś fakt, że strony są usuwane z pamięci podręcznej? Spodziewałbym się, że SQL Server usuwa strony tylko wtedy, gdy potrzebuje pamięci.

Jeśli szukasz wolnej pamięci, nie sugeruję, abyś spojrzał na DMV sys.dm_os_buffer_descriptors . Licznik OS Available Mbytes powie ilość pamięci fizycznej, w bajtach, dostępny do procesów uruchomionych na komputerze. Proponuję również zapoznać się z Co to jest deterministyczna metoda oceny rozsądnej wielkości puli buforów? a także przeczytaj Czy SQL Server potrzebuje więcej pamięci RAM, aby dowiedzieć się, ile pamięci RAM potrzebuje SQL Server i czy SQL Server zmaga się z pamięcią. Z tego, co wspomniałeś, jeśli jesteś pewien, że strony są usuwane z puli buforów, to tak. SQL Server uważa, że ​​strony muszą zostać przeniesione, ponieważ potrzebuje miejsca, aby pomieścić nowe strony. Nie jestem pewien, jak obliczyłeś 700 MB za darmo.

Jeszcze jedno, proszę nie patrzeć na Menedżera zadań dla zużycia pamięci SQL Server. Nie zawsze daje prawidłową wartość, szczególnie gdy konto usługi SQL Server ma uprawnienia do blokowania stron w pamięci . W twoim przypadku, nawet jeśli SQL Server ma maksymalną pamięć serwera wynoszącą 6 GB, system operacyjny otrzymuje zaledwie 2 GB, co zmusza SQL Server do nie zwiększania zużycia, ponieważ 2 GB jest niskie dla SQL Server. Czy w systemie działa coś innego niż SQL Server?

Jeśli chcesz obliczyć zużycie pamięci SQL Server, użyj:

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

Nie rozumiem, dlaczego Total_Memory_in_MB nie jest równy 6144 (maksymalna pamięć).

Kolumna Total_Memory_in_MB oznacza całkowitą pamięć używaną przez SQL Server (RAM + plik strony). RAM to faktycznie używana pamięć fizyczna lub pamięć zatwierdzona. Pewna część procesu SQL Server jest również stronicowana na dysk, co stanowi pamięć wirtualną lub plik stronicowania, więc jeśli zobaczysz CAŁĄ pamięć zajętą ​​przez SQL Server, będzie to suma pamięci fizycznej i pliku strony.

Podczas gdy kolumna Physical_Memory_usedby_Sqlserver_MB to tylko używana pamięć fizyczna (pamięć wspierana przez fizyczną pamięć RAM lub pamięć zatwierdzoną). To jest powód, dla którego oba są różne. Jeśli widzisz prawdziwą kolumnę, pierwsza z nich to Pamięć fizyczna, a druga to Pamięć wirtualna.

Jeśli chcesz zobaczyć pamięć stronicowaną, to byłaby różnica między Total_Memory_in_MB i Physical_Memory_usedby_Sqlserver_MB .

UWAGA: Całkowita wykorzystana pamięć byłaby większa niż pamięć fizyczna.

Shanky
źródło
5

SQL Server używa o wiele więcej pamięci podręcznych innych niż pamięć podręczna buforów, chociaż jest to zdecydowanie największa (oczywistym przykładem jest pamięć podręczna planu). Możesz przyjrzeć się bliżej pamięci DBCC MEMORYSTATUSi wielu DMV. Pamięć docelowa i pamięć całkowita odnoszą się konkretnie do puli buforów / pamięci podręcznej.

Fragment przełomowego programu Christian SQLton Professional Professional Server Server 2008 i rozwiązywanie problemów :

  • MSSQL$<instance >:Memory Manager\Total Server Memory (KB):
    Wskazuje bieżący rozmiar puli buforów.
  • MSSQL$<instance >:Memory Manager\Target Server Memory (KB):
    Wskazuje idealny rozmiar dla puli buforów. Total i Target powinny być prawie takie same na serwerze bez presji pamięci, która działała przez jakiś czas. Jeśli suma jest znacznie mniejsza niż wartość docelowa , prawdopodobnie SQL Server nie może zwiększyć puli buforów z powodu presji pamięci, w którym to przypadku można zbadać dalej.
Mark Broadbent
źródło
Żeby dodać, nawet jeśli całkowita i docelowa pamięć serwera są takie same, nie możemy być w 100% pewni, że nie ma presji pamięci. W takim przypadku musimy uruchomić więcej liczników pamięci i pobrać ich dane, aby dojść do wniosku.
Shanky
„Suma i wartość docelowa powinny być prawie takie same na serwerze bez presji pamięci, która działała przez jakiś czas”. Pomyślmy o tym. Stoję na nowym serwerze SQL z 128 GB pamięci RAM i przywołuję pojedynczą bazę danych 1 GB. Pozwól mu działać przez miesiąc. Czy naprawdę wierzę, że Total i Target będą prawie takie same pod koniec tego miesiąca? Jeśli nie, to czy mam wierzyć, że serwer jest pod presją pamięci? Trudno mi w to uwierzyć.
Mike Sherrill „Cat Recall”