解决内存不足问题
与SQL Server相比,SQL Server In-Memory OLTP 使用的内存更多,并且使用的方式也不同。 为In-Memory OLTP 安装和分配的内存量可能不足以满足不断增长的需求。 这时内存就会不足。 本主题介绍如何从 OOM 情况恢复。 有关可帮助你避免很多 OOM 情况的指南,请参阅 内存使用情况的监视和故障排除 。
本主题的内容
主题 | 概述 |
---|---|
解决 OOM 导致的数据库还原故障 | 如果收到错误消息“由于资源池'resourcePoolName'中的内存不足,数据库'<databaseName>>'的还原操作失败”<,该怎么办。” |
消除工作负荷的低内存或 OOM 情况的影响 | 发现内存不足问题对性能产生负面影响时应采取的操作。 |
在提供足够内存时,解决由于内存不足导致的页分配失败问题 | 如果收到错误消息“由于资源池'resourcePoolName'中的内存不足,不允许数据库'<databaseName>>'的页面分配,<该怎么办。 ……”当可用内存足以进行操作时。 |
解决 OOM 导致的数据库还原故障
尝试还原数据库时,可能会收到错误消息:“由于资源池'resourcePoolName'中的内存不足,数据库'<databaseName>>'<的还原操作失败。在成功还原数据库之前,必须通过提供更多可用内存来解决内存不足问题。
若要解决 OOM 导致的还原故障,请使用以下任何或所有方法以便增加可用内存,来暂时增加可用于恢复操作的内存。
临时关闭正在运行的应用程序。
通过关闭一个或多个正在运行的应用程序,如 Visual Studio、Internet Explorer、OneNote 等,可以将它们使用的内存用于还原操作。 您可以在成功还原后重新启动这些应用程序。增加 MAX_MEMORY_PERCENT 值。
此代码段将资源池 PoolHk 的 MAX_MEMORY_PERCENT 更改为所安装内存的 70%。重要
如果服务器在虚拟机上运行,并且不是专用服务器,请将 MIN_MEMORY_PERCENT 设置为与 MAX_MEMORY_PERCENT 相同的值。
有关详细信息,请参阅主题最佳做法:在虚拟机环境下使用内存中 OLTP。-- disable resource governor ALTER RESOURCE GOVERNOR DISABLE -- change the value of MAX_MEMORY_PERCENT ALTER RESOURCE POOL PoolHk WITH ( MAX_MEMORY_PERCENT = 70 ) GO -- reconfigure the Resource Governor -- RECONFIGURE enables resource governor ALTER RESOURCE GOVERNOR RECONFIGURE GO
有关MAX_MEMORY_PERCENT最大值的信息,请参阅主题部分 内存优化表和索引的可用内存百分比
重新配置最大服务器内存。
有关如何配置最大服务器内存使用内存配置选项优化服务器性能
消除工作负荷的低内存或 OOM 情况的影响
当然,最好不要出现低内存或 OOM(内存不足)情况。 好的计划和监视有助于避免 OOM 情况。 但再好的计划也并不总能预见实际情况,最后仍有可能遇到低内存或 OOM 情况。 从 OOM 恢复有两个步骤:
打开 DAC(专用管理员连接)
Microsoft SQL Server 提供了专用管理员连接 (DAC)。 即使服务器对其他客户端连接停止响应,管理员也可以使用 DAC 访问正在运行的 SQL Server 数据库引擎实例来排除服务器上的故障。 DAC 可通过 sqlcmd
实用工具和 SQL Server Management Studio (SSMS) 获得。
有关如何使用 sqlcmd
和 DAC 的指南,请参阅 使用专用管理员连接。 有关通过 SSMS 使用 DAC 的指南,请参阅 如何:将 SQL Server Management Studio 与专用管理员连接配合使用。
采取纠正措施
要处理 OOM 情况,需要通过减少使用量释放现有内存,或者为内存中表提供更多可用内存。
释放现有内存
删除不重要的内存优化表行并等待垃圾收集
您可以删除内存优化表中不重要的行。 垃圾收集器将这些行使用的内存返回可用内存 . 内存中 OLTP 引擎能够积极回收垃圾。 但是,长时间运行的事务可能会妨碍垃圾收集。 例如,如果有一个事务运行 5 分钟,在事务活动期间,无法对所有因更新/删除操作而创建的行版本进行垃圾收集。
将一行或多行移到基于磁盘的表
下面的 TechNet 文章提供有关将行从内存优化表移到基于磁盘的表的指导。
增加可用内存
增加资源池的 MAX_MEMORY_PERCENT 值
如果尚未为内存中表创建命名资源池,则应执行此操作,并将In-Memory OLTP 数据库绑定到该池。 有关创建In-Memory OLTP 数据库并将其绑定到资源池的指导,请参阅主题将 具有Memory-Optimized表 的数据库绑定到资源池。
如果In-Memory OLTP 数据库绑定到资源池,则可以增加池可以访问的内存百分比。 有关如何更改资源池的 MIN_MEMORY_PERCENT 和 MAX_MEMORY_PERCENT 值的指南,请参阅子主题 更改现有池的 MIN_MEMORY_PERCENT 和 MAX_MEMORY_PERCENT 。
增加 MAX_MEMORY_PERCENT 值。
此代码段将资源池 PoolHk 的 MAX_MEMORY_PERCENT 更改为所安装内存的 70%。
重要
如果服务器在虚拟机上运行,并且不是专用服务器,请将 MIN_MEMORY_PERCENT 和 MAX_MEMORY_PERCENT 设置为相同值。
有关详细信息,请参阅主题最佳做法:在虚拟机环境下使用内存中 OLTP。
-- disable resource governor
ALTER RESOURCE GOVERNOR DISABLE
-- change the value of MAX_MEMORY_PERCENT
ALTER RESOURCE POOL PoolHk
WITH
( MAX_MEMORY_PERCENT = 70 )
GO
-- reconfigure the Resource Governor
-- RECONFIGURE enables resource governor
ALTER RESOURCE GOVERNOR RECONFIGURE
GO
有关 MAX_MEMORY_PERCENT 最大值的信息,请参阅主题部分 可用于内存优化表和索引的内存百分比。
安装更多内存
如果可能,最终的最佳解决方案是安装更多物理内存。 如果执行此操作,请记住,可能还可以增加MAX_MEMORY_PERCENT (查看子主题更改MIN_MEMORY_PERCENT,并MAX_MEMORY_PERCENT现有池) ,因为SQL Server可能不需要更多内存,从而允许你使大部分(如果不是所有)新安装的内存可用于资源池。
重要
如果服务器在虚拟机上运行,并且不是专用服务器,请将 MIN_MEMORY_PERCENT 和 MAX_MEMORY_PERCENT 设置为相同值。
有关详细信息,请参阅主题最佳做法:在虚拟机环境下使用内存中 OLTP。
在提供足够内存时,解决由于内存不足导致的页分配失败问题
如果收到错误消息“由于资源池'resourcePoolName'中的内存不足,不允许数据库'databaseName>'<的页面分配。<> 有关详细信息,请参阅错误日志中的“”https://go.microsoft.com/fwlink/?LinkId=330673,如果可用物理内存足以分配页面,则可能是由于禁用Resource Governor。 在资源调控器被禁用时,MEMORYBROKER_FOR_RESERVE 导致虚假内存压力。
若要解决此问题,您需要启用资源调控器。
有关使用对象资源管理器、资源调控器属性或 Transact-SQL 启用资源调控器的限制和局限以及指导的信息,请参阅 启用资源调控器 。
另请参阅
管理内存中 OLTP 的内存
内存使用情况的监视和故障排除
数据库与资源池绑定的指南,请参阅主题
最佳做法:在 VM 环境中使用 In-Memory OLTP