如何解决我的 RDS for SQL Server 实例中可用内存低的问题?

上次更新日期:2022 年 10 月 3 日

如何解决我的 Amazon Relational Database (Amazon RDS) for SQL Server 实例中可用内存低的问题?

简短描述

可用内存过低会导致您的实例意外停机。因此,监控实例的内存使用情况并采取补救措施非常重要。

可用内存是 RDS 实例上可用的内存 (RAM) 量。Amazon RDS 实例上的可用内存总量取决于实例类。例如,实例类 db.r5.8xlarge 提供 32 个 vCPU 和 256 GiB 内存。如果您使用 db.r5.8xlarge 实例类预置 RDS 实例,则该实例类的总内存 (256 GiB) 由以下对象共享:

  • 操作系统
  • Amazon RDS 流程
  • 数据库引擎
  • 工作线程
  • 商业智能套件(SSIS、SSAS、SSRS)应用程序等。

有关 SQL Server 如何使用内存的更多信息,请参阅 Microsoft 文档网站上的内存管理架构指南

解决方法

监控实例的内存使用情况

Amazon CloudWatch 指标

FreeableMemory 进行 Amazon CloudWatch 指标监控,以识别内存不足的情况。除了 FreeableMemory 之外,您还可以监控以下内容,以识别可用内存不足时工作负载的增加:

  • DatabaseConnections
  • CPUUtilization
  • ReadIOPS
  • ReadThroughput
  • WriteIOPS
  • WriteThroughput

增强监控

可以使用不同的粒度开启增强监控,例如 1、5、10、15、30 或 60 秒,以监控 Microsoft SQL Server 的操作系统指标。最佳做法是将粒度设置为 1 或 5 秒(默认为 60 秒)。您可以使用增强监控创建 CloudWatch 警报来监控您的 Amazon RDS for SQL Server 数据库实例的内存消耗

解决可用内存低的问题

要解决可用内存低的问题,请执行以下操作:

限制 RDS 实例使用的内存

通过将最大服务器内存设置为不会导致全系统内存压力的值,来限制 RDS 实例使用的内存。您可以使用以下公式确定实例的最大服务器内存值:

max_server_memory = total_RAM – (1 GB for the OS + memory_basis_amount_of_RAM_on_the_server)

total_RAM 等于实例类内存,其中 memory_basis_amount_of_RAM_on_the_server 的确定方式如下:

  • 如果服务器上的 RAM 介于 4 GB 和 16 GB 之间:每 4 GB 内存保留 1 GB。例如,对于 16 GB 的服务器,保留 4 GB。
  • 如果服务器上的 RAM 超过 16 GB:16 GB 及以下,每 4 GB RAM 保留 1 GB;16 GB 以上,每 8 GB RAM 保留 1 GB。

例如,如果服务器有 64 GB 的 RAM,则计算方法如下:

  • 1 GB 用于操作系统
  • 16 GB 及以下的 RAM:16/4 = 4 GB
  • 剩余超过 16 GB 的 RAM : (64-16) /8 = 6
  • 需保留的 RAM 总量:1 + 4 + 6 = 11 GB
  • max_server_memory:64 – 11 = 53 GB

注意:

  • 如果您在实例上使用 SSIS、SSAS 或 SSRS,则必须调整 max_server_memory 以适应这些组件。
    示例:您想将 SSRS 与 RDS 实例一起使用。将 SSRS 最大内存值设置为 10%(占数据库实例总内存的百分比)。这在具有 64 GiB 内存的实例上约为 6.4 GiB。max_server_memory 值应约为 46 GiB (64-11-6.4)。
  • 在初始配置 max_server_memory 之后,必须持续监控 FreeableMemory,以决定是增加还是减少分配的内存。

要更改 max_server_memory,请使用自定义参数组配置该值。max_server_memory 的值需要以 MB 为单位提供。

注意:参数 max_server_memory 是一个动态参数。因此,无需重新启动即可使更改生效。

检查数据库连接

与实例建立的每个数据库连接都需要在缓冲池之外为工作线程分配一些内存。因此,DatabaseConnections 激增可能会导致可用内存减少。

验证数据库实例上是否使用了 SSIS、SSAS 或 SSRS 组件

使用 Amazon RDS for SQL Server 选项组,确定数据库实例上是否使用了 SSIS、SSAS 或 SSRS 组件。这些组件使用的内存存在于 max_server_memory 设置之外。如果您不使用这些功能,请通过修改选项组将其删除。删除这些功能会减少实例的内存占用。

使用 Performance Insights 监控数据库实例

使用性能详情,您可以监控数据库实例以进行数据库性能分析。您可以使用 Performance Insights 仪表板监控数据库负载、等待时间、查询、主机、用户等。监控这些有助于您识别导致实例速度变慢的潜在瓶颈。

对数据库实例进行定期维护

执行定期索引维护并保持统计数据更新。高度碎片化的索引会导致 I/O 活动增加,从而导致更多的内存消耗。同样,过时的统计数据可能导致基数估计不准确,从而导致选择不理想的查询计划。

注意:最佳做法是在非高峰时段或维护时段内执行索引和统计数据维护。

监控页面预期寿命和缓冲区缓存命中率

页面预期寿命(PLE)表示页面在没有引用的情况下停留在缓冲池中的秒数。

缓冲区缓存命中率(BCHR)是缓冲池中的数据页满足的页面请求的百分比。

监控 PLE 和 BCHR 可以识别内存压力。要使用 Performance Insights 监控这些指标,请执行以下操作:

  1. 打开 Amazon RDS console(Amazon RDS 控制台)。
  2. 选择 Performance Insights(性能详情)。
  3. 选择要监控的 RDS for SQL Server 实例。
  4. 设置要查看指标的时间范围,然后选择管理指标
  5. 选择数据库指标页面预期寿命、缓冲区缓存命中率

为了获得最佳性能,这些指标的值应尽可能高。您可以使用 Performance Insights 来监控这些指标。您可能会看到,这些指标的值在一段时间内一直很低。如果出现这种情况,请调整访问数据的查询或增加实例类以提供更多内存。

当实例面临内存压力以及 PLE 和 BCHR 较低时,PAGEIOLATCH 等待时间会增加。这意味着 SQL Server 正在等待从磁盘获取页面并将其加载到内存中。此外,当由于内存紧缩而无法满足查询的内存请求时,RESOURCE_SEMAPHORE 等待可能会被注意到。这会导致 CPU 使用率增加,因为数据页在内存中的缓存时间不够长。发生这种情况时,SQL Server 必须重复访问磁盘才能访问导致性能问题的数据。

识别使用最多资源的查询

使用 Performance Insights,捕获使用最多资源的查询并调整它们以获得更好的性能。

为您的工作负载选择正确的实例大小

实例的内存量取决于实例类型。选择具有足够资源的实例类非常重要,这样数据库实例才有足够的资源来处理工作负载。资源较少的实例会遇到性能问题,而过大的实例会浪费资源。

确定资源使用情况

通过监控 FreeableMemory、页面预期寿命、缓冲区缓存命中率等指标来确定实例的资源使用基准。如果实例上的数据量显著增加,请增加 max_server_memory 值。确保根据数据量变化成比例增加 max_server_memory 的值,以保持实例的相同性能水平。

注意:您可以使用 SQL Server 原生工具(如 Reports 和 DMV)来识别使用 SQL Server 内部内存的组件。使用 SQL Server Management Studio(SSMS),您可以查看 SQL Server 的内存使用情况:

  1. 打开 SQL Server Management Studio (SSMS) 并连接到您的 RDS for SQL Server 实例。
  2. 在对象资源管理器中,右键单击 RDS 实例端点名称。
  3. 选择报告标准报告内存消耗

此外,您可以查询 sys.dm_os_memory_clerks DMV 以识别在 SQL Server 中使用最大内存的组件


这篇文章对您有帮助吗?


您是否需要账单或技术支持?