线程池插件使用示例
使用线程池插件

安装线程池插件成功后,将产生一个新的连接器,线程池插件连接器。原始默认的连接器仍然保留并用于处理安装线程池插件前的连接的查询请求,线程池插件连接器则用于处理新的连接的查询请求。
- 线程池插件可以在补丁应用成功后直接编译安装使用,也可以编译成功后从编译路径下的plugin_output_directory/目录中拷贝文件thread_pool.so到目标MySQL服务的plugin_dir变量所指定的目录下,进行安装使用。
安装方式如下:
- 方式一:执行以下SQL语句,安装线程池插件。
当前方式安装线程池插件后,将立即生效。
1 2 3 4 5
INSTALL PLUGIN thread_pool SONAME "thread_pool.so"; INSTALL PLUGIN THREAD_POOL_GROUPS SONAME "thread_pool.so"; INSTALL PLUGIN THREAD_POOL_QUEUES SONAME "thread_pool.so"; INSTALL PLUGIN THREAD_POOL_STATS SONAME "thread_pool.so"; INSTALL PLUGIN THREAD_POOL_WAITS SONAME "thread_pool.so";
thread_pool.so中包含如上命令中的5个插件,thread_pool是线程池连接器插件,THREAD_POOL_GROUPS、THREAD_POOL_QUEUES、THREAD_POOL_STATS、THREAD_POOL_WAITS是线程池插件状态监管表,安装成功后可在MySQL的INFORMATION_SCHEMA中看到,详见新增information_schema表。
- 方式二:在MySQL配置文件中添加线程池插件配置信息。
当前方式安装线程池插件后,需要重启数据库才能生效。
1
plugin-load-add=thread_pool.so
安装完成后,可以通过如下SQL语句查看线程池插件是否安装成功。
1
show plugins;
回显信息中状态为“ACTIVE”时,表示插件已安装成功。
- 方式一:执行以下SQL语句,安装线程池插件。
- 参考以下参数调优建议对MySQL线程池进行调整和优化。
数据库的配置文件默认路径为“/etc/my.cnf”。如果想要使用自定义的其他路径下的配置文件,可以通过--defaults-file选项指定,例如指定“/tmp/myconfig.txt”文件。
1
mysqld --defaults-file=/tmp/myconfig.txt
参数名称
参数含义
配置建议
thread_pool_size
该参数用于设置线程池中线程组的数量。
采用默认值时表示线程组数与CPU核数一致,也可根据实际场景(例如连接数超过CPU逻辑核数,性能瓶颈不在锁争用,且CPU压不满的场景)将线程组数设置为1~3倍CPU数或者最优并发数,以获取更佳性能。
thread_pool_oversubscribe
该参数表示每个线程组的超额线程数。thread_pool_oversubscribe取默认值时,表示每个CPU核心的超额线程数,默认值为3,是一个能够充分利用CPU资源的经验值,如果设置为小于3的值,可能导致更多的睡眠和唤醒。
当线程组中活跃工作线程数超过该参数时,认为活跃工作线程过多,需要限制活跃工作线程数,建议配置最优性能时的并发数/thread_pool_size的配置值。
thread_pool_toobusy
该参数表示线程组是否过于忙碌的线程数阈值。
当线程组中活跃的工作线程数+锁或IO等待中的工作线程数>该阈值加1时,认为线程组过于忙碌,不再处理低优先级的任务,等待当前执行的任务和高优先级队列中的任务被处理,直到线程组回到非忙碌的状态,建议与thread_pool_oversubscribe配置相同的值。
thread_pool_dedicated_listener
该参数用于指定listener线程是否固定只负责epoll_wait等待网络事件。
建议设置为ON,在获取网络事件后,listener线程将所有网络事件任务放入优先队列或普通队列,然后继续进入epoll_wait等待网络事件,以获取更高效率的网络事件。
- 通过TPC-C测试可以得到使用MySQL线程池特性前后的性能提升效果,详细测试步骤请参见《BenchMarkSQL 测试指导》。
线程池连接器对于大量连接的OLTP短查询的场景将有最大帮助。在OLTP TPC-C场景下,启用线程池之前,MySQL运行10000个并发任务的性能只有原来的10%左右。启用线程池功能后,性能可维持在85%,对比效果如图1所示。
卸载线程池插件

执行uninstall plugin thread_pool语句卸载线程池插件后,MySQL的连接器将切换回安装线程池之前的连接器,原先在线程池中的连接仍运行在线程池中,之后新建立的连接将运行在MySQL配置的连接器中,若卸载线程池时,线程池上仍有用户连接,线程池插件的状态将由ACTIVE状态变为DELETE状态(线程池插件卸载的过程状态),待线程池上的所有连接断开后,再执行uninstall plugin thread_pool命令可立即完成线程池卸载,否则将在MySQL服务shutdown时才会完成卸载。
- 线程池插件的卸载方式如下:
- 方式一:卸载线程池插件必须执行UNINSTALL命令:
1 2 3 4 5
UNINSTALL PLUGIN THREAD_POOL_GROUPS; UNINSTALL PLUGIN THREAD_POOL_QUEUES; UNINSTALL PLUGIN THREAD_POOL_STATS; UNINSTALL PLUGIN THREAD_POOL_WAITS; UNINSTALL PLUGIN thread_pool;
执行以上卸载指令时,若线程池连接器上存在用户连接,则会提示"plugin is busy and will be installed on shutdown"的warning信息,线程池插件的状态将由ACTIVE状态变为DELETE状态(线程池插件卸载的过程状态),待线程池上的所有连接断开后,再执行uninstall plugin thread_pool命令可立即完成线程池卸载,否则将在MySQL服务shutdown时才会完成卸载。
- 方式二:若在配置文件中有设置加载线程池插件的配置行,可在执行UNINSTALL命令后删除该配置行。
当前方式卸载线程池插件后,需要重启数据库才能生效。
1
plugin-load-add=thread_pool.so
- 方式一:卸载线程池插件必须执行UNINSTALL命令:
- 卸载后可通过如下语句检查线程池插件是否卸载成功。
1
show plugins;