优化实例中的高内存消耗量

本文档介绍了如何在 Cloud SQL for SQL Server 实例被预配不足的实例 Recommender 识别为内存消耗较高时查看和优化该实例。

SQL Server 内存

SQL Server 内存可分为以下几类:

缓存

这些是磁盘上可重新加载的对象,例如数据库页面和存储过程。因此,SQL Server 可以根据内存利用率增加和缩小这些对象。缓存包括缓冲区池和计划缓存。

固定内存

固定内存可以扩展和缩减。只有在未使用时(例如,当连接数减少或执行的查询数减少时),它才会缩减。 它与缓存不同。如果固定内存不足,SQL Server 可能会耗尽内存。 固定内存包括连接内存和内存授予。

SQL Server 开销

SQL Server 开销包括线程和堆栈。

内存中 OLTP

内存 OLTP 包括内存表和内存文件组。

SQL Server 的内存消耗通过设置 maximum server memorymemory.memory.limitmb 进行控制。memory.memory.limitmb 参数由 Cloud SQL 自动设置。

如需详细了解 memory.memory.limitmb,请参阅 Microsoft 文档

您必须将 max server memory 限制设置为合适的值。在 SQL Server 中,如果未设置 max server memory,数据库页面可能会消耗接近 100% 的大部分内存。这有时可能会造成误导。

内存优化选项

如需确定实例是否需要进行更多内存调优,请执行以下操作:

  • 设置 max server memory 的值。 一般建议将 max server memory 设置为大约 80%,以防止 SQL Server 占用所有可用内存。 对于内存较多的实例,80% 可能过低,可能会导致内存浪费。

  • 监控 Page life expectancy

    Page life expectancy 表示最早的页面在缓冲区池中保留的时长(以秒为单位)。根据 Microsoft 的建议,此值应大于 300。如果该值一直低于 300,则可能表示实例遇到了高内存利用率。运行以下查询以监控 Page life expectancy

    SELECT 
      [object_name],
      [counter_name],
      [cntr_value] 
    FROM 
      sys.dm_os_performance_counters
    WHERE 
      [object_name] 
    LIKE 
      '%Manager%'
    AND 
      [counter_name] = 'Page life expectancy'
    
  • 检查 Memory Grants Pending

    Memory Grants Pending 用于指定等待工作区内存授予的进程总数。运行以下查询以检查 Memory Grants Pending。如果此查询持续显示待处理的授权,则表示内存利用率高。您可以通过查询数据库等待和调整等待内存的任何语句来减少它。

    SELECT
      @@SERVERNAME AS [Server Name],
      RTRIM([object_name]) AS [Object Name],
      cntr_value AS [Memory Grants Pending]
    FROM 
      sys.dm_os_performance_counters WITH(NOLOCK)
    WHERE
      [object_name] 
    LIKE 
      N'%Memory Manager%'  -- Handles named instances
    AND 
      counter_name = N'Memory Grants Pending'