AWS Builder Center: Learn, Build and Connect with builders in the AWS community
AWS Builder Center is the official home for builders on AWS. Share and read what others are working on, follow people who inspire you, explore training and workshops, and find tools to support what you're building.
如何排查和监控 Amazon RDS for SQL Server 实例的性能问题?
我的 Amazon Relational Database Service (Amazon RDS) for Microsoft SQL Server 数据库 (DB) 实例存在查询响应缓慢、资源利用率高或数据库连接问题。我想找出原因并解决性能问题。
解决方法
确定性能问题的原因
要确定导致性能问题的原因,请执行以下操作。
检查 RDS 数据库实例类
请执行以下操作:
- 将当前资源利用率与数据库实例类的规格进行比较,确定是否超出了容量。
- 确定 CPU、内存或网络限制是否会影响数据库实例的性能。
- 检查数据库实例的基准和突增每秒进行读写操作的次数 (IOPS) 是否满足您的工作负载需求,并且未超过实例配额。
- 确定内存优化型或计算优化型数据库实例能否提高工作负载的性能。
使用 Amazon CloudWatch 分析 IOPS 指标
请执行以下操作:
- 根据预调配 IOPS 配额监控数据库实例的 ReadIOPS 和 WriteIOPS 指标。
- 查看您的 Amazon Elastic Block Store (Amazon EBS) 卷的 ReadIOPs 和 WriteIOPs 指标以识别存储瓶颈。
- 如果您使用 gp2 卷,请监控 BurstBalance 指标以确认突增积分仍然可用。
- 如果您使用 io1 或 io2 卷,请确认您的预调配 IOPS 容量与工作负载的 IOPS 使用量相匹配。
有关更多信息,请参阅 Amazon RDS 的 Amazon CloudWatch 指标以及使用 Amazon CloudWatch 监控 Amazon RDS 指标。
检查数据库负载
当您遇到问题时,请使用 CloudWatch 数据库洞察检查数据库负载,并识别导致高负载的主要 SQL 查询和等待事件。
注意: 默认会为数据库开启数据库洞察的标准模式。
查看 SQL Server 扩展事件
完成以下步骤:
-
安装 SQL Server Management Studio (SSMS) 以连接到您的 RDS for SQL Server 数据库实例。有关说明,请参阅 Microsoft 网站上的 Install SQL Server Management Studio(安装 SQL Server Management Studio)。
-
导航到您的扩展事件会话。有关说明,请参阅 Microsoft 网站上的 Create an event session in SSMS(在 SSMS 中创建事件会话)。
-
在扩展事件会话中查看实时数据。有关说明,请参阅 Microsoft 网站上的 Watch live data(查看实时数据)。
-
在实时数据流中查找 xml_deadlock_report 事件。
-
运行以下 T-SQL 查询以检索死锁信息:
SELECT xed.value('@timestamp', 'datetime') AS [Timestamp], xed.query('.') AS [Deadlock XML] FROM ( SELECT CAST(target_data AS XML) AS target_data FROM sys.dm_xe_session_targets AS xt INNER JOIN sys.dm_xe_sessions AS xs ON xs.address = xt.event_session_address WHERE xs.name = N'system_health' AND xt.target_name = N'ring_buffer' ) AS XML_Data CROSS APPLY target_data.nodes('RingBufferTarget/event[@name="xml_deadlock_report"]') AS XEventData(xed) ORDER BY [Timestamp] DESC;注意: 上述查询仅检索环形缓冲区中当前记录的事件。对于历史数据,请使用 sys.fn_xe_file_target_read_file 函数读取 .xel 文件。
解决性能问题
要解决性能问题,请执行以下操作。
检查 CPU 利用率是否过高
如果数据库的 CPU 利用率过高,请执行以下操作:
- 使用数据库洞察中 Top 10 instances per DB Load Utilization chart(按数据库负载利用率排列的前 10 个实例图表)来识别 CPU 利用率高的查询。
- 分析慢速查询的执行计划。
- 在数据库参数组中为资源密集型查询增加最大并行度 (MAXDOP)。
有关更多信息,请参阅如何对我的 Amazon RDS for SQL Server 实例上的高 CPU 利用率问题进行故障排除?
识别并解决死锁或会话受阻的问题
如果您遇到死锁或会话受阻的问题,请执行以下操作。
运行以下查询以识别受阻的会话和死锁:
— Information about the blocked session select DB_NAME(r.database_id) AS DatabaseName, r.session_id AS BlockedSPID, s.login_name AS BlockedLogin, s.host_name AS BlockedHost, r.command, wt.wait_type, wt.wait_duration_ms, r.wait_resource, BlockedSQL.text AS BlockedQueryText, r.blocking_session_id AS BlockingSPID, bs.login_name AS BlockingLogin, bs.host_name AS BlockingHost FROM sys.dm_exec_requests AS r INNER JOIN sys.dm_exec_sessions AS s ON r.session_id = s.session_id INNER JOIN sys.dm_os_waiting_tasks AS wt ON r.session_id = wt.session_id INNER JOIN sys.dm_exec_sessions AS bs ON r.blocking_session_id = bs.session_id LEFT JOIN sys.dm_exec_requests AS br ON r.blocking_session_id = br.session_id CROSS APPLY sys.dm_exec_sql_text(r.sql_handle) AS BlockedSQL OUTER APPLY sys.dm_exec_sql_text(br.sql_handle) AS BlockingSQL WHERE r.blocking_session_id <> 0;
识别出受阻的会话后,分析 system_health 扩展事件会话中的死锁图。然后,确定导致死锁的资源和查询。要从 system_health 会话中检索死锁信息,请参阅如何捕获在 SQL Server 上运行的 Amazon RDS 数据库实例上的死锁信息?
为减少死锁,请执行以下操作:
- 优化事务隔离级别。
- 验证跨事务对资源的访问顺序是否一致。
- 最大限度地缩短事务持续时间和资源保持时间。
- 使用适当的索引来减少锁争用。
解决磁盘操作缓慢的问题
如果您遇到磁盘读取或写入操作缓慢的问题,请执行以下操作:
- 在 CloudWatch 中监控磁盘 I/O 指标。
- 优化查询以减少不必要的 I/O 操作。
- 使用只读副本将读取流量从主数据库实例分流出去。
解决工作负载之间的资源争用问题
如果您在 RDS for SQL Server 企业版中遇到工作负载之间的资源争用问题,请激活资源调控器。
注意: 资源调控器功能仅在 SQL Server 企业版中可用。
激活资源调控器后,完成以下步骤:
- 创建或修改选项组,然后将资源调控器添加到该选项组。
- 配置您的工作负载组和资源池,为不同的应用程序需求设置 CPU 和内存配额。
- 将选项组与您的数据库实例关联,实现关键和非关键工作负载之间的精细化资源控制。
有关更多信息,请参阅在 Amazon RDS for SQL Server 上使用资源调控器优化数据库性能。
实施最佳实践来管理您的 RDS for SQL Server 工作负载
请执行以下操作:
- 使用数据库洞察和 CloudWatch 定期审查 CPUUtilization、DatabaseConnections 和 FreeStorageSpace 等指标。
- 创建 CloudWatch 警报以识别 CPU 利用率的峰值。
- 在达到容量配额之前增加分配的存储空间。
- 在数据库洞察中创建自定义小组件以监控特定指标,例如死锁。
注意: 创建新的死锁监控小组件时,搜索 deadlock(死锁)。然后,选择 Number of deadlocks total(死锁总数)指标。 - 审查并修改数据库实例类型以满足您的性能要求。
- 识别趋势并在潜在问题变得严重之前予以解决。
- 分析数据库负载以识别影响性能的 SQL 查询问题。
- 在数据库洞察中分析等待事件,识别数据库操作中的性能瓶颈。
相关信息
Microsoft 网站上的 Deadlocks guide(死锁指南)。
