当操作系统发出低内存条件时,SQL Server会多快释放内存?

从SQL Server 2008 R2联机丛书:

服务器内存选项

当SQL Serverdynamic使用内存时,它会定期查询系统以确定可用物理内存量。 SQL Server使用内存通知API QueryMemoryResourceNotification来确定缓冲池何时可以分配内存和释放内存。

从SQL Server 2005/2008联机丛书:

服务器内存选项

当SQL Serverdynamic使用内存时,它会定期查询系统以确定可用物理内存量。 在Microsoft Windows 2000下,SQL Server增大或缩小缓冲区caching,以根据服务器活动将空闲的物理内存保持在4 MB和10 MB之间。 维护这个可用的内存可以防止Windows 2000分页。 如果内存不多,SQL Server会将内存释放到Windows 2000。

在Windows Server 2003下,SQL Server使用内存通知API QueryMemoryResourceNotification来确定缓冲池何时可以分配内存并释放内存。

我明白,SQL Serverpipe理自己的内存使用情况。 如果服务器的可用内存不足,SQL Server将释放一些内存(自己挨饿)。 这是默认的,理想的,首选的行为。 但是我已经看到很多情况下,当有其他饥饿的应用程序(即遇到大量的分页错误)时,SQL Server不释放内存。

然后我发现提及SQL Server实际释放内存可能需要几天的时间

专业的Microsoft SQL Server 2008pipe理,内存使用

在这里输入图像说明

SQL Server是可用性最好的服务器应用程序之一。 当操作系统触发低内存通知事件时,SQL将释放内存供其他应用程序使用,如果机器上正在运行另一个内存贪婪应用程序,则实际上会使内存不足。 好消息是SQL一次只能释放less量的内存,所以在SQL开始受到影响之前可能需要几个小时甚至几天的时间。 不幸的是,如果另一个应用程序迫切需要更多的内存,SQL可能需要几个小时才能释放出足够的内存,以便其他应用程序不需要过多的分页就可以运行。

这听起来正确吗? SQL Server是一个运行良好的服务器应用程序,会在几天内使服务器瘫痪? 是否有一个选项(除了设置SQL Server内存使用的上限)来加快SQL释放内存的速度?

首先了解Windows内存是如何工作的(请参阅如何判断Windows服务器是否正在交换? )。

既然我们知道分页并不全是坏的,那么SQL Server就不会为Windows上的其他应用程序释放足够快的内存,而这些应用程序在我们认为合理的时间内会满足大内存尖峰。

它不会花“天”, SQL需要数天的时间; 而不是其他应用程序。 这是另一个应用程序需要几个小时才能在内存中获得足够的空闲页面以可接受的速度运行(假定有大量内存页面请求)。

一般情况下,如果其他应用程序必须存在于装有SQL Server的机器上,最好的做法是设置SQL的内存限制,如果其他应用程序已知有内存需求的变化。

我很喜欢SQL Server被“很好的”引用。 事实上,这performance得很好。 它只是需要永远(相对来说)这样做。

有两种types的SQL Server正在使用的内存可以被释放:

  • 数据页面(缓冲池)
  • 高速caching

只要内存不足的情况正在发出,两者都将被大幅调整。

Q和A中描述了caching :时钟指针 – 它们用于什么?
“ 缓冲区pipe理”中介绍了缓冲池机制

  • 只要不使用caching,caching可以被修剪。
  • 可以立即修剪缓冲池清理页面(脏页面需要先刷新到磁盘)

总而言之,SQL Server可以在几秒钟内释放所有可以立即释放的内存(干净的页面,非固定的caching)。 刷新IO完成后,脏页可以被释放。 我不知道从哪里来的“这需要几天”的想法来自…