AWS RDS CPU 使用率持续 100% 如何排查锁等待问题?

文章导读
AWS RDS CPU 使用率持续 100% 且怀疑锁等待时,首选通过 Performance Insights 区分 CPU 消耗与锁等待事件。适用场景为 MySQL 或 PostgreSQL 引擎,风险在于强制终止会话可能触发事务回滚导致短暂 IO 飙升。
📋 目录
  1. 命令速用版
  2. 为什么会这样
  3. 分步处理
  4. 怎么验证是否生效
  5. 常见坑
  6. 常见问题
  7. 参考来源
A A

AWS RDS CPU 使用率持续 100% 且怀疑锁等待时,首选通过 Performance Insights 区分 CPU 消耗与锁等待事件。适用场景为 MySQL 或 PostgreSQL 引擎,风险在于强制终止会话可能触发事务回滚导致短暂 IO 飙升。

先说结论:CPU 满载通常由活跃查询导致,锁等待更多表现为连接堆积,两者并发时需优先定位持有锁且消耗 CPU 的会话。

  • 先确认:在 Performance Insights 中查看 Top SQL 是否伴随 lock 等待事件。
  • 先处理:优化持有锁的查询索引或终止阻塞源会话。
  • 再验证:观察 CloudWatch CPU 利用率与 Active Sessions 是否同步下降。

命令速用版

若无法立即访问 Performance Insights,可通过 SQL 直接查询当前锁状态。以下命令适用于 MySQL 兼容引擎:

SELECT * FROM information_schema.INNODB_TRX WHERE trx_state = 'LOCK WAIT';

SELECT blocking_locks.*, blocked_locks.* FROM information_schema.INNODB_LOCK_WAITS blocked_locks JOIN information_schema.INNODB_TRX blocking_locks ON blocked_locks.BLOCKING_TRX_ID = blocking_locks.trx_id;

为什么会这样

CPU 100% 代表活跃线程满载,而纯锁等待通常不消耗 CPU,两者同时出现意味着持有锁的查询正在执行高计算任务。

当多个事务竞争同一资源时,未获得锁的线程进入等待状态,这不直接消耗 CPU。但若持有锁的事务执行复杂计算、全表扫描或缺少索引,会导致 CPU 被占满且锁释放缓慢。此外,高并发下的自旋锁竞争也可能导致 CPU 使用率虚高。

分步处理

步骤 1:启用并查看 Performance Insights

AWS RDS CPU 使用率持续 100% 如何排查锁等待问题?

在 AWS 控制台打开 RDS 实例详情页,进入 Performance Insights 面板。确认 Top SQL 列表中是否有高负载查询,并检查等待事件(Wait Events)中是否包含 lock 相关指标,如 row_lock 或 txn_lock。

步骤 2:定位阻塞源

在 Performance Insights 中点击具体 SQL 条目,查看“等待事件”细分。若发现 lock 等待占比高,记录该 SQL 的会话 ID。若无 PI 权限,登录数据库执行SHOW ENGINE INNODB STATUS查看 LATEST DETECTED DEADLOCK 部分。

步骤 3:优化或终止会话

若查询可优化,立即添加缺失索引。若需紧急止血,使用KILL [session_id]终止阻塞会话。注意不要终止系统线程或正在回滚的大事务。

步骤 4:调整隔离级别(可选)

对于读多写少场景,考虑将事务隔离级别从 Repeatable Read 调整为 Read Committed,减少间隙锁竞争。此操作需评估业务一致性要求。

怎么验证是否生效

操作完成后,回到 CloudWatch 控制台查看 CPUUtilization 指标曲线。若处理有效,CPU 使用率应从高水位回落,且 Performance Insights 中的 Active Sessions 峰值降低。

AWS RDS CPU 使用率持续 100% 如何排查锁等待问题?

同时检查数据库错误日志,确认没有大量锁超时报错(Lock wait timeout exceeded)。若 CPU 下降但连接数仍高,说明锁等待已解除但连接池未释放,需重启应用连接池。

常见坑

误杀系统线程:KILL 命令前务必确认会话用户非系统账号,否则可能导致复制中断或监控失效。

回滚风暴:终止运行已久的大事务会触发回滚,回滚过程同样消耗 CPU 和 IO,可能加剧短暂拥堵。

忽略只读副本:若主库 CPU 高但锁等待少,检查是否因只读副本延迟导致主库保留旧版本数据过多,增加 Undo Log 压力。

常见问题

锁等待一定会导致 CPU 100% 吗?

不一定,纯锁等待通常导致连接数增加而非 CPU 飙升。

Performance Insights 是否额外收费?

默认免费层级有限,超出保留期或高级功能需额外付费,具体参考 AWS 定价页。

能否通过增加实例规格解决锁等待?

不能,增加 CPU 仅缓解计算压力,锁竞争需通过索引优化或事务拆分解决。

参考来源

  • AWS Documentation, "Using Amazon RDS Performance Insights", https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/USER_PerfInsights.html
  • MySQL Documentation, "InnoDB Locking", https://dev.mysql.com/doc/refman/8.0/en/innodb-locking.html
  • AWS Documentation, "Viewing Amazon CloudWatch metrics for Amazon RDS", https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/USER_Metrics.html