解决内存不足问题

与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 恢复有两个步骤:

  1. 打开 DAC(专用管理员连接)

  2. 采取纠正措施

打开 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