Help us improve the AWS re:Post Knowledge Center by sharing your feedback in a brief survey. Your input can influence how we create and update our content to better support your AWS journey.
如何对 RDS for SQL Server 实例中可用内存不足的问题进行故障排除?
我想对我的 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 的值持续偏低,请优化访问数据的查询或增加实例类以提供更多内存。
要使用性能详情监控指标,请完成以下步骤:
- 打开 Amazon RDS 控制台。
- 在导航窗格中,选择 Performance Insights(性能详情)。
- 使用 Filter a DB instance(筛选数据库实例)搜索字段选择要监控的实例。
- 设置要查看指标的时间范围。
- 在 Metrics dashboard(指标控制面板)中,选择 Custom dashboard - SQL Server database(自定义控制面板 - SQL Server 数据库),然后选择 Add first widget(添加第一个小组件)。
- 在 Filter metrics by name, category or ID(按名称、类别或 ID 筛选指标)搜索字段中,搜索 Page Life Expectancy(页面的预期寿命),然后将其选中。
- 选择 Add Widget(添加小组件)。
- 重复步骤 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。
为资源使用情况建立基准
要为实例上的资源使用情况建立基准,请监控 FreeableMemory、Page 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 内存使用情况,请完成以下步骤:
- 打开 SSMS,然后连接到您的 Amazon RDS for SQL Server 实例。
- 在 Object Explorer(对象资源管理器)中,右键单击 Amazon RDS 实例端点名称。
- 选择 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。
