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

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,高可用系列 2核4GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介:
问题现象
    线上某业务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 

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
相关文章
|
SQL 存储 JSON
MySQL执行请求报错 Error: Row size too large (>8126)
最近遇到一个业务问题,在执行一个大的业务查询时会抛出异常报错,所以今天就总结一下 Row size too large (>8126) 报错的相关问题。
|
Linux 虚拟化 iOS开发
部署06--MacOS安装VMware Fusion安装
部署06--MacOS安装VMware Fusion安装
|
Java 测试技术 开发工具
使用Spring Boot和Spock进行单元测试
使用Spring Boot和Spock进行单元测试
|
12月前
|
编译器 Python
递归下降解析器
递归下降解析器是一种自顶向下的解析技术,常用于编译器和解释器中,通过递归函数处理语法规则,构建语法树。适用于上下文无关文法(CFG),特别是LL(1)文法。其特点是实现简单、易于理解和调试,但可能面临性能问题和不支持回溯的限制。
275 3
|
人工智能 安全 测试技术
探索AI在软件开发中的应用:提升开发效率与质量
【10月更文挑战第31天】在快速发展的科技时代,人工智能(AI)已成为软件开发领域的重要组成部分。本文探讨了AI在代码生成、缺陷预测、自动化测试、性能优化和CI/CD中的应用,以及这些应用如何提升开发效率和产品质量。同时,文章也讨论了数据隐私、模型可解释性和技术更新等挑战。
|
存储 安全 数据安全/隐私保护
深入探索Android与iOS的隐私保护机制:一场没有硝烟的较量####
本文深度剖析了Android与iOS两大移动操作系统在用户隐私保护方面的策略与实践,揭示两者在设计理念、技术实现及用户体验上的异同。通过对比分析,旨在为读者提供一个全面而深入的视角,理解两大平台如何在保障用户隐私的同时,实现功能的丰富与便捷。本文不涉及具体产品推荐或品牌偏好,仅从技术角度出发,探讨隐私保护的现状与挑战。 ####
|
JSON 关系型数据库 MySQL
mysqlx_max_connections
mysqlx_max_connections
1292 0
|
SQL 存储 安全
网络安全与信息安全的现代挑战:漏洞、加密与意识
【10月更文挑战第20天】在数字时代的浪潮下,网络安全和信息安全的重要性日益凸显。本文旨在探讨当前网络安全面临的主要挑战,包括安全漏洞的发现与利用、加密技术的应用与局限,以及提升个人和组织的安全意识的必要性。通过分析这些关键领域,我们不仅能更好地理解网络威胁的本质,还能采取有效措施保护我们的数字资产。文章将提供对网络安全现状的深刻见解,并指出未来研究的方向。
|
Java Maven 开发者
"揭秘IDEA的神奇助手:Maven Helper插件,让你轻松驾驭复杂依赖,告别冲突噩梦!"
【8月更文挑战第20天】Maven Helper是一款提升Java开发者工作效率的IDEA插件,它能直观展示项目依赖关系并协助管理。主要功能包括依赖树视图、冲突检测与解决及依赖排除。安装简便,重启IDEA后即用。借助其“Dependencies”面板,开发者可以清晰了解依赖详情,快速定位并解决冲突问题,有效优化项目结构,提升开发效率。
1109 0
|
数据管理 数据库
两种不同充血模型实现中的问题及解决办法
### 前言 关于贫血模型与充血模型,已经有大量的文章写到了,但大部分都只是写了两种模型的对比,其中的例子也相对比较简单。 当我们真正在使用充血模型的过程中,还会碰到很多问题,本文期望通过我们复杂的业务场景,深入的讲解我们在真正使用充血模型时,到底会碰到哪些问题,我们又要如何来解决。 ### 什么是充血模型 Martin Fowler在2003年发表的一篇文章中,第一次提出贫血模型的概念,他把贫
2415 0

热门文章

最新文章