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

微信公众号:运维开发故事

作者:老郑

问题描述

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

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

依赖信息:

  1. mysql-jdbc 8.0.24

  2. druid 1.2.8

  3. mybatis 3.4.6

环境配置信息

  1. druid 配置,全部都是默认值

  2. 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. 找到该线程的创建的地方 NativeSession

图片

  1. 引用关系如下

图片

image.png

  1. 什么时候启动 enableQueryTimeouts = true

图片

image.png

  1. 默认值是 true

图片

image.png

  1. startQueryTime 的调用方 StatementImpl 的 executeQuery

图片

image.png

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

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

处理方案

  1. 项目使用的是使用 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

  1. 并且去掉 mybatis defalutStatemnetTimeOut 参数

图片

image.png

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

图片

image.png

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

图片

image.png

复现和修复

测试代码

  • PushCallbackService.java

  • CallbackLog.java

  • DBTimerController.java

  • MccClient.java

修复效果
现象 MySQL Statement Cancellation Timer的线程不再产生
图片thread dump 分析工具地址:https://fastthread.io/

参考资料

  • https://segmentfault.com/a/1190000020162800

  • https://dev.mysql.com/doc/refman/5.7/en/server-system-variables.html#sysvar_wait_timeout

最后,求关注。如果你还想看更多优质原创文章,欢迎关注我们的公众号「运维开发故事」。

如果我的文章对你有所帮助,还请帮忙点赞、在看、转发一下,你的支持会激励我输出更高质量的文章,非常感谢!

你还可以把我的公众号设为「星标」,这样当公众号文章更新时,你会在第一时间收到推送消息,避免错过我的文章更新。


我是 老郑,《运维开发故事》公众号团队中的一员,资深 Java 架构师,10 余年 Java 互联网项目开发经验,擅长高并发、低延迟分布式交易系统研发。这里不仅有硬核的技术干货,还有我们对技术的思考和感悟,欢迎关注我们的公众号,期待和你一起成长!

本文使用 文章同步助手 同步

  • 18
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
PHY echo cancellation是指物理层回声消除技术。回声消除的目标是消除通信中产生的回声,以便保证语音或据的质量。回声产生的原因是传输路径中的信号被反射回来,造成与原始信号重叠的回声信号。回声消除通过识别回声信号并将其从接收信号中减掉,从而恢复原始信号。 在PHY层,回声消除通常使用算法来计算回声路径的延迟,并将延迟后的回声信号与接收信号进行相消。这样可以减少回声信号的影响,使接收到的信号更加清晰。 需要注意的是,PHY echo cancellation的具体实现可能会因不同的通信系统、硬件设备和算法而有所不同。因此,具体的实现策略和算法可能会根据不同的应用而有所差异。总的来说,PHY echo cancellation是一种用于减少通信中回声影响的技术,可以提高通信的质量和可靠性。<span class="em">1</span><span class="em">2</span> #### 引用[.reference_title] - *1* [回声消除(Echo Cancellation)理解](https://blog.csdn.net/weixin_43704402/article/details/115250279)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* [FBMC and GFDM Interference Cancellation Schemes for FDR PHY Design](https://download.csdn.net/download/weixin_43870101/12399523)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值