240608-慢sql引发cpu飙高,应用死

162 阅读1分钟

背景

线上系统突然就死掉, top 查看负载超高,应用服务不得不进行重启缓解1-5分钟的生存机会。

环境

阿里云数据库 16c32g + 应用服务器8c16g

排查流程

  • 初步使用jstack进行线程数据抓取,获取部分消息,只得知应用在等待redis的锁。

    • 于是将部分使用redis锁的地方放开,问题仍旧。
    • 查询redis应用cpu 发现时不是到达100%, 大家都知redis是单线程内存任务执行,于是进行查询慢 redis慢sql redis-cli -a **** SLOWLOG GET 得到大量的big keys .大量的同时大批量写数据, 解决到big keys 问题仍在。cpu 还时不时的达到100% 。
    • 于是将自建单体redis 迁到阿里云 高可用集群模式下,问题仍在。
  • 经过上面的redis 的排查,基本上可以确定不是redis的问题。 于是只能排查mysql .使用的阿里云的云数据库mysql, 查看只能去它提供的看板上查看,在上面看到有慢sql ,看板做的真的是体验太差,也许是我不会看 强烈建议在程序中开启慢sql的打印

  • 在程序里开慢sql 打印后,有针对性的去解决每一条慢sql ,这样会相对应的程序节点,在哪里使用慢sql , 剩下的就是慢sql 的优化

  • 经过慢sql优化与 大表数据处理, 应用系统回到原来的平静。

# druid数据源开启慢sql
filter:  
stat:  
enabled: true  
# 慢SQL记录  
log-slow-sql: true  
slow-sql-millis: 1000  
merge-sql: true  
wall: