SQL Server 未使用所有内存

Fre*_*gen 13 sql-server memory sql-server-2014

我有 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 也在从磁盘读取,所以我想我可能会得出结论,并非所有需要的页面都在内存中。

我做了一些更多的研究,我将大量页面从磁盘读取到内存中,并在读取过程中注意到任务管理器中的一些内容:

  • 使用的内存从 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
Run Code Online (Sandbox Code Playgroud)

这给出了以下结果:

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
Run Code Online (Sandbox Code Playgroud)

我不明白的是为什么Total_Memory_in_MB不等于 6144(最大内存)?

sys.dm_os_ring_buffers我发现RESOURCE_MEMPHYSICAL_LOW,所以我认为 Windows 内存不足,SQL Server 必须返回一些。但是有大约 1GB 的可用内存 => 为什么 Windows 告诉它内存不足?

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
Run Code Online (Sandbox Code Playgroud)

更新
经过更多研究为什么总是有 1GB 内存可用,我想我找到了一些东西。
是否有可能 SQL Server 只能分配可用内存而忽略可用内存?运行 Process Explorer (Sysinternals) 时,我看到可用内存为 0。

Sha*_*nky 6

首先,我必须说您已将最大服务器内存设置为 6 GB,总内存为 8 GB,因此您只为操作系统留出了 2 GB,在许多情况下,即使在 Windows 机器上除了 SQL Server 之外没有安装任何东西, 提供给操作系统的内存太少。要正常运行,在安装了防病毒软件的系统上,必须至少为操作系统提供 4 GB。我立即为 OS 留出 2GB,为 AV 留出 1.5 G。

目标服务器内存有时是 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 会通过要求其缓存削减其消耗来做出响应。您可以查询环形缓冲区以检查是否有低内存通知发出信号。我必须添加 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
Run Code Online (Sandbox Code Playgroud)

我不明白的是为什么Total_Memory_in_MB不等于 6144(最大内存)。

Total_Memory_in_MB列表示 SQL Server 使用的总内存(RAM+页面文件)。RAM 实际上是已使用或已提交的物理内存。SQL Server 进程的某些部分也分页到磁盘,构成虚拟内存或页面文件,因此如果您要查看 SQL Server 消耗的内存总量,它将是物理内存和页面文件的总和。

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

如果您想查看分页内存,这将是Total_Memory_in_MBPhysical_Memory_usedby_Sqlserver_MB之间的区别。

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


小智 5

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

摘自Christian Bolton开创性的Professional SQL Server 2008 Internals and Troubleshooting

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