在我对外部记忆压力的理解上,我有一些“空白”。我在网上发现了很多有用的信息,包括来自SQLSkills.com的这些信息。
server具有SQLOS的内置组件资源监视器( Resource ),该组件监视QueryMemoryResourceNotification Windows以获取服务器上OS级内存可用性的状态。如果Windows OS处于内存压力之下,它将设置一个低内存通知,即资源监视器线程将检测并强制缓存上的外部时钟手在内部开始清除缓存,并减少内存使用,从而允许进程将内存释放回操作系统。
发布于 2015-04-09 15:01:39
actually it was called UMS in SQl Server 2000) Wiindows的到来,您永远不会直接要求Server在操作系统遇到内存压力时减少其内存配置。相反,它会引发标志(MEMPHYSICAL_HIGH and MEMPHYSICAL_LOW)。这些标志由SQLOS专用线程监视,这些线程反过来设置一个内部高内存资源标志,该标志告诉各个缓存它们可以分配额外的内存,或者设置低内存资源标志,该标志告诉各个缓存试图减少它们的内存分配。如果内存压力很大,除了内存不足外,通知OS也可以分页删除Server。在某些情况下,对于分页,情况会有所不同。如果Server服务帐户具有LPIM,则不会发生分页。如果VirtualAlloc()函数不执行内存分配的主要块,则安装AWEAPI()执行主要内存分配,这是不可分页内存
its processes,或者部分满足内存请求。消耗和释放内存的过程涉及成本,因此一旦server消耗了内存,它就不会将其发回(除非OS标记内存较低),因为它必须一直处理从OS请求内存的过程,而OS的VirtualAlloc()函数将找到一个VAS区域,并将其映射到物理内存,从而实际向进程提供内存。编辑:
我想知道不设置Max内存会产生什么后果。
Microsoft建议,如果DEDICATED Server框仅运行SQL Server database engine services,则将最大服务器内存保留为默认。Server可以以更好的方式进行管理。如果您认为,如果您在Windows 2008和2005上安装了server 2005-2008 R2,这是不正确的,因为Windows发布版本中的各种错误正在微调Server内存消耗。如果您拥有最新的Windows server 2012具有SQL Server 2012,则这是正确的。但是,根据我的经验,这也是有限的。
我的建议是,如果正确设置最佳值,则最好修复最大服务器内存。无论您在哪个版本,请在这个SE线程和这条线上看到答案(由我和其他人提供),有大量证据表明您应该修复最大服务器内存。
如果Server“知道”操作系统内存不足,并且能够及时将内存返回到OS,为什么不让它执行该任务?
这是一个很好的问题,但正如我之前所写的,有时如果OS面临的内存紧缩太严重,SQL Server会对内存压力做出响应,但在这种情况下,在SQL Server有足够的时间清除缓存之前,它将被OS分页(因为操作系统急需内存),最终会大大减缓Server进程的速度。操作系统可能面临严重内存紧缩的情况
在所有上述情况下,问题在于操作系统及其上安装的应用程序,而SQL Server则成为受害者。
发布于 2015-04-09 15:04:08
根据:如何减少64位版本的Server (http://support.microsoft.com/en-us/kb/918483)中缓冲池内存的分页,这似乎是异步的:
在Windows 2003或Windows或更高版本系统上,Server可以使用QueryMemoryResourceNotification Windows提供的内存通知机制。
Jonathan在https://www.simple-talk.com/sql/database-administration/great-sql-server-debates-lock-pages-in-memory/这里解释了更多的内容,节选包括以下内容:
通常,SQL Server将使用尽可能多的内存,并且它不会释放它在正常操作下分配的内存,除非Windows Server OS设置内存低资源通知标志。SQLOS的一个组件称为资源监视器( Resource ),它监视Windows,当QueryMemoryResourceNotification设置低内存资源通知时,SQLOS将通过在内部清除其缓存来响应,以减少进程工作集,并将内存释放回Windows。
这是异步的,但我从来没有经历过戏剧性的变化。当缓冲区被刷新时,内存就被释放到操作系统中。当然,这意味着数据缓存较小,在缓存中保存的数据较少,这将影响性能,因为这可能导致更多的存储I/O。
乔纳森在https://www.sqlskills.com/blogs/jonathan/wow-an-online-calculator-to-misconfigure-your-sql-server-memory/#comment-145204的帖子提出了一般性的默认建议:
为操作系统预留1GB的RAM,在4-16 GB的范围内为每4GB的RAM预留1GB的内存,然后为安装在16 GB以上的8GB RAM预留1GB的内存。
在相对大型的SQL服务器上,这对我来说效果很好。
https://dba.stackexchange.com/questions/97416
复制相似问题