Sql-Server

SQL Server 未使用所有記憶體

  • December 27, 2021

我有最大記憶體設置為 6GB(物理記憶體為 8GB)的 SQL Server 2014。

目標伺服器記憶體有時為 6GB,然後回落到總伺服器記憶體(大約 5.3GB,從未達到 6GB)。我在sys.dm_os_sys_info中使用了committed_kb來檢查SQL Server 使用的記憶體。

當我監視sys.dm_os_buffer_descriptors時,我看到頁面已從記憶體中刪除 - 但仍有 700MB 的記憶體剩餘。如果什麼都不需要記憶體,你將如何解釋頁面從記憶體中刪除的事實?我希望 SQL Server 僅在需要記憶體時才刪除頁面。

解除分配的臨時表在此伺服器上不是問題。我的 PLE 是 3632。過程記憶體是 2182 MB。

我希望只有在沒有剩餘記憶體時才會刪除頁面,但是我有 700MB 可用空間還是我誤解了這一點?

有人可以嘗試解釋這種行為嗎?

SQL Server 也在從磁碟讀取,所以我想我可能會得出結論,並非所有需要的頁面都在記憶體中。

我做了一些更多的研究,我將大量頁面從磁碟讀取到記憶體中,並在讀取過程中註意到任務管理器中的一些內容:

  • 使用的記憶體從 7.0GB -> 7.2GB -> 7.0GB -> 7.2GB ->…
  • Sqlservr.exe 從 5.3GB -> 5.5GB -> 5.3GB -> 5.5GB -> …

就像 Windows 不允許sqlservr.exe增長到 6GB 一樣。

我執行了 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

這給出了以下結果:

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

我不明白的是為什麼Total_Memory_in_MB不等於 6144(最大記憶體)?

sys.dm_os_ring_buffers我發現了RESOURCE_MEMPHYSICAL_LOW,所以我認為 Windows 記憶體不足,SQL Server 必須返回一些。但是有大約 1GB 的可用記憶體 => 為什麼 Windows 告訴它記憶體不足?

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

更新

經過更多研究為什麼總是有 1GB 記憶體可用,我想我找到了一些東西。
是否有可能 SQL Server 只能分配空閒記憶體而忽略可用記憶體?執行 Process Explorer (Sysinternals) 時,我看到可用記憶體為 0。

首先,我必須說您已將最大伺服器記憶體設置為 6 GB,總記憶體為 8 GB,因此您只為作業系統留下了 2 GB,在許多情況下,即使在 Windows 機器上除了 SQL Server 之外沒有安裝任何東西, 提供給作業系統的記憶體太少。要正常執行,在安裝了防病毒軟體的系統上,作業系統必須至少提供 4 GB。我立即為作業系統留出 2GB,為 AV 留出 1.5G。

目標伺服器記憶體有時為 6GB,然後回落到總伺服器記憶體(大約 5.3GB,從未達到 6GB)。

目標伺服器記憶體表示 SQL Server 需要多少記憶體才能在理想情況下正常執行。目標伺服器記憶體嘗試為 6 GB,因為您已將最大伺服器記憶體值設置為 6 GB。它試圖消耗它允許的所有記憶體。

總伺服器記憶體是 SQL Server 現在實際能夠消耗的記憶體。這是已送出的記憶體並由物理 RAM 支持。在您的情況下,最大為 5.5 GB。

SQL Server 正在嘗試增加其記憶體消耗,但在達到 5.3 或 5.5 GB 後,作業系統會要求 SQL Server 不要進一步增加其記憶體消耗,並且實際上可能會標記低記憶體通知。發生這種情況是因為作業系統可能面臨記憶體不足的問題,如上所述。如果 Windows 作業系統面臨記憶體壓力,SQLOS 會通過要求其記憶體減少其消耗來做出響應。您可以查詢 Ring Buffer以檢查是否有低記憶體通知信號。我必須添加 DMV sys.dm_os_ring_buffer未記錄但安全。

我看到頁面已從記憶體中刪除 - 但仍有 700MB 的記憶體。如果什麼都不需要記憶體,你將如何解釋頁面從記憶體中刪除的事實?我希望 SQL Server 僅在需要記憶體時才刪除頁面。

如果您正在尋找空閒記憶體,我不建議您查看 DMV sys.dm_os_buffer_descriptors作業系統計數器Available Mbytes告訴您電腦上執行的程序可用的物理記憶體量(以字節為單位)。我建議您也看看評估合理緩衝池大小的確定性方法是什麼?並閱讀SQL Server 是否需要更多 RAM以了解 SQL Server 需要多少 RAM 以及 SQL Server 是否面臨記憶體壓力。從您提到的內容來看,如果您確定頁面正在從緩衝池中刪除,那麼是的,SQL Server 認為必須移動頁面,因為它需要空間來容納新頁面。我不確定您如何計算 700 MB 的免費空間。

另一件事,請不要查看任務管理器的 SQL Server 記憶體消耗。它並不總是為您提供正確的值,尤其是當 SQL Server 服務帳戶具有記憶體中的鎖定頁面特權時。在您的情況下,即使 SQL Server 的最大伺服器記憶體為 6 GB,作業系統也只提供 2 GB,這會迫使 SQL Server 不增加其消耗,因為 2 GB 對於 SQL Server 來說太低了。除了在系統上執行的 SQL Server 之外,還有其他東西嗎?

如果要計算 SQL Server 記憶體消耗,請使用:

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

我不明白為什麼Total_Memory_in_MB不等於 6144(最大記憶體)。

Total_Memory_in_MB列表示 SQL Server 使用的總記憶體(RAM+頁面文件)。RAM 實際上是已使用或已送出的物理記憶體。SQL Server 程序的某些部分也被分頁到磁碟,構成虛擬記憶體或頁面文件,因此如果您要查看 SQL Server 消耗的 TOTAL 記憶體,它將是物理記憶體和頁面文件的總和。

雖然Physical_Memory_usedby_Sqlserver_MB列只是使用的物理記憶體(由物理 RAM 支持的記憶體或已送出的記憶體)。這就是兩者不同的原因。如果您看到真正的列,第一個是已使用的物理記憶體,另一個是已送出的虛擬記憶體。

如果您想查看分頁記憶體,這將是Total_Memory_in_MBPhysical_Memory_usedby_Sqlserver_MB之間的差異。

**注意:**使用的總記憶體將大於使用的物理記憶體。

引用自:https://dba.stackexchange.com/questions/136472