案例分析1: 用户反馈系统严重卡顿,后台日志提示Broken Pipe,数据库CPU飙升至80%
背景
下午3点,用户反馈系统严重卡顿,后台日志提示Broken Pipe,数据库CPU达80%,重启服务之后,不到10分钟,还是会出现同样的情况,系统无法使用,阻塞用户日常工作,用户抱怨声音很大,要求立刻解决.
过程
下午3:30,我连上生产环境的DB,执行show full processlist语句,查看当前线程处理情况,定位到Command列,发现有一条SQL一直处理Query的状态,于是将该条记录的info列中的SQL语句拿出来,发现原来是在查询项目阶段点的表,脑子飞速运转,这张表的数据估计也就是在3000条左右,查询条件我记得也是有索引的,除非某个表出现了锁定的情况.
验证一: 查询数据库锁表的情况.
验证二:explain 是否索引没有被命中.
验证三:是否数据量突然达到单表容量(500万).
针对验证一: 我个人经常使用information_schema数据库下的,表INNODB_TRX,INNODB_LOCKS,INNODB_LOCK_WAITS,三张表来进行定位.
-- 当前运行的所有事务
SELECT * FROM information_schema.INNODB_TRX;
关键字段说明: trx_state:事务状态,有以下几种状态:RUNNING、LOCK WAIT、ROLLING BACK 和 COMMIT