高并发下 MySQL Statement Cancellation Timer 的线程数暴涨

应用开发2025-11-05 09:47:1341

问题描述

线上业务高峰期 CPU 飙升,高并抓取 thread dump 发现 MySQL Statement Cancellation Timer 的发下线程数比较多,接收到线上预警,线程分析一下原因。数暴业务高峰:

图片

下面是高并一些可能相关的信息( mysql 驱动,db 连接池,发下orm 框架)

依赖信息:

mysql-jdbc 8.0.24druid 1.2.8mybatis 3.4.6

环境配置信息

druid 配置,线程全部都是数暴默认值mybatis 配置: 复制@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(); }1.2.3.4.5.6.7.8.9.10.11.12.13.

发生过程分析

找到该线程的创建的免费信息发布网地方 NativeSession

图片

引用关系如下

图片

什么时候启动 enableQueryTimeouts = true

图片

默认值是 true

图片

startQueryTime 的调用方 StatementImpl 的 executeQuery

图片

可以发现 timeOutInMillis 不为 0 的情况下,并且 enableQueryTimeouts = true 就会创建 CanalQueryTask 然后如果超时就会自动调度

方法调用如下:com.mysql.cj.CancelQueryTaskImpl#run

图片

处理方案

项目使用的高并是使用 alibaba druid

图片

参考: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

并且去掉 mybatis defalutStatemnetTimeOut 参数

图片

如果这些都去掉可以通过 mysql  服务端 collection timeout 配置处理

mysql 服务器会有一个参数 wait_timeout:mysql server 关闭连接之前,发下允许连接闲置多少秒。源码下载线程默认是数暴 28800,单位秒,高并即 8 个小时。发下

复制# 分别查看全局、线程会话变量值 show global VARIABLES like %timeout%; show VARIABLES like %timeout%;1.2.3.

图片

druid 可以通过 testOnBorrow 和 testOnReturn、testWhileIdle分别在链接获取,链接归还的时候判断是否有效。

图片

复现和修复

测试代码

PushCallbackService.javaCallbackLog.javaDBTimerController.javaMccClient.java

修复效果

现象 MySQL Statement Cancellation Timer的线程不再产生

图片

thread dump 分析工具地址:https://fastthread.io/

参考资料

https://segmentfault.com/a/1190000020162800https://dev.mysql.com/doc/refman/5.7/en/server-system-variables.html#sysvar_wait_timeout云南idc服务商
本文地址:http://www.bzve.cn/news/639a9299268.html
版权声明

本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。

全站热门

TCL65X3(TCL65X3超高清电视)

如何设计一个端计算架构?

未来几年都能用的C/C++/Linux服务器开发高级架构体系

标星 1.3 k 的一个开源书籍,带你玩转 Go

以魅蓝Note6玩王者如何?(探索魅蓝Note6在王者荣耀游戏中的性能表现)

鸿蒙HiSpark Wi-Fi IoT开发套件试用02(开发环境)

阿里专家:技术Leader如何提升团队凝聚力?

一例 Go 编译器代码优化 bug 定位和修复解析

友情链接

滇ICP备2023006006号-39