如何排查我的 RDS for SQL Server 实例上的高 CPU 使用率问题?

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

对于 Microsoft SQL Server 数据库实例,我的 Amazon Relational Database Service (Amazon RDS) 上的 CPU 使用率很高。我该如何排查并解决高 CPU 使用率的问题?

简短描述

CPU 使用率增加的常见原因包括:

  • 用户发起的繁重工作负载、多个并发查询或长时间运行的事务
  • 为工作负载使用预置不足的实例类
  • 过时的统计数据和索引碎片或缺少索引
  • 有改进余地的查询
  • 阻塞和死锁
  • 并行性
  • 频繁的编译和重新编译
  • 参数嗅探
  • 线程耗尽

要确定 Amazon RDS for SQL Server 实例中 CPU 使用率的来源,请使用以下工具:

  • Amazon RDS 的 Amazon CloudWatch 指标
  • 增强监控
  • Performance Insights
  • SQL Server 原生工具

在确定产生原因之后,您可以分析和优化工作负载,以减少 CPU 使用率。

解决方法

Amazon RDS 的 Amazon CloudWatch 指标

您可以使用 CloudWatch 指标来确定长期的 CPU 模式。将 WriteIOPs、ReadIOPs、ReadThroughput 和 WriteThroughput 的图表与 CPU 利用率进行比较,以找到工作负载导致高 CPU 利用率的时间。有关更多信息,请参阅 Amazon RDS 的 Amazon CloudWatch 指标

如果您使用的是 t2 或 t3 实例类中的实例,请检查您的实例是否预置不足。如果您看到 CPU 积分余额持续减少,CPU 积分使用率持续增加,则您的 CPU 内核不足以应对工作负载。

确定时间范围后,您可以查看与数据库实例关联的增强监控数据。您可以将增强监控设置为每隔 1、5、10、15、30 或 60 秒收集一次数据。这样做让您可以在比 CloudWatch 更精细的级别收集数据。

增强监控

如果您已设置增强监控,则可以使用它来监控数据库实例上运行的操作系统。要使用增强监控来检查 CPU 使用率,请执行以下操作:

  1. RDS 控制台中,选择 Databases(数据库),然后选择您的数据库。
  2. Monitoring(监控)选项卡上,从Monitoring(监控)下拉菜单中选择 OS process list(操作系统进程列表)。验证高 CPU 是由操作系统、RDS 进程、SQL Server 进程还是 SQL 代理进程驱动的。您还可以检查这些进程使用的 CPU 百分比和内存百分比。
  3. Enhanced monitoring(增强监控)下拉列表中选择指标以检查性能监控器数据。这些指标包括 CPU 空闲时间、内核和用户。这些指标表明 CPU 的大部分时间是闲置、运行内核还是运行用户进程。
  4. 选择 Manage Graphs(管理图表)查看其他指标。然后,您可以选择与 I/O 和磁盘吞吐量相关的指标。这些指标包括读取/秒、写入/秒、读取 Kb/s 和写入 Kb/s。您还可以查看与内存相关的参数,包括可用内存、SQL Server 内存和总内存。这些指标很有用,因为如果您的 CPU 花费大量时间等待资源,就可能会看到 CPU 利用率很高。

有关更多信息,请参阅在 RDS 控制台中查看操作系统指标

    Performance Insights

    您可以使用 Amazon RDS 性能详情来识别造成数据库负载的查询。为此,

    1. 选中与要分析的时间范围相对应的 SQL 选项卡
    2. 确定耗时最长的查询。
    3. 检查资源密集型查询和在此期间观察到的等待事件。以下是经常与 CPU 利用率过高相关的等待事件:
      SOS_SCHEDULER_YIELD:此等待表示工作线程屈服于其他工作线程运行。较高的等待次数和较短的等待时间通常表示查询 CPU 受限。此处的等待时间过长可能是由屈服问题造成的。如果看到此处的等待时间很长,则必须进一步审查工作负载。
      如果 SOS_SCHEDULER_YIELD 是普遍的等待类型,则可能表明 CPU 压力是问题所在。审查工作负载类型并进行其他调整。
      CXPACKET 和 CXCONSUMER:与并行性相关的等待事件通常不是问题。但是,如果等待事件频繁发生并会影响性能,请审查查询并为并行性的成本阈值设置合适的值。确保 SQL Server 在参数组中选择成本较低的并行性参数。
      您还可以根据使用案例将查询或实例级别的 MAXDOP(最大并行度)提高到 1。
      ThreadPool:此等待事件表示线程耗尽。如果您的实例类能够处理此问题,请增加最大工作线程数参数。由于使用过多的线程,可能会发生 ThreadPool 等待。由于阻塞、高工作负载或大量并行查询,会使用过多的线程。或者,这种等待可能是由最大工作线程数参数的配置错误引起的。
    4. 查看数据库指标以了解批量请求、SQL 编译和 SQL 重新编译的次数。检查查询是否被多次编译,这表明存在临时的查询。还要检查是否频繁为给定批次重新编译查询,这表明在查询代码中使用了 with recompile。这两者都会导致 CPU 使用率过高。

    SQL Server 原生工具

    CPU 故障排查的特定查询:有关更多信息,请参阅 Microsoft 文档网站上的 排查 SQL Server 中的高 CPU 使用率问题。重点关注 CPU 密集型查询、更新统计信息、缺失索引和参数嗅探。

    检查执行计划中是否存在性能不佳的查询,然后进行其他调整。 有关更多信息,请参阅 Microsoft 文档网站上的显示实际执行计划

    使用查询和扩展事件排查过度锁定、阻塞和死锁相关问题。 有关更多信息,请参阅 Microsoft 文档网站上的了解和解决 SQL Server 阻塞问题

    注意:在 RDS for SQL Server 中配置扩展事件时,不能使用普通方法保存 XEL 文件。有关如何配置扩展事件的说明,请参阅在 Amazon RDS for SQL Server 中设置扩展事件

    使用 SQL Server 报告可获得在 SQL Server 中原生提供的性能报告。 使用这些报告来微调您的工作负载。有关更多信息,请参阅 Microsoft 文档网站上的性能控制面板


    这篇文章对您有帮助吗?


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