自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

高并發(fā)下 MySQL Statement Cancellation Timer 的線程數(shù)暴漲

數(shù)據(jù)庫(kù) MySQL
線上業(yè)務(wù)高峰期 CPU 飆升,抓取 thread dump 發(fā)現(xiàn) MySQL Statement Cancellation Timer 的線程數(shù)比較多,接收到線上預(yù)警,分析一下原因。

問題描述

線上業(yè)務(wù)高峰期 CPU 飆升,抓取 thread dump 發(fā)現(xiàn) MySQL Statement Cancellation Timer 的線程數(shù)比較多,接收到線上預(yù)警,分析一下原因。業(yè)務(wù)高峰:

圖片圖片

下面是一些可能相關(guān)的信息( mysql 驅(qū)動(dòng),db 連接池,orm 框架)

依賴信息:

  1. mysql-jdbc 8.0.24
  2. druid 1.2.8
  3. mybatis 3.4.6

環(huán)境配置信息

  1. druid 配置,全部都是默認(rèn)值
  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();
}

發(fā)生過程分析

  1. 找到該線程的創(chuàng)建的地方 NativeSession

圖片圖片

  1. 引用關(guān)系如下

圖片圖片

  1. 什么時(shí)候啟動(dòng) enableQueryTimeouts = true

圖片圖片

  1. 默認(rèn)值是 true

圖片圖片

  1. startQueryTime 的調(diào)用方 StatementImpl 的 executeQuery

圖片圖片

  1. 可以發(fā)現(xiàn) timeOutInMillis 不為 0 的情況下,并且 enableQueryTimeouts = true 就會(huì)創(chuàng)建 CanalQueryTask 然后如果超時(shí)就會(huì)自動(dòng)調(diào)度

方法調(diào)用如下:com.mysql.cj.CancelQueryTaskImpl#run

圖片圖片

處理方案

  1. 項(xiàng)目使用的是使用 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調(diào)用的是 setQueryTimeOut 方法,然后傳給 timeOutInMills

圖片圖片

如果需要取消 CancelQueryTask 需要將 validationQueryTimeout 設(shè)置為 0

  1. 并且去掉 mybatis defalutStatemnetTimeOut 參數(shù)

圖片圖片

  1. 如果這些都去掉可以通過 mysql  服務(wù)端 collection timeout 配置處理

mysql 服務(wù)器會(huì)有一個(gè)參數(shù) wait_timeout:mysql server 關(guān)閉連接之前,允許連接閑置多少秒。默認(rèn)是 28800,單位秒,即 8 個(gè)小時(shí)。

# 分別查看全局、會(huì)話變量值
show global VARIABLES like '%timeout%';
show  VARIABLES like '%timeout%';

圖片圖片

  • druid 可以通過 testOnBorrow 和 testOnReturn、testWhileIdle分別在鏈接獲取,鏈接歸還的時(shí)候判斷是否有效。

圖片圖片

復(fù)現(xiàn)和修復(fù)

測(cè)試代碼

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

修復(fù)效果

現(xiàn)象 MySQL Statement Cancellation Timer的線程不再產(chǎn)生

圖片圖片

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
責(zé)任編輯:武曉燕 來源: 運(yùn)維開發(fā)故事
相關(guān)推薦

2014-08-08 13:30:44

Nginx

2013-01-30 10:12:24

NginxNginx優(yōu)化高并發(fā)

2024-11-26 07:29:57

高并發(fā)線程安全

2025-02-20 00:01:00

2019-10-30 16:54:08

golangredis數(shù)據(jù)庫(kù)

2022-06-12 06:45:26

高并發(fā)防重

2023-02-03 15:16:42

SpringHystrix

2025-02-26 08:20:18

2020-07-15 08:14:12

高并發(fā)

2017-11-27 08:50:29

架構(gòu)數(shù)據(jù)存儲(chǔ)

2019-11-08 08:40:29

Java高并發(fā)流量

2021-07-01 06:58:12

高并發(fā)訂單號(hào)SCM

2021-03-28 09:45:05

冪等性接口數(shù)據(jù)

2025-03-21 06:20:00

連接池系統(tǒng)數(shù)據(jù)庫(kù)

2020-09-23 22:36:27

分布式架構(gòu)系統(tǒng)

2023-06-25 08:05:09

MySQL事務(wù)并發(fā)

2021-07-29 08:13:05

高并發(fā)秒殺商品秒殺系統(tǒng)

2019-03-18 05:02:30

高并發(fā)京東架構(gòu)

2024-02-02 11:24:00

I/O高并發(fā)場(chǎng)景

2021-01-15 05:12:14

Java并發(fā)樂觀鎖
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)