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

2023年 8月 13日 12.2k 0

问题描述

在线上环境,出现高并发的场景下,MySQL Statement Cancellation Timer 的线程数比较多,接收到线上预警,分析一下原因。

下图为本地模拟环境,配置比较低,问题不突出,主要是示意一下。😏😏😏

image.png

以下是 mysql 驱动,连接池,orm 框架信息

依赖信息:

  • mysql-jdbc 8.0.24
  • druid 1.2.8
  • mybatis 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();
    }
    

    产生该线程分析

  • 找到该线程的创建的地方 NativeSession
  • 引用关系如下
  • 什么时候启动 enableQueryTimeouts = true
  • 默认值是 true
  • startQueryTime 的调用方 StatementImpl 的 executeQuery
  • 可以发现 timeOutInMillis 不为 0 的情况下,并且 enableQueryTimeouts = true 就会创建 CanalQueryTask 然后如果超时就会自动调度
  • 方法调用如下: com.mysql.cj.CancelQueryTaskImpl#run

    处理方案

  • 项目使用的是使用 alibaba druid
  • 参考:github.com/alibaba/dru…

    调用的是 setQueryTimeOut 方法,然后传给 timeOutInMills

    如果需要取消 CancelQueryTask 需要将 validationQueryTimeout 设置为 0

    2. 并且去掉 mybatis defalutStatemnetTimeOut 参数

  • 这些都去掉了这么来处理 mysql collection timeout
    • mysql 服务器会有一个参数 wait_timeout:mysql server 关闭连接之前,允许连接闲置多少秒。默认是 28800,单位秒,即 8 个小时。
    
        # 分别查看全局、会话变量值
        show global VARIABLES like '%timeout%';
        show  VARIABLES like '%timeout%';
    

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

    复现和修复

    测试代码

    • 📎PushCallbackService.java
    • 📎CallbackLog.java
    • 📎DBTimerController.java
    • 📎MccClient.java

    修复效果

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

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

    参考资料

    • segmentfault.com/a/119000002…
    • dev.mysql.com/doc/refman/…

    相关文章

    Oracle如何使用授予和撤销权限的语法和示例
    Awesome Project: 探索 MatrixOrigin 云原生分布式数据库
    下载丨66页PDF,云和恩墨技术通讯(2024年7月刊)
    社区版oceanbase安装
    Oracle 导出CSV工具-sqluldr2
    ETL数据集成丨快速将MySQL数据迁移至Doris数据库

    发布评论