跳至内容

如何对 RDS for SQL Server 实例中可用内存不足的问题进行故障排除?

3 分钟阅读
0

我想对我的 Amazon Relational Database (Amazon RDS) for SQL Server 实例中可用内存不足的问题进行故障排除。

解决方法

监控您的实例的内存使用情况

要监控您的内存使用情况,您可以使用 Amazon CloudWatch 指标或增强监控。

使用 CloudWatch 指标

要识别内存不足的情况,请使用 Amazon RDS 控制台监控 CloudWatch 指标 FreeableMemory

要识别可用内存不足时工作负载的增加,请监控以下指标:

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

有关上述指标的信息,请参阅 Amazon RDS 的 Amazon CloudWatch 实例级指标

启用增强监控

要监控 Microsoft SQL Server 的操作系统 (OS) 指标,请使用增强监控启用增强监控时,您可以将指标收集间隔设置为 1、5、10、15、30 或 60 秒。默认为 60 秒粒度,但最佳做法是将粒度设置为 1 或 5 秒。

您还可以使用增强监控创建 CloudWatch 警报,以监控您的 Amazon RDS SQL Server 数据库实例的内存使用情况。

限制 Amazon RDS 实例使用的内存

确定实例的 max_server_memory 值,然后将 max_server_memory 设置为不会导致系统范围内存压力的值。

确定 max_server_memory 值

使用以下计算来确定实例的 max_server_memory 值:

max_server_memory = total_RAM -(操作系统的 1 GB + 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 RAM 保留 1 GB。例如,对于 RAM 为 16 GB 的服务器,保留 4 GB。

  • 如果服务器的 RAM 超过 16 GB,则对于前16 GB 的 RAM,每 4 GB 保留 1 GB。对于超过 16 GB 的 RAM,每 8 GB 保留 1 GB。

例如,如果服务器的 RAM 为 64 GB,则 max_server_memory 的计算如下:

  • 操作系统的 1 GB
  • 前 16 GB RAM: 16/4 = 4 GB
  • 超过 16 GB 的剩余 RAM: (64-16)/8 = 6 GB
  • (操作系统的 1 GB + memory_basis_amount_of_RAM_on_the_server) = 1 + 4 + 6 = 11 GB
  • max_server_memory: 64 - 11 = 53 GB

设置 max_server_memory

要更改 max_server_memory,请使用自定义参数组配置该值。在最大服务器内存 (MB) 中为 max_server_memory 提供值。由于 max_server_memory 是一个动态参数,因此无需重启即可使更改生效。

**注意:**配置 max_server_memory 后,必须持续监控 FreeableMemory,以确定是否要增加或减少分配的内存。

检查是否在数据库实例上使用了 SSIS、SSAS 或 SSRS 选项

检查您的 RDS 选项组,以确定是否在数据库实例上使用了 SQL Server Integration Services (SSIS)、SQL Server Analysis Services (SSAS) 或 SQL Server Reporting Services (SSRS) 选项。这些选项使用的内存不在 max_server_memory 设置范围内,且会增加实例的内存占用量。如果您不使用这些选项,请修改选项组以将其删除。

**注意:**如果您在实例上使用 SSIS、SSAS 或 SSRS,则必须调整 max_server_memory 以容纳这些选项。

例如,如果您使用 SSRS,请将 SSRS 最大内存值设置为数据库实例总内存的 10%。例如,对于内存为 64 GiB 的实例,10% 约为 6.4 GiB。因此,请将 max_server_memory 值调整为大约 46 GiB (64 - 11 - 6.4 = 46 GiB)。

检查数据库连接

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

使用性能详情监控数据库实例

您可以使用性能详情来分析数据库性能,并识别导致实例速度减慢的潜在瓶颈。使用性能详情控制面板监控数据库负载、等待、查询、主机和用户。

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

定期维护索引并更新统计数据。索引高度碎片化会增加 I/O 活动并导致内存使用量增加。此外,过时的统计数据可能会导致基数估计不准确,并导致数据库选择非最优的查询计划。有关详细信息,请参阅 Microsoft 网站上的 Optimize index maintenance to improve query performance and reduce resource consumption。此外,请参阅 Microsoft 网站上的 UPDATE STATISTICS (Transact-SQL)

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

监控 PLE 和 BCHR

要识别内存压力,请监控页面的预期寿命 (PLE) 和缓冲区缓存命中率 (BCHR)。为获得最佳性能,请检查 PLE 和 BCHR 的值是否尽可能高。如果在一段时间内 PLE 和 BCHR 的值持续偏低,请优化访问数据的查询或增加实例类以提供更多内存。

要使用性能详情监控指标,请完成以下步骤:

  1. 打开 Amazon RDS 控制台
  2. 在导航窗格中,选择 Performance Insights(性能详情)。
  3. 使用 Filter a DB instance(筛选数据库实例)搜索字段选择要监控的实例。
  4. 设置要查看指标的时间范围。
  5. Metrics dashboard(指标控制面板)中,选择 Custom dashboard - SQL Server database(自定义控制面板 - SQL Server 数据库),然后选择 Add first widget(添加第一个小组件)。
  6. Filter metrics by name, category or ID(按名称、类别或 ID 筛选指标)搜索字段中,搜索 Page Life Expectancy(页面的预期寿命),然后将其选中。
  7. 选择 Add Widget(添加小组件)。
  8. 重复步骤 6 和 7,为自定义控制面板选择 Buffer Cache Hit Ratio(缓冲区缓存命中率)。

有关 PLE 和 BCHR 的详细信息,请参阅 Microsoft 网站上的 Buffer manager performance objects

当实例存在内存压力且 PLE 和 BCHR 较低时,PAGEIOLATCH 等待会增加。Microsoft SQL Server 正在等待页面从磁盘加载到内存中。当查询的内存请求由于内存不足而失败时,您可能还会看到 RESOURCE_SEMAPHORE 等待。然后,CPU 使用率会增加,因为数据页未在内存中缓存足够长的时间。发生此情况时,Microsoft SQL Server 必须反复访问磁盘上的数据。

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

实例的内存量取决于实例类型。确保选择具有足够资源的实例类,以便数据库实例有足够的资源来应对工作负载。当实例的资源较少时,您将遇到性能问题。实例过大会浪费资源。

例如,db.r5.8xlarge 实例类提供 32 个 vCPU 和 256 GiB 内存。当您预置大小为 db.r5.8xlarge 的 Amazon RDS 实例时,以下资源将共享该实例类上的全部 256 GiB 内存:

  • 操作系统
  • Amazon RDS 进程
  • 数据库引擎
  • Worker 线程
  • 商业智能套件应用程序,例如 SSIS、SSAS 和 SSRS。

有关 Microsoft SQL Server 的内存使用情况的详细信息,请参阅 Microsoft 网站上的 Memory management architecture guide

为资源使用情况建立基准

要为实例上的资源使用情况建立基准,请监控 FreeableMemoryPage Life Expectancy(页面的预期寿命)和 Buffer Cache Hit Ratio(缓冲区缓存命中率)等指标。如果实例上的数据量显著增加,请增加 max_server_memory 值。确保按数据量变化比例增加 max_server_memory 值,以维持实例上的相同性能水平。

**注意:**要识别在 SQL Server 内部使用内存的组件,您可以使用 SQL Server 工具,例如 Reports 和 DMV。

要使用 SQL Server Management Studio (SSMS) 查看 SQL Server 内存使用情况,请完成以下步骤:

  1. 打开 SSMS,然后连接到您的 Amazon RDS for SQL Server 实例。
  2. Object Explorer(对象资源管理器)中,右键单击 Amazon RDS 实例端点名称。
  3. 选择 Reports(报告)、Standard Reports(标准报告)、Memory Consumption(内存消耗)。

要下载 SSMS,请参阅 Microsoft 上的 Download SQL Server Management Studio (SSMS)

您还可以查询 sys.dm_os_memory_clerks 来识别 SQL Server 内部占用内存最多的组件。有关详细信息,请参阅 Microsoft 网站上的 sys.dm_os_memory_clerks (Transact-SQL)Internal memory usage by SQL Server engine