thread_cache_size 是什么
MySQL 每建立一个客户端连接就要分配一个线程,断开后线程不立刻销毁,而是放进线程缓存供下次复用。thread_cache_size 决定缓存多少个空闲线程:缓存命中就不必反复创建销毁线程,能明显降低短连接场景的连接开销。
基本信息
| 参数名 | thread_cache_size |
|---|---|
| 作用域 | GLOBAL,支持动态修改,重启后以配置文件为准 |
| 取值建议 | 短连接多的实例给 32 到 128,按创建线程的增速继续调整 |
| 内存代价 | 缓存线程常驻占用内存(线程栈等结构) |
| 判定指标 | Threads_created 增速与 Connections 增速的比值 |
典型使用场景
- 短连接业务:请求级建连的架构每次连接都要建线程,缓存收益最明显
- 连接抖动大:并发峰谷差距大时用缓存吸收建连尖峰
- 线程创建数持续增长:说明缓存不够,线程在不断重建销毁
- 压测环境对齐生产:先用缓存参数还原真实建连成本,再评估容量
- 长连接池业务:收益有限,重点应放在连接池配置与正在运行的线程数上
状态与调整
状态与调整
SHOW STATUS LIKE 'Threads_%'; -- 连接与线程状态
SHOW STATUS LIKE 'Connections'; -- 累计连接数
SHOW VARIABLES LIKE 'thread_cache_size';
SET GLOBAL thread_cache_size = 64; -- 动态调大,同时写进配置文件
-- 调完继续观察 Threads_created 是否仍随 Connections 同步暴涨输出逐列读法
| 状态变量 | 含义 | 判读 |
|---|---|---|
| Threads_connected | 当前打开的连接数 | 接近上限需排查连接泄漏 |
| Threads_running | 正在执行的线程数 | 明显大于 CPU 核数说明存在排队 |
| Threads_created | 累计创建过的线程数 | 增速接近连接增速说明缓存命中率低 |
| Threads_cached | 当前缓存中的空闲线程数 | 长期为 0 说明缓存偏小 |
评估缓存是否够用:比较一段时间内创建线程增量与连接增量的比值,比值接近 1 说明几乎没有复用,应继续调大。
缓存线程常驻内存,在连接数并不高的实例上把值调得很大纯属浪费,按实际建连速率给值。