MySQL内核月报 2014.12-MySQL· 性能优化·thread pool 原理分析

简介:
+关注继续查看

大连接问题

现有mysql 处理客户端连接的方式会触发mysql 新建一个线程来处理新的连接,新建的线程会处理该连接所发送的所有 SQL 请求,即 one-thread-per-connection 的方式,其创建连接的堆栈为:


线程建立后,处理请求的堆栈如下:

  1. 0 mysql_execute_command
  2. 1 0x0000000000936f40 in mysql_parse
  3. 2 0x0000000000920664 in dispatch_command
  4. 3 0x000000000091e951 in do_command
  5. 4 0x00000000008c2cd4 in do_handle_one_connection
  6. 5 0x00000000008c2442 in handle_one_connection
  7. 6 0x0000003562e07851 in start_thread () from /lib64/libpthread.so.0
  8. 7 0x0000003562ae767d in clone () from /lib64/libc.so.6

优点及存在的问题

在连接数较小的情况下可以很快的响应客户端的请求,但当连接数非常大时会创建很多线程,这样会引起以下问题:

1. 过多线程之间的切换会加重系统的负载,造成系统资源紧张且响应不及时;

2. 频繁的进行线程的创建及销毁以及线程间同时无序的竟争系统资源加重了系统的负载。

thread_pool正是为了解决以上问题而产生的;


什么是thread_pool

thread_pool(线程池),是指mysql 创建若干工作线程来共同处理所有连接的用户请求,用户的请求的方式不再是 ‘one thread per connection’,而是多个线程共同接收并处理多个连接的请求,在数据库的底层处理方面(mysql_execute_command),单线程的处理方式和线程池的处理方式是一致的。


thread_pool 的工作原理

启动 thread_pool 的mysql 会创建thread_pool_size 个thread group , 一个timer thread, 每个thread group 最多拥有thread_pool_oversubscribe个活动线程,一个listener线程,listener线程负责监听分配到thread group中的连接,并将监听到的事件放入到一个queue中,worker线程从queue中取出连接的事件并执行具体的操作,执行的过程和one thread per connection 相同。timer threaad 则是为了监听各个threadgroup的运行情况,并根据是否阴塞来创建新的worker线程。

thread_pool 建立连接的堆栈如下:


thread group中的 worker 处理请求的堆栈如下:

  1. 0 mysql_execute_command
  2. 1 0x0000000000936f40 in mysql_parse
  3. 2 0x0000000000920664 in dispatch_command
  4. 3 0x000000000091e951 in do_command
  5. 4 0x0000000000a78533 in threadpool_process_request
  6. 5 0x000000000066a10b in handle_event
  7. 6 0x000000000066a436 in worker_main
  8. 7 0x0000003562e07851 in start_thread ()
  9. 8 0x0000003562ae767d in clone ()

其中worker_main函数是woker线程的主函数,调用mysql本身的do_command 进行消息解析及处理,和one_thread_per_connection 是一样的逻辑; thread_pool 自行控制工作的线程个数,进而实现线程的管理。


thread_pool中线程的创建:

1. listener线程将监听事件放入mysql放入queue中时,如果发现当前thread group中的活跃线程数active_thread_count为零,则创建新的worker 线程;

2. 正在执行的线程阻塞时,如果发现当前thread group中的活跃线程数active_thread_count为零,则创建新的worker 线程;

3. timer线程在检测时发现没有listener线程且自上次检测以来没有新的请求时会创建新的worker线程,其中检测的时间受参数threadpool_stall_limit控制;

4. timer线程在检测时发现没有执行过新的请求且执行队列queue 不为空时会创建新的worker线程;


worker线程的伪码如下:



thread_pool中线程的销毁:

当从队列queue中取出的connection为空时,则此线程销毁,取connection所等待的时间受参数thread_pool_idle_timeout的控制; 综上,thread_pool通过线程的创建及销毁来自动处理worker的线程个数,在负载较高时,创建的线程数目较高,负载较低时,会销毁多余的worker线程,从而降低连接个数带来的影响的同时,提升稳定性及性能。同时,threadpool中引入了Timer 线程,主要做两个事情。

1. 定期检查每个thread_group是否阻塞,如果阻塞,则进行唤醒或创建线程的工作;

2. 检查每个thread_group中的连接是否超时,如果超时则关掉连接并释放相应的资源;


threadpool在使用中存在的问题:

1. 由于threadpool严格控制活跃线程数的限制,如果同时有多个大查询同时分配到了同一个thread group,则会造成此group中的请求过慢,rt 升高,最典型的就是多个binlog dump 线程同时分配到了同一个group内;

2. 开启了事务模式时,非事务模式的请求会放入低优先级队列,因此可能在较长时间内得不到有效处理,极端情况下,会导致实例hang 住,例如某个连接执行了 flush tables with read lock ,并且此连接的后续请求都会放入低优先级,那么有可能会造成实列hang住;

3. 较小并发下,threadpool 性能退化的问题;


相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
3月前
|
存储 自然语言处理 算法
MySQL详解:索引的介绍和原理分析
索引的定义 MySQL官方对索引的定义为:索引(Index)是协助MySQL高效获取数据的数据结构。 本质上,索引的目的是为了提高查询效率,通过不断地缩小想要获取数据的范围来筛选出最终想要的结果,同时把随机的事件变成顺序的事件,也就是说,有了这种索引机制,我们可以总是用同一种查找方式来锁定数据。
|
5月前
|
存储 关系型数据库 MySQL
MySQL底层存储B-Tree和B+Tree原理分析
MySQL底层存储B-Tree和B+Tree原理分析
MySQL底层存储B-Tree和B+Tree原理分析
|
5月前
|
存储 SQL 安全
Mysql报错注入原理分析(count()、rand()、group by)
Mysql报错注入原理分析(count()、rand()、group by)
|
存储 SQL 安全
PolarDB-X内核新版本:将MySQL进行到底
在PolarDB-X最新的内核版本5.4.15中,提供诸多新功能:存储过程,读写分离优化,表级分区管理,密码、审计优化等。
200 0
PolarDB-X内核新版本:将MySQL进行到底
|
Cloud Native 关系型数据库 MySQL
直播预告 | PostgreSQL 内核解读系列第六讲:PostgreSQL 索引介绍(下)
本系列课程将面向DBA、高校学生、内核爱好者,分15个章节,系统化介绍PG核心技术原理、用法和代码实现。希望通过课程学习,让没有内核经验的同学和DBA,也可以进行简单的特性开发,更深入理解PG配置和运行原理。本节课将讲述 PostgreSQL 索引基本介绍,涵盖Hash索引、Bitmap索引、GiST索引、GIN索引、brin索引、其他索引等内容。
直播预告 | PostgreSQL 内核解读系列第六讲:PostgreSQL 索引介绍(下)
|
存储 SQL 缓存
干货!MySQL优化原理分析及优化方案总结
说起MySQL优化的话,想必大部分人都不陌生了。在我们的记忆储备里也早已记住了这些关键词:避免使用SELECT*、避免使用NULL值的判断、根据需求适当的建立索引、优化MySQL参数.....
282 0
|
关系型数据库 MySQL 安全
MySQL中sync_relay_log选项对I/O thread的影响分析
MySQL中sync_relay_log选项对I/O thread的影响分析
3384 0
|
存储 关系型数据库 MySQL
Mysql源码学习——Thread Manager
Mysql源码学习——Thread Managerhttp://www.bieryun.com/2694.html 一、前言 上篇的Connection Manager中,曾提及对于一个新到来的Connection,服务器会创建一个新的线程来处理这个连接。
1792 0
|
关系型数据库 MySQL 数据库
mysql报错注入原理分析之floor()
环境:mysql 5.1.73 [root@localhost ~]# mysql --version mysql Ver 14.14 Distrib 5.
1728 0
相关产品
云数据库 Redis 版
云数据库 MongoDB 版
云数据库 RDS
推荐文章
更多