解决内存不足问题

SQL Server In-Memory OLTP 使用比 SQL Server 更多的内存和不同的方式。 为 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%。

    重要

    如果服务器在 VM 上运行且不专用,请将MIN_MEMORY_PERCENT的值设置为与MAX_MEMORY_PERCENT相同的值。
    有关详细信息,请参阅主题 最佳做法:在 VM 环境中使用 In-Memory 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 恢复有两个步骤:

  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%。

重要

如果服务器在 VM 上运行且不专用,请将MIN_MEMORY_PERCENT的值设置为相同的值,并将MAX_MEMORY_PERCENT的值设置为相同的值。
有关详细信息,请参阅主题 最佳做法:在 VM 环境中使用 In-Memory 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 可能不需要更多的内存,这样您就可以使大部分甚至所有新安装的内存都可用于资源池。

重要

如果服务器在 VM 上运行且不专用,请将MIN_MEMORY_PERCENT的值设置为相同的值,并将MAX_MEMORY_PERCENT的值设置为相同的值。
有关详细信息,请参阅主题 最佳做法:在 VM 环境中使用 In-Memory OLTP

解决在有足够内存时因内存不足导致的页面分配失败

如果收到错误消息“由于资源池'<resourcePoolName>'中的内存不足,不允许数据库'<databaseName>'的页面分配。 请查看错误日志中的“https://go.microsoft.com/fwlink/?LinkId=330673”以获取详细信息。当可用物理内存足以分配页面时,可能是由于资源调节器已禁用。 当资源调控器被禁用时,MEMORYBROKER_FOR_RESERVE会引发人工内存压力。

若要解决此问题,需要启用资源调控器。

有关限制和约束的信息,请参阅启用资源调控器,以及有关使用对象资源管理器、资源调控器属性或 Transact-SQL 来启用资源调控器的指导。

另请参阅

管理 In-Memory OLTP 的内存
监视和排查内存使用情况问题
将具有 Memory-Optimized 表的数据库绑定到资源池
最佳做法:在 VM 环境中使用 In-Memory OLTP