线上业务高峰期 CPU 飙升,抓取 thread dump 发现 MySQL Statement Cancellation Timer 的线程数比较多,接收到线上预警,分析一下原因。 业务高峰:
下面是一些可能相关的信息( mysql 驱动,db 连接池,orm 框架)
依赖信息:
@Bean
public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception {
SqlSessionFactoryBean factory = new SqlSessionFactoryBean();
factory.setVfs(SpringBootVFS.class);
factory.setDataSource(dataSource);
//todo 省略其他配置
Configuration c = new Configuration();
c.setLogImpl(StdOutImpl.class);
c.setDefaultStatementTimeout(25000);
factory.setConfiguration(c);
return factory.getObject();
}
image.png
image.png
image.png
image.png
方法调用如下:com.mysql.cj.CancelQueryTaskImpl#run
参考:https://github.com/alibaba/druid/wiki/DruidDataSource%E9%85%8D%E7%BD%AE%E5%B1%9E%E6%80%A7%E5%88%97%E8%A1%A8 调用的是 setQueryTimeOut 方法,然后传给 timeOutInMills
如果需要取消 CancelQueryTask 需要将 validationQueryTimeout 设置为 0
image.png
# 分别查看全局、会话变量值
show global VARIABLES like '%timeout%';
show VARIABLES like '%timeout%';
image.png
image.png
测试代码
修复效果 现象 MySQL Statement Cancellation Timer的线程不再产生
thread dump 分析工具地址:https://fastthread.io/