优化实例中的高内存消耗

本文档介绍如何查看和优化 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'