线上业务高峰期 CPU 飙升,高并抓取 thread dump 发现 MySQL Statement Cancellation Timer 的发下线程数比较多,接收到线上预警,线程分析一下原因。数暴业务高峰:
图片
下面是高并一些可能相关的信息( mysql 驱动,db 连接池,发下orm 框架)
依赖信息:
@Beanpublic 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();}
图片
图片
图片
图片
图片
方法调用如下: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
图片
mysql 服务器会有一个参数 wait_timeout:mysql server 关闭连接之前,允许连接闲置多少秒。线程默认是 28800,单位秒,即 8 个小时。
# 分别查看全局、会话变量值show global VARIABLES like '%timeout%';show VARIABLES like '%timeout%';
图片
图片
现象 MySQL Statement Cancellation Timer的线程不再产生
图片
thread dump 分析工具地址:https://fastthread.io/
(责任编辑:综合)
皇朝家居(01198.HK)发布公告:年度归母净利同比下降89.2%
节能元件(08231.HK)年度由亏转盈64.6万美元 每股盈利0.04美仙