SQL Server不使用所有内存


10

我有SQL Server 2014,最大内存设置为6GB(物理内存为8GB)。

目标服务器内存为6GB,有时,然后回落到总的服务器内存(约5.3GB,从未达到6GB)。我用committed_kbsys.dm_os_sys_info检查SQL Server所使用的内存。

当我监视sys.dm_os_buffer_descriptors时,我看到页面已从缓存中删除-但仍然有700MB的内存。如果什么都不需要内存,您将如何解释从缓存中删除页面的事实?我希望SQL Server仅在需要内存时才删除页面。

在此服务器上,解除分配的临时表不是问题。我的PLE是3632。过程高速缓存是2182 MB。

我希望只有没有可用的内存时,页面才会被丢弃,但是我有700MB的可用空间,还是我误会了这一点?

有人可以尝试解释这种行为吗?

SQL Server也在从磁盘读取数据,因此我想我可以得出结论,并非所有需要的页面都在内存中。

我进行了一些进一步的研究,并从磁盘将大量页面读取到内存中,并在读取过程中注意到taskmanager中的某些内容:

  • 正在使用的内存从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。

Answers:


3

首先,我必须说您已将最大服务器内存设置为6 GB,总内存为8 GB,因此您只剩下2 GB用于操作系统,即使在Windows计算机上没有安装SQL Server,在很多情况下也是如此。 ,提供给OS的内存太少。为了正常运行,在安装了防病毒软件的系统上,操作系统必须至少具有4 GB的空间。我立即为OS留出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 OS面临内存压力,SQLOS会通过询问其缓存以减少其消耗来响应。您可以查询环形缓冲区以检查是否发出了内存不足通知信号。我必须添加DMV sys.dm_os_ring_buffer没有记录,但很安全。

我看到页面已从缓存中删除-但仍然有700MB的内存。如果什么都不需要内存,您将如何解释从缓存中删除页面的事实?我希望SQL Server仅在需要内存时才删除页面。

如果您正在寻找可用内存,我不建议您查看DMV sys.dm_os_buffer_descriptors。该OS计数器 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无法增加其使用量,因为SQL Server的2 GB内存不足。除了在系统上运行的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内存,则是物理内存和Page文件的总和。

虽然Physical_Memory_usedby_Sqlserver_MB列只是所使用的物理内存(由物理RAM或提交的内存支持的内存)。这就是为什么两者不同的原因。如果您看到实列,则第一个是使用的物理内存,另一个是已提交的虚拟内存。

如果要查看分页内存,那将是Total_Memory_in_MBPhysical_Memory_usedby_Sqlserver_MB之间的差异。

注意:使用的总内存将大于使用的物理内存。


5

SQL Server使用了除缓冲区缓存之外的更多缓存,尽管这是迄今为止最大的缓存(一个明显的例子是计划缓存)。您可以仔细查看内存DBCC MEMORYSTATUS以及各种DMV。目标内存和总内存专门指缓冲池/缓存。

摘录自Christian Bolton的开创性专业SQL Server 2008内部和故障排除

  • MSSQL$<instance >:Memory Manager\Total Server Memory (KB)
    这表示缓冲池的当前大小。
  • MSSQL$<instance >:Memory Manager\Target Server Memory (KB)
    这表示缓冲池的理想大小。在没有内存压力且运行了一段时间的服务器上,Total和Target应该几乎相同。如果Total明显小于Target,则SQL Server可能由于内存压力而无法增加缓冲池,在这种情况下,您可以进行进一步调查。

即使总内存和目标服务器内存相同,我们也不能100%确定没有内存压力。在这种情况下,我们需要启动更多的内存计数器,并获取它们的数据以得出结论。
Shanky

“在没有内存压力且运行了一段时间的服务器上,Total和Target应该几乎相同。” 让我们考虑一下。我建立了一个具有128 GB RAM的新SQL Server,并建立了一个1 GB数据库。让它运行一个月。我真的相信道达尔和塔吉特在该月底将几乎相同吗?如果不是,我是否认为服务器承受内存压力?我觉得很难相信。
Mike Sherrill'Cat Recall'17
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.