我的 Amazon Relational Database Service (Amazon RDS) for MySQL、MariaDB、Amazon Aurora for MySQL 实例上的 CPU 使用率很高。我该如何排查并解决高 CPU 使用率的问题?

有多种因素可能会导致 CPU 使用率增加。例如,用户启动的繁重工作负载、分析查询、长时间的死锁和锁定等待、多个并发事务、长时间运行的事务或占用 CPU 资源的其他进程。

首先,您可以通过以下方式识别 CPU 使用率的产生原因:

  • 使用增强监控
  • 使用性能详情
  • 使用查询来检测工作负载中 CPU 使用率的产生原因
  • 分析日志并启用监控

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

使用增强监控

增强监控提供了精细的实时指标,您可以将这些指标作为每分钟提供统计信息的 Amazon CloudWatch 指标的补充信息进行查看。有关更多信息,请参阅 CloudWatch 指标与增强监控指标的区别

在增强监控的 operating system (OS) process list (操作系统 [OS] 进程列表) 部分中,查看 OS processes (操作系统进程)RDS processes (RDS 进程),以确认 mysqld 或 Aurora 进程的 CPU 使用率百分比。这些指标可以帮助您确认 CPU 使用率的增加是源自操作系统进程还是 RDS 进程。您还可以使用这些指标来确认 CPU 使用率的增加是源自 mysqld 还是 Aurora,这可指明用户启动的工作负载是促使 CPU 使用率增加的原因。有关更多信息,请参阅查看增强监控。您还可以通过查看 cpuUtilization 的指标来查看 CPU 使用率的分枝信息。有关更多信息,请参阅可用操作系统指标

您还可以检查未使用的任务(休眠任务)数量。这些任务可能会导致内存资源(RAM、缓存和处理器)的用量增加,进而拖慢服务器的速度。最佳实践是调整应用程序,以合理地关闭未使用的连接。您还可以修改 wait_timeoutinteractive_timeout 参数的值,以根据您设置的值关闭连接。有关更多信息,请参阅 MySQL 文档中的 wait_timeoutinteractive_timeout

使用性能详情

您可以使用性能详情来识别在实例上运行且导致高 CPU 使用率的确切查询。首先,启用适用于 MySQL 的性能详情。然后,您可以在咨询 DBA 后使用性能详情来优化工作负载。

要查看哪些数据库引擎可与性能详情一起使用,请参阅使用 Amazon RDS 性能详情

使用查询来检测工作负载中 CPU 使用率的产生原因

在优化工作负载之前,必须确定有问题的查询。您可以在发生高 CPU 使用率问题时运行以下查询,以确定 CPU 使用率的根本原因。然后,您可以优化工作负载以降低 CPU 使用率。

SHOW PROCESSLIST 命令会显示当前在 MySQL 实例上运行的线程。有时,同一组语句正在运行但未完成。发生这种情况时,后续语句必须等待第一组语句完成,因为 InnoDB 行级锁定可能正在更新相同的行。有关更多信息,请参阅 MySQL 文档中的 SHOW PROCESSLIST 语法

SHOW FULL PROCESSLIST;

注意:请以主用户身份运行 SHOW PROCESSLIST 查询。如果您不是主用户,则运行该命令的 MySQL 用户必须具有 MySQL PROCESS 服务器管理权限才能查看在 MySQL 实例上运行的所有线程。如果没有管理员权限,SHOW PROCESSLIST 只会显示与您正在使用的 MySQL 账户关联的线程。

INNODB_TRX 表提供有关当前正在执行且并非只读事务的 InnoDB 事务的信息。有关更多信息,请参阅 MySQL 文档中的 INFORMATION_SCHEMA INNODB_TRX 表

SELECT * FROM INFORMATION_SCHEMA.INNODB_TRX;

INNODB_LOCKS 表提供有关 InnoDB 事务已请求但尚未收到的锁的信息。有关更多信息,请参阅 MySQL 文档中的 INFORMATION_SCHEMA INNODB_LOCKS 表

SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCKS;

INNODB_LOCK_WAITS 表针对每个被阻止的 InnoDB 事务提供一个或多个行。有关更多信息,请参阅 MySQL 文档中的 INFORMATION_SCHEMA INNODB_LOCK_WAITS 表

SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCK_WAITS;

您可以运行类似于以下内容的查询,以帮助您查看哪些事务正在等待以及哪些事务正在阻止等待事务。有关更多信息,请参阅 MySQL 文档中的使用 InnoDB 事务和锁定信息

SELECT
  r.trx_id waiting_trx_id,
  r.trx_mysql_thread_id waiting_thread,
  r.trx_query waiting_query,
  b.trx_id blocking_trx_id,
  b.trx_mysql_thread_id blocking_thread,
  b.trx_query blocking_query
FROM       information_schema.innodb_lock_waits w
INNER JOIN information_schema.innodb_trx b
  ON b.trx_id = w.blocking_trx_id
INNER JOIN information_schema.innodb_trx r
  ON r.trx_id = w.requesting_trx_id;

SHOW ENGINE INNODB STATUS 查询提供来自标准 InnoDB 监视器的关于 InnoDB 存储引擎状态的信息。有关更多信息,请参阅 MySQL 文档中的 SHOW ENGINE 语法

SHOW ENGINE INNODB STATUS;

SHOW GLOBAL SESSION STATUS 提供有关服务器状态的信息。有关更多信息,请参阅 MySQL 文档中的 SHOW STATUS 语法

SHOW GLOBAL STATUS;

注意:这些查询已经在 Aurora 2.02.5 (MySQL 5.7)、Aurora 1.17.8 (MySQL 5.6)、MySQL 5.6.x 和 5.7.x 以及 MariaDB 10.0.x、10.1.x、10.2.x 上进行了测试。

分析日志并启用监控

您可以分析 MySQL 常规查询日志以查看 mysqld 在特定时间执行的操作。您还可以查看特定时间在实例上运行的查询,包括有关客户端何时连接或断开连接的信息。有关更多信息,请参阅 MySQL 文档中的常规查询日志

注意:如果长时间启用常规查询日志,日志会占用存储空间,并会增加性能开销。

分析 MySQL 慢速查询日志,查找执行时间超过 long_query_time 所设置的秒数的查询。您还可以查看工作负载并分析查询以提高性能并减少内存占用。有关更多信息,请参阅 MySQL 文档中的慢速查询日志

提示:在使用慢速查询日志或常规查询日志时,请将参数 log_output 设置为 FILE

您还可以使用 MariaDB 审计插件来审计数据库活动,例如登录到数据库的用户或针对数据库运行的查询。有关更多信息,请参阅 MariaDB 审计插件支持

如果您使用的是 Aurora for MySQL,则还可使用高级审计。审计可以让您更好地控制要记录的查询类型,并降低日志记录的开销。

您可以使用 innodb_print_all_deadlocks 参数来检查死锁和资源锁定。您可以使用此参数在 MySQL 错误日志中记录有关 InnoDB 用户事务中死锁的信息。有关更多信息,请参阅 MySQL 文档中的innodb_print_all_deadlocks

分析和优化高 CPU 工作负载

确定导致 CPU 使用率增加的查询后,您可以优化工作负载以减少 CPU 消耗量。

如果您发现工作负载并不需要的查询,可以使用以下命令终止连接(强制终止查询):

CALL mysql.rds_kill(processID);

您可以通过运行 SHOW FULL PROCESSLIST 命令来查明查询的 processID。

如果您不想强制终止查询,可以使用 EXPLAIN 来优化查询。其中显示了查询执行中涉及的各个步骤。有关更多信息,请参阅 MySQL 文档中的使用 EXPLAIN 优化查询

启用 PROFILING 可查看配置文件详细信息,这些详细信息可指示当前会话期间执行的语句的资源使用情况。有关更多信息,请参阅 MySQL 文档中的 PROFILING 语法

使用 ANALYZE TABLE 可刷新表的索引统计信息。这有助于优化程序选择适当的执行计划。有关更多信息,请参阅 MySQL 文档中的 ANALYZE TABLE 语法


此页内容对您是否有帮助? |

返回 AWS Support 知识中心

需要帮助? 请访问 AWS Support 中心

发布时间:2019 年 2 月 26 日