mysql 开启线程池

在MySQL5.6出现以前,MySQL处理连接的方式是One-Connection-Per-Thread,即对于每一个数据库连接,MySQL-Server都会创建一个独立的线程服务,请求结束后,销毁线程。再来一个连接请求,则再创建一个连接,结束后再进行销毁。这种方式在高并发情况下,会导致线程的频繁创建和释放。当然,通过thread-cache,我们可以将线程缓存起来,以供下次使用,避免频繁创建和释放的问题,但是无法解决高连接数的问题。One-Connection-Per-Thread方式随着连接数暴增,导致需要创建同样多的服务线程,高并发线程意味着高的内存消耗,更多的上下文切换(cpu cache命中率降低)以及更多的资源竞争,导致服务出现抖动。相对于One-Thread-Per-Connection方式,一个线程对应一个连接,Thread-Pool实现方式中,线程处理的最小单位是statement(语句),一个线程可以处理多个连接的请求。这样,在保证充分利用硬件资源情况下(合理设置线程池大小),可以避免瞬间连接数暴增导致的服务器抖动。

总结:

One-Thread-Per-Connection方式: 一个线程对应一个连接;

Thread-Pool方式: 线程处理的最小单位是statement(语句),一个线程可以处理多个连接的请求。

手上正好有一个测试环境,企业版5.6.23

库的版本信息:

/usr/local/mysql/bin/mysql  Ver 14.14 Distrib 5.6.23, for linux-glibc2.5 (x86_64) using  EditLine wrapper

Connection id:          373

Current database:

Current user:           [email protected]

SSL:                    Not in use

Current pager:          stdout

Using outfile:          ‘‘

Using delimiter:        ;

Server version:         5.6.23-enterprise-commercial-advanced-log MySQL Enterprise Server - Advanced Edition (Commercial)

Protocol version:       10

Connection:             Localhost via UNIX socket

Server characterset:    utf8

Db     characterset:    utf8

Client characterset:    utf8

Conn.  characterset:    utf8

UNIX socket:            /tmp/mysql3307.sock

Uptime:                 16 min 20 sec

Threads: 686  Questions: 10436  Slow queries: 0  Opens: 80  Flush tables: 1  Open tables: 73  Queries per second avg: 10.648

开启thread_pool之前的变量值查看:

#没有thread_pool变量信息

mysql> show global variables like ‘%pool%‘;

+-------------------------------------+----------------+

| Variable_name                       | Value          |

+-------------------------------------+----------------+

| innodb_additional_mem_pool_size     | 8388608        |

| innodb_buffer_pool_dump_at_shutdown | OFF            |

| innodb_buffer_pool_dump_now         | OFF            |

| innodb_buffer_pool_filename         | ib_buffer_pool |

| innodb_buffer_pool_instances        | 8              |

| innodb_buffer_pool_load_abort       | OFF            |

| innodb_buffer_pool_load_at_startup  | OFF            |

| innodb_buffer_pool_load_now         | OFF            |

| innodb_buffer_pool_size             | 1073741824     |

+-------------------------------------+----------------+

9 rows in set (0.00 sec)

#每个线程一个连接

mysql> show global variables like ‘%thread_handling%‘;

+-----------------+---------------------------+

| Variable_name   | Value                     |

+-----------------+---------------------------+

| thread_handling | one-thread-per-connection |

+-----------------+---------------------------+

1 row in set (0.01 sec)

====================================================================================

开启thread_pool操作

方法一:在数据库启动的时候加--plugin-load

方法二:在my.cnf配置文件中添加配置

配置文件中添加的配置也有两种方法:

第一种 单行配置:

[mysqld]

plugin-load=thread_pool=thread_pool.so;tp_thread_state=thread_pool.so;tp_thread_group_state=thread_pool.so;tp_thread_group_stats=thread_pool.so

第二种 多行分开配置:

[mysqld]

plugin-load-add=thread_pool=thread_pool.so

plugin-load-add=tp_thread_state=thread_pool.so

plugin-load-add=tp_thread_group_state=thread_pool.so

plugin-load-add=tp_thread_group_stats=thread_pool.so

我在我的配置文件中用的第二种,推荐第二种 方便人类阅读:

[mysqld]

plugin-load-add=thread_pool=thread_pool.so

plugin-load-add=tp_thread_state=thread_pool.so

plugin-load-add=tp_thread_group_state=thread_pool.so

plugin-load-add=tp_thread_group_stats=thread_pool.so

重启数据库,这个是个测试环境,这都凌晨了重启一下没影响,没人会发现(O(∩_∩)O~)。。

重启后查看插件是否加载成功。show plugins;也可以。官方是用下边的方式查看的。

mysql>SELECT PLUGIN_NAME, PLUGIN_STATUS FROM INFORMATION_SCHEMA.PLUGINS WHERE PLUGIN_NAME LIKE ‘thread%‘ OR PLUGIN_NAME LIKE ‘tp%‘;

+-----------------------+---------------+

| PLUGIN_NAME           | PLUGIN_STATUS |

+-----------------------+---------------+

| thread_pool           | ACTIVE        |

| TP_THREAD_STATE       | ACTIVE        |

| TP_THREAD_GROUP_STATE | ACTIVE        |

| TP_THREAD_GROUP_STATS | ACTIVE        |

+-----------------------+---------------+

4 rows in set (0.01 sec)

开启后,查看此时的变量值,发现多了thread_pool相关信息。

mysql> show global variables like ‘%pool%‘;

+--------------------------------------+----------------+

| Variable_name                        | Value          |

+--------------------------------------+----------------+

| innodb_additional_mem_pool_size      | 8388608        |

| innodb_buffer_pool_dump_at_shutdown  | OFF            |

| innodb_buffer_pool_dump_now          | OFF            |

| innodb_buffer_pool_filename          | ib_buffer_pool |

| innodb_buffer_pool_instances         | 8              |

| innodb_buffer_pool_load_abort        | OFF            |

| innodb_buffer_pool_load_at_startup   | OFF            |

| innodb_buffer_pool_load_now          | OFF            |

| innodb_buffer_pool_size              | 1073741824     |

| thread_pool_algorithm                | 0              |

| thread_pool_high_priority_connection | 0              |

| thread_pool_max_unused_threads       | 0              |

| thread_pool_prio_kickup_timer        | 1000           |

| thread_pool_size                     | 16             |

| thread_pool_stall_limit              | 6              |

+--------------------------------------+----------------+

15 rows in set (0.00 sec)

#线程动态加载

mysql> show global variables like ‘%thread_handling%‘;

+-----------------+--------------------+

| Variable_name   | Value              |

+-----------------+--------------------+

| thread_handling | loaded-dynamically |

+-----------------+--------------------+

1 row in set (0.00 sec)

监控线程池的状态:

mysql> show tables like ‘TP_THREAD%‘;

+-------------------------------------------+

| Tables_in_information_schema (TP_THREAD%) |

+-------------------------------------------+

| TP_THREAD_GROUP_STATS                     |

| TP_THREAD_STATE                           |

| TP_THREAD_GROUP_STATE                     |

+-------------------------------------------+

3 rows in set (0.00 sec)

官方建议:

InnoDB thread_pool_size 设置范围16到36之间,大部分人选择的一个值是24-26. 超过36性能会下降。

MyISAM thread_pool_size 设置范围4到8之间,查过这个范围性能会有所下降。

If the primary storage engine is InnoDB, the optimal thread_pool_size setting is likely to be between 16 and 36, with the most common optimal values tending to be from 24 to 36. We have not seen any situation where the setting has been optimal beyond 36. There may be special cases where a value smaller than 16 is optimal.

For workloads such as DBT2 and Sysbench, the optimum for InnoDB seems to be usually around 36. For very write-intensive workloads, the optimal setting can sometimes be lower.

If the primary storage engine is MyISAM, the thread_pool_size setting should be fairly low. We tend to get optimal performance for values from 4 to 8. Higher values tend to have a slightly negative but not dramatic impact on performance.

时间: 2024-12-12 16:12:23

mysql 开启线程池的相关文章

c#开启线程池超出索引

这样写会超出索引,foreach好像不会超出,原因可能是开启线程池需要时间,成功开启之后,一次循环已经结束,这个没有验证. 这样写就可以. 如有写的不对的请指出! 原文地址:https://www.cnblogs.com/codeDevotee/p/9267715.html

开启线程池和进程池

线程与进程的应用场合很多,主要处理并发与多任务.然而,当开启的线程与进程过多时,系统的开销过多会造成性能低下甚至崩溃.这时,希望出现一种方法能规定只能执行指定数量线程与进程的策略.特别是针对不知道要开启多少线程或进程,而有可能出现线程或进程过多的情况.于是,线程池与进程池出现了.python3以后增加了concurrent.futures模块,为异步执行提供了高级的接口. 线程池 concurrent.futures.ThreadPoolExecutor(max_workers=None, th

MySQL中间件之ProxySQL(5):线程、线程池、连接池

1.ProxySQL的线程 ProxySQL由多个模块组成,是一个多线程的daemon类程序.每个模块都有一个或多个线程去执行任务. 例如,以下是刚启动ProxySQL时的进程情况,一个main进程,一个主线程,21个线程. [[email protected] ~]# pstree | grep proxy |-proxysql---proxysql---21*[{proxysql}] 下面是正常运行时使用的线程列表: 1.1 Main thread 这其实是一个进程,该进程只负责引导.启动核

线程池的原理及实现

package mine.util.thread; import java.util.LinkedList; import java.util.List; /** * 线程池类,线程管理器:创建线程,执行任务,销毁线程,获取线程基本信息 */ public final class ThreadPool { // 线程池中默认线程的个数为5 private static int worker_num = 5; // 工作线程 private WorkThread[] workThrads; //

线程池的实现原理

1.线程池简介:    多线程技术主要解决处理器单元内多个线程执行的问题,它可以显著减少处理器单元的闲置时间,增加处理器单元的吞吐能力.        假设一个服务器完成一项任务所需时间为:T1 创建线程时间,T2 在线程中执行任务的时间,T3 销毁线程时间. 如果:T1 + T3 远大于 T2,则可以采用线程池,以提高服务器性能.                一个线程池包括以下四个基本组成部分:                1.线程池管理器(ThreadPool):用于创建并管理线程池,包

线程池(二)

1.线程池简介:    多线程技术主要解决处理器单元内多个线程执行的问题,它可以显著减少处理器单元的闲置时间,增加处理器单元的吞吐能力.        假设一个服务器完成一项任务所需时间为:T1 创建线程时间,T2 在线程中执行任务的时间,T3 销毁线程时间. 如果:T1 + T3 远大于 T2,则可以采用线程池,以提高服务器性能.                一个线程池包括以下四个基本组成部分:                1.线程池管理器(ThreadPool):用于创建并管理线程池,包

关于Java中线程池的解读

之前的面试中多次被问到线程池的相关内容,所以在之后的时间内我仔细的学习了一下线程池的相关内容. 1.使用线程池的意义 复用:类似WEB服务器等系统,长期来看内部需要使用大量的线程处理请求,而单次请求响应时间通常比较短,此时Java基于操作系统的本地调用方式大量的创建和销毁线程本身会成为系统的一个性能瓶颈和资源浪费.若使用线程池技术可以实现工作线程的复用,即一个工作线程创建和销毁的生命周期期间内可以执行处理多个任务,从而总体上降低线程创建和销毁的频率和时间,提升了系统性能. 流控:服务器资源有限,

线程池的原理及实现(转)

1.线程池简介:    多线程技术主要解决处理器单元内多个线程执行的问题,它可以显著减少处理器单元的闲置时间,增加处理器单元的吞吐能力.        假设一个服务器完成一项任务所需时间为:T1 创建线程时间,T2 在线程中执行任务的时间,T3 销毁线程时间. 如果:T1 + T3 远大于 T2,则可以采用线程池,以提高服务器性能.                一个线程池包括以下四个基本组成部分:                1.线程池管理器(ThreadPool):用于创建并管理线程池,包

线程池的简介

该文转载自:http://blog.csdn.net/hsuxu/article/details/8985931 1.线程池简介:    多线程技术主要解决处理器单元内多个线程执行的问题,它可以显著减少处理器单元的闲置时间,增加处理器单元的吞吐能力.        假设一个服务器完成一项任务所需时间为:T1 创建线程时间,T2 在线程中执行任务的时间,T3 销毁线程时间. 如果:T1 + T3 远大于 T2,则可以采用线程池,以提高服务器性能.                一个线程池包括以下四