SQL Server 2012 SP3 上的内存不足问题

use*_*852 8 sql-server memory sql-server-2012

我一直有定期的 SQL Server OOM 错误,有一次 SQL Server 自行关闭并且总是在夜间发生,当时没有人使用它,并且当时没有运行 SQL 代理作业:

这是典型的错误:

08/17/2017 19:31:17,spid100,Unknown,资源池“内部”中的系统内存不足,无法运行此查询。

08/17/2017 19:31:17,spid100,未知,错误:701 严重性:17 状态:123。

08/17/2017 19:31:17,spid112,未知,错误:18056 严重性:20 状态:29。(参数:)。错误以简洁模式打印,因为格式化过程中出现错误。跟踪 ETW 通知等将被跳过。

这是服务器信息:

  • 10GB MIN SQL 服务器内存
  • 21GB 最大 SQL 服务器内存
  • 服务器上只有 4 个 DB
  • 它们的大小每个只有 1 到 2 GB
  • Tempdb 大小从未增长到超过 1GB(设置为自动增长到 10GB)
  • 索引都是低碎片,更新了统计信息
  • 版本:

    Microsoft SQL Server 2012 (SP3) (KB3072779) - 11.0.6020.0 (X64) 
        Oct 20 2015 15:36:27 
        Copyright (c) Microsoft Corporation
        Standard Edition (64-bit) on Windows NT 6.3 <X64> (Build 9600: ) (Hypervisor)
    
    Run Code Online (Sandbox Code Playgroud)

我检查了多个项目:

  • DBCC 内存状态
  • 快速统计:

    SELECT (physical_memory_in_use_kb/1024)/1024 AS [PhysicalMemInUseGB]
    FROM sys.dm_os_process_memory;
    GO
    
    Output:
    20 GB
    Page Life Expectancy                     155932
    
    Run Code Online (Sandbox Code Playgroud)
  • 没有启用资源调控器:

    select pool_id, cache_memory_kb, used_memory_kb,
           out_of_memory_count,used_memgrant_kb
      from sys.dm_resource_governor_resource_pools
    
    Output:
    
    pool_id | cache_memory_kb | used_memory_kb | out_of_memory_count | used_memgrant_kb
    --------+-----------------+----------------+---------------------+-----------------
          1 |          295368 |         641416 |                   0 |                0
    
    
    select (physical_memory_in_use_kb/1024) Memory_usedby_Sqlserver_MB,
           (locked_page_allocations_kb/1024) Locked_pages_used_Sqlserver_MB,
           (total_virtual_address_space_kb/1024 )Total_VAS_in_MB,
           process_physical_memory_low,
           process_virtual_memory_low
      from sys. dm_os_process_memory
    
    Output:
    
    Memory_usedby_Sqlserver_MB | Locked_pages_used_Sqlserver_MB | Total_VAS_in_MB | process_physical_memory_low | process_virtual_memory_low
    ----------------------------------------------------------------------------------------------------------------------------------------
                         20553 |                          20393 |       134217727 |                           0 |                          0
    
    Run Code Online (Sandbox Code Playgroud)

服务器在 SP3 上,我知道 SP1 中存在内存泄漏问题,因此排除了该问题。

有人注意到 DBCC 结果中有什么我应该关注的吗?

pim*_*pim 1

我会做一些配置更改:

  1. 删除最小内存设置,实际上没有必要这样做
    • 你想要改变这个的原因是因为如果设置了这个,SQL Server将永远不会释放低于该标记的内存。如果页面被锁定在内存中,则无法再对内存进行分页。
  2. 将最大服务器内存调整为总内存的 75%(总计 < 32 GB)或 87.5%(总计 > 32 GB)。
    • 假设 SQL Server 是机器上唯一运行的东西,在授予操作系统足够的内存以正常运行后,让它消耗剩余的内存。

您可以使用以下脚本来完成此操作:

use master;
go

-- MIN Server Memory
exec sys.sp_configure
    'min server memory (MB)'
    ,0;

-- MAX Server Memory
declare
  @systemMemory int
  ,@maxServerMemory int;

select
  @systemMemory = total_physical_memory_kb / 1024
from
  sys.dm_os_sys_memory;

set @maxServerMemory = floor(@systemMemory * .75);

if @systemMemory >= 32768
  begin
    set @maxServerMemory = floor(@systemMemory * .875);
  end;

exec sys.sp_configure
  'max server memory (MB)'
  ,@maxServerMemory;

reconfigure;
go
Run Code Online (Sandbox Code Playgroud)

  • 我知道这些是非常标准的最佳实践,但是您能否解释一下更改它们将如何帮助解决它们遇到的错误? (3认同)