一般是谁在消耗CPU?
用户+系统+IO等待+软硬中断+空闲
其中系统和软硬中断这两部分是比较难被改变的
- 用户
用户空间CPU消耗,各种逻辑运算
(正在进行大量tps,函数/排序/类型转换/逻辑IO访问…)
-
IO等待
等待IO请求的完成
(此时CPU实际上很空闲)
- 用户和IO等待消耗了大部分cpu
- 吞吐量下降
- 查询响应时间增加
- 慢查询数增加
- 对mysql的并发陡增,也会产生上诉影响
如何减少CPU消耗?
减少等待
-
减少IO量:
SQL/index,使用合适的索引减少扫描的行数(空间换时间)
-
提升IO处理能力:
加cache/加磁盘
减少计算
-
减少逻辑运算量
避免使用函数
减少排序:利用索引取得有序数据或避免不必要的排序,如union all代替union,order by索引字段等
禁止类型转换:使用合适类型并保证传入参数类型与数据库字段类型绝对一致
简单类型:尽量避免复杂类型,降低由于复杂类型带来的附加运算。更小的数据类型占用更少的磁盘、内存、cpu缓存和cpu周期 -
减小逻辑IO量
index:优化索引,减小不必要的表扫描,调整组合索引字段顺序,去除选择性很差的索引字段等
table:合理拆分,适度冗余,如将很少使用的大字段拆分到独立表,非常频繁的小字段冗余到引用表
SQL:调整SQL语法,充分利用现有索引,避免不必要的扫描,排序及其他操作。如减少复杂join,减少order by,尽量union all,避免子查询
数据类型:够用就好 -
减小query请求量
适当缓存:降低缓存数据粒度,对静态并被频繁请求的数据进行适当的缓存,如用户信息,商品信息等
优化实现:尽量去除不必要的重复请求 如禁止同一页面多次重复请求相同数据的问题,通过跨页面参数传递减少访问等
合理需求:评估需求产出比,对产出比极端低下的需求合理去除