当前位置: 首页 > news >正文

【案例】常驻查询引发的thread pool 性能问题之一

问题现象
    线上某业务A的数据库版本MySQL 从5.5 升级到5.6 版本之后多次出现RT抖动的问题,其现象主要为:
    1 rt严重不稳定,部分query rt非常高。
    2 orzdba间歇性阻塞。

二 原理知识

    在MySQL Thread Pool根据参数thread_pool_size被分为若干个group,每个group维护client 发起的 connections,当MySQL建立 connection 时, MySQL 根据connection的thread id 对thread_pool_size取模,将connection 发起的sql 语句分配到对应的group。每个group的最大worker数量为thread_pool_oversubscribe+1。若worker达到最大数量后还是不足以处理回话请求,则连接在本group上等待,导致sql 语句的rt 增大。

三 问题分析
     目前线上的配置参数thread_pool_size为32,thread_pool_oversubscribe 为3 ,也即是ThreadPool共有32个group,每个group最多可容许4个worker。 但是业务A的场景中存在6个binlog dump任务和2个从库和1个日志抓取任务,因为COM_BINLOG_DUMP命令是个执行时间非常长的命令(可以理解为slow query),因此其长期持有worker。 当一个group被2个及以上COM_BINLOG_DUMP命令长期持有的时候,相对于其他group其处理能力会下降到其他group的1/2甚至1/4,最严重的会导致完全阻塞一个group。
Thread Pool本身没有存在group之间的均衡策略,因此新的连接还是会均匀的分配到所有的group上,当负载较大的时候,被COM_BINLOG_DUMP占有的group出现了严重的排队现象。
    在业务A场景中排队时间大约在10-30秒之间,因此有部分query的rt达到10-30秒;而大部分query还是被分配到正常的group上,其rt还是正常的。 根据观察,一般拥堵的group在1-2个之间,因此影响1/32 ~ 1/16的query .

四 验证
      根据以上的原理,为了更好的复现,将thread_pool_oversubscribe调整为2,即每个group有2个worker;同时将thread_pool_size调整为3.
通过锁表阻塞的方法模拟落在group 1的2个COM_BINLOG_DUMP,此时group 1只剩下1个worker,而group 0和group 2还剩在3个worker。
并发向mysql发送select sleep(2),来模拟业务
case 1
 
同一时间并发发起18个query。这时每个group分到6个query。因为g0和g2都有3个worker,因此这些query在4秒钟时处理完毕,但是g1只有1个worker,需要12秒

测试结果如下:符合预期


[root@rac1:/u01/test]$sh test_rt.sh  
Sun Oct 12 15:13:42 CST 2014

Sun Oct 12 15:13:42 CST 2014

Sun Oct 12 15:13:42 CST 2014

Sun Oct 12 15:13:42 CST 2014

Sun Oct 12 15:13:42 CST 2014

Sun Oct 12 15:13:42 CST 2014

Sun Oct 12 15:13:42 CST 2014

Sun Oct 12 15:13:44 CST 2014

Sun Oct 12 15:13:44 CST 2014

Sun Oct 12 15:13:44 CST 2014

Sun Oct 12 15:13:44 CST 2014

Sun Oct 12 15:13:44 CST 2014

Sun Oct 12 15:13:44 CST 2014

Sun Oct 12 15:13:44 CST 2014

Sun Oct 12 15:13:46 CST 2014

Sun Oct 12 15:13:48 CST 2014

Sun Oct 12 15:13:50 CST 2014

Sun Oct 12 15:13:52 CST 2014 

case 2:
     开始时发起6个query,以后每隔2秒并发发起3个query。 因为每个query本身耗时2秒,因此对于g0和g2完全能够处理这种并发,但是g1只有1个worker,因此永远都有一个query需要等待,所以被分配到g1上的query都需要等待2秒后才能被执行。
这个时候开启orzdba就会发现有1/3的概率被hang住2秒。线上出现的就是这种现象。

五 解决
1 系统层面 通过改大thread_pool_oversubscribe和thread_pool_size可以极大的减小这种现象的发生,但是不能完全的避免;
同时大量的常驻长连接是否合理(业务A中有9个拉binlog的连接常驻),也值得商榷(减少常驻连接也可以极大的减小这种现象的发生)。
2 源码设计层面:针对类似于binlogdump 的常驻链接存在很多优化点,针对binlogdump 这种长连接优化worker持有策略或者计数方式。

感谢 江疑 同学的详细分析。
test_rt.sh 脚本内容
   


#!/bin/bash 
function test()

{

    mysql.local -e \'select sleep(2)\' > /dev/null

    date

}



function r1()

{

    for i in {1..18}; 

    do 

        test &

    done

}



function r2()

{

    for i in {1..3}; 

    do 

        test &

    done

}



function r3()

{

    for i in {1..9000}; 

    do 

        r2

        sleep 2

    done

}



r1 

相关文章:

  • ASP.NET Core的身份认证框架IdentityServer4(6)- 开始
  • maven - pom.xml 聚合(父)工程 基本内容演示
  • service
  • 波特率时钟
  • HBase的一些关于CRUD方法
  • 自动化测试基础篇--Selenium单选框(Radio)复选框(CheckBox)
  • 基于图论的立体匹配方法研究----绪论
  • rails migration 增加索引
  • len(),range()函数
  • 长城电脑整体解决方案护航智慧城市安全
  • Java语法基础--运算
  • 问题010:在Java中,什么是常量,什么是变量?
  • 算法(四)--------动态规划问题
  • Mock Server 入门
  • 如何判断c语言的变量类型
  • 【140天】尚学堂高淇Java300集视频精华笔记(86-87)
  • 【vuex入门系列02】mutation接收单个参数和多个参数
  • Docker 笔记(1):介绍、镜像、容器及其基本操作
  • iOS高仿微信项目、阴影圆角渐变色效果、卡片动画、波浪动画、路由框架等源码...
  • java8 Stream Pipelines 浅析
  • java8-模拟hadoop
  • js正则,这点儿就够用了
  • vue-cli在webpack的配置文件探究
  • 阿里云爬虫风险管理产品商业化,为云端流量保驾护航
  • 对JS继承的一点思考
  • 多线程事务回滚
  • 互联网大裁员:Java程序员失工作,焉知不能进ali?
  • 基于web的全景—— Pannellum小试
  • 前言-如何学习区块链
  • 算法系列——算法入门之递归分而治之思想的实现
  • 一个JAVA程序员成长之路分享
  • zabbix3.2监控linux磁盘IO
  • !!Dom4j 学习笔记
  • ###C语言程序设计-----C语言学习(6)#
  • #if和#ifdef区别
  • #pragma once与条件编译
  • (1)(1.19) TeraRanger One/EVO测距仪
  • (ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY)讲解
  • (二)学习JVM —— 垃圾回收机制
  • (附源码)ssm基于jsp高校选课系统 毕业设计 291627
  • (全注解开发)学习Spring-MVC的第三天
  • (数位dp) 算法竞赛入门到进阶 书本题集
  • (已解决)报错:Could not load the Qt platform plugin “xcb“
  • .dwp和.webpart的区别
  • .NET 8.0 中有哪些新的变化?
  • .net core 连接数据库,通过数据库生成Modell
  • .NET 回调、接口回调、 委托
  • .NET设计模式(8):适配器模式(Adapter Pattern)
  • @property括号内属性讲解
  • @四年级家长,这条香港优才计划+华侨生联考捷径,一定要看!
  • [ Linux ] git工具的基本使用(仓库的构建,提交)
  • [ vulhub漏洞复现篇 ] struts2远程代码执行漏洞 S2-005 (CVE-2010-1870)
  • [ 渗透工具篇 ] 一篇文章让你掌握神奇的shuize -- 信息收集自动化工具
  • [20150707]外部表与rowid.txt
  • [20160902]rm -rf的惨案.txt