首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >外部记忆压力

外部记忆压力
EN

Database Administration用户
提问于 2015-04-09 13:42:39
回答 2查看 1.4K关注 0票数 4

在我对外部记忆压力的理解上,我有一些“空白”。我在网上发现了很多有用的信息,包括来自SQLSkills.com的这些信息。

server具有SQLOS的内置组件资源监视器( Resource ),该组件监视QueryMemoryResourceNotification Windows以获取服务器上OS级内存可用性的状态。如果Windows OS处于内存压力之下,它将设置一个低内存通知,即资源监视器线程将检测并强制缓存上的外部时钟手在内部开始清除缓存,并减少内存使用,从而允许进程将内存释放回操作系统。

  1. 我推断Windows OS并没有主动将OS级内存可用性状态“推送”到Server。相反,必须通过Win API函数主动请求它。这似乎是一个异步操作。我解释得对吗?
  2. 如果我对#1的推理是合理的,是什么原因导致资源监视器获得操作系统级内存可用性状态?是否按计划执行?事件驱动?从操作系统级内存不足的那一刻到意识到这一点,可能需要多少时间?
  3. 当SQL Server减少内存使用以将内存释放回操作系统时,这到底有多糟糕?这是一个“昂贵”的操作,应该不惜一切代价避免吗?
EN

回答 2

Database Administration用户

发布于 2015-04-09 15:01:39

  1. 是的,从Server 2005开始,随着SQLOS( actually it was called UMS in SQl Server 2000) Wiindows的到来,您永远不会直接要求Server在操作系统遇到内存压力时减少其内存配置。相反,它会引发标志(MEMPHYSICAL_HIGH and MEMPHYSICAL_LOW)。这些标志由SQLOS专用线程监视,这些线程反过来设置一个内部高内存资源标志,该标志告诉各个缓存它们可以分配额外的内存,或者设置低内存资源标志,该标志告诉各个缓存试图减少它们的内存分配。

如果内存压力很大,除了内存不足外,通知OS也可以分页删除Server。在某些情况下,对于分页,情况会有所不同。如果Server服务帐户具有LPIM,则不会发生分页。如果VirtualAlloc()函数不执行内存分配的主要块,则安装AWEAPI()执行主要内存分配,这是不可分页内存

  1. 监视是连续的,这是SQLOS专用线程执行的任务之一。如果我说是专心致志的话,他们一定会继续寻找任何通知。我不知道时间表(如果有的话),但是无论时间表是什么,它肯定是在seconds.The中,反应时间是很快的,并且一旦SQL server看到内存通知很低,它就会立即开始减少其内存消耗。但是,有时如果外部内存压力很大,SQL Server可能没有足够的时间来减少其内存消耗并释放其缓存,并且在它能够完成它之前,OS可能会分页删除SQL server进程。
  2. 是的,它的代价很高,因为Server必须清除它的缓存,减少内存消耗--基本上从内存中消耗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进程的速度。操作系统可能面临严重内存紧缩的情况

  1. 操作系统中的Bug
  2. 第三方驱动程序安装泄漏内存
  3. Max服务器内存设置不正确,第1点和第2点为真。
  4. 有人启动大文件副本,以上3点中的任何一点都是正确的。

在所有上述情况下,问题在于操作系统及其上安装的应用程序,而SQL Server则成为受害者。

票数 3
EN

Database Administration用户

发布于 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服务器上,这对我来说效果很好。

票数 1
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/97416

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档