Thread pool参数引起的程序连接数据库响应慢
发表于:2025-11-08 作者:千家信息网编辑
千家信息网最后更新 2025年11月08日,数据库版本:percona-mysql 5.6.16在很长一段时间,都会出现程序连接数据库,出现响应慢的情况,正常在几到几十毫秒之间,但是偶尔会出现上百毫秒的情况;开始由于开发重新设置并调整过程序连接
千家信息网最后更新 2025年11月08日Thread pool参数引起的程序连接数据库响应慢数据库版本:percona-mysql 5.6.16
在很长一段时间,都会出现程序连接数据库,出现响应慢的情况,正常在几到几十毫秒之间,但是偶尔会出现上百毫秒的情况;
开始由于开发重新设置并调整过程序连接池,一直怀疑是连接池的问题,但是问题依旧;
因为使用的版本是percona-mysql 5.6.16 并且使用了数据库连接池。
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_oversubscribe参数调大,但是问题依旧;
检查thread_cache_size,服务器内存大小为64G,thread_cache_size=128;
每建立一个连接,都需要一个线程来与之匹配,此参数用来缓存空闲的线程,以至不被销毁,如果线程缓存中有空闲线程,这时候如果建立新连接,MYSQL就会很快的响应连接请求;
show status like '%thread%';
Variable_name Value
Threads_cached 0
Threads_connected 219
Threads_created 655068
Threads_running 48
使用 show status查看当前mysql连接情况:
SHOW STATUS WHERE Variable_name LIKE '%Thread%';
Threads_cached :代表当前此时此刻线程缓存中有多少空闲线程。
Threads_connected :代表当前已建立连接的数量,因为一个连接就需要一个线程,所以也可以看成当前被使用的线程数。
Threads_created :代表从最近一次服务启动,已创建线程的数量。
Threads_running :代表当前激活的(非睡眠状态)线程数。并不是代表正在使用的线程数,有时候连接已建立,但是连接处于sleep状态,这里相对应的线程也是sleep状态。
最好将thread_cache_size设置成与threads_connected一样。
show variables like '%thread%';
+-----------------------------------------+-----------------+
| Variable_name | Value |
+-----------------------------------------+-----------------+
| innodb_purge_threads | 1 |
| innodb_read_io_threads | 4 |
| innodb_thread_concurrency | 0 |
| innodb_thread_sleep_delay | 10000 |
| innodb_write_io_threads | 4 |
| max_delayed_threads | 20 |
| max_insert_delayed_threads | 20 |
| myisam_repair_threads | 1 |
| performance_schema_max_thread_classes | 50 |
| performance_schema_max_thread_instances | -1 |
| pseudo_thread_id | 8735851 |
| thread_cache_size | 128 |
| thread_concurrency | 24 |
| thread_handling | pool-of-threads |
| thread_pool_high_prio_mode | transactions |
| thread_pool_high_prio_tickets | 4294967295 |
| thread_pool_idle_timeout | 60 |
| thread_pool_max_threads | 100000 |
| thread_pool_oversubscribe | 40 |
| thread_pool_size | 12 |
| thread_pool_stall_limit | 500 |
| thread_stack | 262144 |
| thread_statistics | OFF |
+-----------------------------------------+-----------------+
可以不断刷新,如果Threads_cached = 0 且 Threads_created 不断增大,那么当前thread_cache_size的值设置要改大,改到 Threads_connected 值左右,
再结合物理内存 1G -> 8;2G -> 16; 3G -> 32; >3G -> 64 二个情况综合考虑一下值,将thread_cache_size改为512;
注译:
Threads_cached :代表当前此时此刻线程缓存中有多少空闲线程。
Threads_connected :代表当前已建立连接的数量,因为一个连接就需要一个线程,所以也可以看成当前被使用的线程数。
Threads_created :代表从最近一次服务启动,已创建线程的数量。
Threads_running :代表当前激活的(非睡眠状态)线程数。并不是代表正在使用的线程数,有时候连接已建立,但是连接处于sleep状态,这里相对应的线程也是sleep状态。
修改thread_cache_size为512后,重新测试程序连接数据库响应时间,速度极快,不再出现程序连接数据库响应慢的情况!
在很长一段时间,都会出现程序连接数据库,出现响应慢的情况,正常在几到几十毫秒之间,但是偶尔会出现上百毫秒的情况;
开始由于开发重新设置并调整过程序连接池,一直怀疑是连接池的问题,但是问题依旧;
因为使用的版本是percona-mysql 5.6.16 并且使用了数据库连接池。
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_oversubscribe参数调大,但是问题依旧;
检查thread_cache_size,服务器内存大小为64G,thread_cache_size=128;
每建立一个连接,都需要一个线程来与之匹配,此参数用来缓存空闲的线程,以至不被销毁,如果线程缓存中有空闲线程,这时候如果建立新连接,MYSQL就会很快的响应连接请求;
show status like '%thread%';
Variable_name Value
Threads_cached 0
Threads_connected 219
Threads_created 655068
Threads_running 48
使用 show status查看当前mysql连接情况:
SHOW STATUS WHERE Variable_name LIKE '%Thread%';
Threads_cached :代表当前此时此刻线程缓存中有多少空闲线程。
Threads_connected :代表当前已建立连接的数量,因为一个连接就需要一个线程,所以也可以看成当前被使用的线程数。
Threads_created :代表从最近一次服务启动,已创建线程的数量。
Threads_running :代表当前激活的(非睡眠状态)线程数。并不是代表正在使用的线程数,有时候连接已建立,但是连接处于sleep状态,这里相对应的线程也是sleep状态。
最好将thread_cache_size设置成与threads_connected一样。
show variables like '%thread%';
+-----------------------------------------+-----------------+
| Variable_name | Value |
+-----------------------------------------+-----------------+
| innodb_purge_threads | 1 |
| innodb_read_io_threads | 4 |
| innodb_thread_concurrency | 0 |
| innodb_thread_sleep_delay | 10000 |
| innodb_write_io_threads | 4 |
| max_delayed_threads | 20 |
| max_insert_delayed_threads | 20 |
| myisam_repair_threads | 1 |
| performance_schema_max_thread_classes | 50 |
| performance_schema_max_thread_instances | -1 |
| pseudo_thread_id | 8735851 |
| thread_cache_size | 128 |
| thread_concurrency | 24 |
| thread_handling | pool-of-threads |
| thread_pool_high_prio_mode | transactions |
| thread_pool_high_prio_tickets | 4294967295 |
| thread_pool_idle_timeout | 60 |
| thread_pool_max_threads | 100000 |
| thread_pool_oversubscribe | 40 |
| thread_pool_size | 12 |
| thread_pool_stall_limit | 500 |
| thread_stack | 262144 |
| thread_statistics | OFF |
+-----------------------------------------+-----------------+
可以不断刷新,如果Threads_cached = 0 且 Threads_created 不断增大,那么当前thread_cache_size的值设置要改大,改到 Threads_connected 值左右,
再结合物理内存 1G -> 8;2G -> 16; 3G -> 32; >3G -> 64 二个情况综合考虑一下值,将thread_cache_size改为512;
注译:
Threads_cached :代表当前此时此刻线程缓存中有多少空闲线程。
Threads_connected :代表当前已建立连接的数量,因为一个连接就需要一个线程,所以也可以看成当前被使用的线程数。
Threads_created :代表从最近一次服务启动,已创建线程的数量。
Threads_running :代表当前激活的(非睡眠状态)线程数。并不是代表正在使用的线程数,有时候连接已建立,但是连接处于sleep状态,这里相对应的线程也是sleep状态。
修改thread_cache_size为512后,重新测试程序连接数据库响应时间,速度极快,不再出现程序连接数据库响应慢的情况!
线程
代表
数量
状态
数据
数据库
情况
程序
空闲
缓存
参数
问题
服务
最大
此时此刻
不断
内存
时间
有时候
正在
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
河南众客网络技术
长寿区一站式网络技术包括什么
电信网络安全培训课程
新乡趣游网络技术有限公司招聘
魔兽世界9.1服务器维护时间
软件开发原型图由谁做
软件开发类免税骗局
怎么制作一个产品价格数据库
pl导出表的数据库
有多少根服务器在中国
致远 oa 数据库
字节跳动网络安全工程师
办公网络安全目的
网络安全统一监控
管理软件主机服务器
scopus数据库有哪些
校园网络安全心得体会500
加强网络安全建设有用吗
计算机二级网络技术面试题
税务网络安全貝体
问道外传怎么修改数据库
软著申请软件开发合作协议
网络安全周报怎么写
网络安全加固方式不符合要求
做代码要服务器搭建吗
办公网络安全目的
热点网络安全吗
眼镜行业软件开发让您放心省心
漂亮网络安全的手抄报
成都软件开发的待遇