经常听见用户说自己的rds实例cpu超过100%,通常这种情况都是由于sql性能问题导致的,下面我用一则案例来分析:
用户实例zuowenwang反映cpu超过100%,实例偶尔出现卡住的现象;
1.原理:cpu消耗过大通常情况下都是有慢sql造成的,这里的慢sql包括全表扫描,扫描数据量过大,内存排序,磁盘排序,锁争用等待等;
2.表现现象sql执行状态为:sending data,Copying to tmp table,Copying to tmp table on disk,Sorting result,locked;
3.解决方法:用户可以登录到rds,通过show processlist查看当前正在执行的sql,当执行完show processlist后出现大量的语句,通常其状态出现sending data,Copying to tmp table,Copying to tmp table on disk,Sorting result, Using filesort 都是sql有性能问题;
A.sending data表示:sql正在从表中查询数据,如果查询条件没有适当的索引,则会导致sql执行时间过长;
B.Copying to tmp table on disk:出现这种状态,通常情况下是由于临时结果集太大,超过了数据库规定的临时内存大小,需要拷贝临时结果集到磁盘上,这个时候需要用户对sql进行优化;
C.Sorting result, Using filesort:出现这种状态,表示sql正在执行排序操作,排序操作都会引起较多的cpu消耗,通常的优化方法会添加适当的索引来消除排序,或者缩小排序的结果集;
通过show processlist发现如下sql:
Sql A.
| 2815961 | sanwenba | 10.241.142.197:55190 | sanwenba | Query | 0 | Sorting RESULT |
SELECT z.aid,z.subject FROM www_zuowen z RIGHT JOIN www_zuowenaddviews za ON za.aid=z.aid
ORDER BY za.viewnum DESC LIMIT 10;
性能sql:
SELECT z.aid,z.subject FROM www_zuowen z RIGHT JOIN www_zuowenaddviews za ON za.aid=z.aid
ORDER BY za.viewnum DESC LIMIT 10;
用explain 查看执行计划:
sanwenba@3018 10:00:54>explain SELECT z.aid,z.subject FROM www_zuowen z
RIGHT JOIN www_zuowenaddviews za ON za.aid=z.aid ORDER BY&nbs

当RDS实例CPU超过100%,通常是由于SQL性能问题引起。本文通过一个案例,分析了如全表扫描、排序和锁争用等因素导致的CPU消耗,并提供了通过show processlist检查SQL,以及优化SQL(如添加索引、调整查询方式)的方法。优化SQL执行计划是提高性能的关键,例如避免Order By Rand()的随机查询,转而采用更高效的查询策略,以减少资源消耗,提高系统响应速度。

最低0.47元/天 解锁文章
52

被折叠的 条评论
为什么被折叠?



