当前位置: 首页 > 科技观察

阿里云面试官:如果MySQL导致的CPU消耗过高,你会怎么优化?

时间:2023-03-21 15:42:21 科技观察

Category谁在消耗cpu?谁是罪魁祸首?用户IO等待有影响如何降低CPU消耗?减少等待,减少计算,升级cpu谁在消耗cpu?用户+系统+IO等待+软硬中断+空闲的罪魁祸首是谁?用户空间CPU消耗,各种逻辑操作正在进行大量的tps函数/排序/类型转换/逻辑IO访问...用户空间消耗大量cpu,产生了哪些系统调用?那些函数使用了cpu周期?IO等待IO请求这时候CPU其实是空闲的,比如vmstat中的wa很高。但是IO等待增加,wa不一定增加(请求I/O后等待响应,但是进程被移出核心),影响了用户,IO等待消耗了大部分cpu。吞吐量下降(tps),??查询响应时间增加。慢查询数量的增加,也会对mysql的并发产生有吸引力的影响。如何降低CPU消耗?减少等待减少IOSQL/索引量,使用合适的索引减少扫描行数(需要平衡索引的正收益和维护成本,空间换时间)提高IO处理能力增加缓存/增加磁盘/SSD减少计算减少逻辑运算避免使用函数和转移操作到易于扩展的应用服务器,例如substr等字符操作,dateadd/datesub,abs等日期操作数学函数减少排序,使用索引获取有序数据或避免不必要的排序,比如unionall代替union,orderbyindexfields等。禁止类型转换,使用合适的类型,保证传入的参数类型和数据库字段类型绝对一致,比如numbers使用tiny/int/bigint等,必须转换的在应用中先转换为简单类型再传入数据库,尽量避免复杂类型,减少复杂类型带来的额外操作。更小的数据类型占用更少的磁盘、内存、cpu缓存和cpu周期....减少逻辑IO索引量,优化索引,减少不必要的表扫描,如添加索引、调整复合索引字段的顺序、删除选择性差索引字段等表,拆分合理,适度冗余。例如,将很少使用的大字段拆分成独立的表,而非常频繁的小字段对“引用表”SQL来说是多余的,调整SQL的写法,充分利用已有的Index,避免不必要的扫描、排序等操作,减少复杂度joins,reducingorderby,尽量unionall,避免子查询等其他数据类型,用够就好,减少不必要的使用tinyint等大字段就够了,不要总是int,int够用也不要老bigint、date就够了,不要总是timestamp....减少查询请求量(不是数据库本身)适当缓存,降低缓存数据的粒度,适当缓存静态和频繁请求的数据,比如用户信息、商品信息等优化实现,尽量去掉不必要的重复请求,比如禁止多次重复请求同一个页面的同一个数据,传递跨页参数减少访问和其他合理的需求,评估需求产出比,比较输出去掉最底层的需求是合理的。。。如果cpu升级减少计算减少等待后不能满足需求,则cpu使用率还是很高的。CPU太多?低延迟(快速响应),需要更快的CPU(每个查询只能使用一个CPU)高吞吐量,同时运行许多查询,可以从多个CPU处理查询中获益