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 实例详情页,进入 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 峰值降低。
同时检查数据库错误日志,确认没有大量锁超时报错(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