阿里云 RDS MySQL CPU 使用率持续 100% 通常由慢 SQL 或缺少索引引起,优先通过控制台性能洞察定位高消耗语句。紧急情况下可临时升级配置止血,但修改索引或 SQL 需在业务低峰期操作以避免锁表风险。
先说结论:阿里云 RDS MySQL CPU 满载绝大多数情况是数据库层面计算资源不足,核心解决路径是找到消耗 CPU 最高的 SQL 并进行优化。
- 先定位:登录阿里云控制台,使用性能洞察查看 CPU 占用最高的 SQL 语句。
- 先做:针对全表扫描或缺少索引的 SQL 添加索引,或优化查询逻辑。
- 再验证:观察云监控 CPU 使用率曲线是否下降,确认业务响应时间恢复正常。
快速处理思路
RDS 为托管服务,无法直接登录操作系统排查进程,需通过控制台和 SQL 命令配合处理。
紧急止血:在控制台实例详情页点击"升级配置",临时增加 CPU 核数,适用于业务不能中断且无法立即优化 SQL 的场景。
会话查看:通过 DMS 或客户端连接数据库,执行 SHOW PROCESSLIST; 查看当前活跃会话,识别状态为 Sending data 或 Sorting result 的长耗时查询。
日志分析:在控制台开启慢查询日志,设置阈值(如 1 秒),下载日志文件分析执行频率高的慢 SQL。
为什么会这样
CPU 使用率 100% 表示数据库实例的计算资源已被完全占用,无法及时处理新的请求队列。
常见原因包括全表扫描导致大量数据读取、复杂关联查询消耗过多计算力、高并发短连接频繁建立销毁、或后台系统任务(如备份、统计信息收集)占用资源。阿里云 RDS 实例规格固定,当 SQL 执行计划效率低下时,少量并发即可打满 CPU。
分步处理
第一步:确认监控数据
登录阿里云控制台,进入云监控页面,确认 CPU 使用率曲线是持续峰值还是间歇 spikes。持续 100% 通常意味着存在长期运行的慢查询或死锁。
第二步:使用性能洞察
在 RDS 控制台左侧菜单选择"性能洞察",查看"SQL 统计"。按 CPU 消耗排序,找到 Top 1 的 SQL 语句。记录该 SQL 的查询指纹和执行次数。
第三步:分析执行计划
复制高消耗 SQL,在测试环境或只读实例上执行 EXPLAIN <SQL 语句>;。检查 type 字段,若显示 ALL 则表示全表扫描,需优化索引。检查 key 字段,若为 NULL 表示未命中索引。
第四步:实施优化
根据 EXPLAIN 结果添加缺失索引,使用 ALTER TABLE table_name ADD INDEX index_name (column_name);。若无法加索引,考虑重写 SQL 避免 SELECT * 或减少 JOIN 表数量。
怎么验证是否生效
优化操作完成后,回到云监控页面观察 CPU 使用率曲线,确认峰值是否回落至安全水位(如 80% 以下)。
在性能洞察中刷新 SQL 统计,确认原高消耗 SQL 的平均执行耗时(RT)是否降低。通过业务端验证页面加载速度或接口响应时间是否恢复。
常见坑
避免业务高峰期加索引:大表添加索引会触发表锁或消耗大量 IO,可能导致 CPU 进一步飙升甚至实例不可用,务必在低峰期操作。
不要盲目重启实例:重启只能暂时清空会话,若 SQL 未优化,重启后流量进来 CPU 会再次打满,且重启会导致连接中断。
注意只读实例延迟:若将读流量切换到只读实例,需监控只读实例的同步延迟,避免查到旧数据。
常见问题
CPU 100% 可以直接重启实例吗?
不建议作为首选方案。重启会导致所有连接断开,业务中断,且若根本原因未解决,重启后 CPU 会再次满载。
升级配置能永久解决问题吗?
不能。升级配置只是增加资源上限,若 SQL 效率低,随着数据量增长 CPU 仍会再次打满,核心仍是优化 SQL。
如何区分是系统事件还是 SQL 问题?
查看性能洞察中的"系统事件"标签,若 CPU 高点 correlate 与备份时间一致,则为系统事件;若 correlate 与业务高峰一致,则为 SQL 问题。
参考来源
阿里云帮助中心 - 云数据库 RDS MySQL 版 - 性能洞察
URL: https://help.aliyun.com/product/26036.html
阿里云帮助中心 - 云数据库 RDS MySQL 版 - 慢查询日志
URL: https://help.aliyun.com/product/26036.html