back_log过小会导致新连接被操作系统拒绝,表现为“connection refused”或大量unauthenticated user堆积;其本质是TCP半连接队列长度,受max_connections和系统net.core.somaxconn双重限制,建议按50 + max_connections/5设置并确保不超OS上限。

back_log设太小会导致连接被直接拒绝
当应用发起大量短连接(比如Web服务每秒几百次请求),MySQL主线程来不及逐个处理,新连接就会排队等待。back_log就是这个TCP连接请求队列的长度。它不是“最大连接数”,而是“还没来得及被MySQL接受、正在操作系统内核里排队的连接请求数”。
常见错误现象:264084 | unauthenticated user | xxx.xxx.xxx.xxx | NULL | Connect | NULL | login | NULL 这类大量 unauthenticated user 状态进程堆积,说明连接已到MySQL监听端口,但还没完成认证,正卡在back_log队列里。
- 默认值通常是50,5.6+版本自动设为
50 + (max_connections / 5),但上限是900 - 真实有效值受操作系统限制:Linux上由
net.core.somaxconn决定,若该值为128,你把back_log配成2000也没用 - 推荐计算方式:先确认
max_connections(比如设为3000),再取50 + 3000/5 = 650,然后检查sysctl net.core.somaxconn,确保它 ≥ 650;否则同步调大系统参数
thread_cache_size不足会频繁创建销毁线程
每个客户端连接进来,MySQL都要创建一个线程去服务。频繁新建/销毁线程开销不小。thread_cache_size 就是让空闲线程“缓存住”,等下一个连接来时直接复用,避免反复分配资源。
判断是否不够用:执行 SHOW STATUS LIKE 'Threads_created';,如果这个值在高并发期间持续上涨(比如每秒新增几十个),而 SHOW STATUS LIKE 'Threads_connected'; 波动不大,就说明线程没被复用,全靠新建。
安装、修复、更新或打包一个基于 Python 和 PyMySQL 实现的 Windows `mysql` 命令。适用于用户希望在 PowerShell/CMD 中输入 `mysql` 时重定向到 Python 实现、需要交互式输入 MySQL 连接信息、需要同步到当前用户本地 bin 目录,或需要将该能力封装成可公开复用的 Codex skill。
- 默认值通常只有4–8,对高并发场景远远不够
- 不建议硬套“并发连接数 × 10%”这种模糊公式;更稳妥的是观察
Threads_created增速 + 应用连接模式(长连接多就可小些,短连接多必须大些) - 实测建议起步值设为64,再根据监控调整;超过128后收益明显下降,且会额外占用内存(每个线程约256KB栈空间)
- 注意:该参数只影响新连接分配线程的行为,对已存在的连接无影响
两个参数要配合max_connections一起看
back_log 和 thread_cache_size 都不是孤立生效的。它们的实际效果高度依赖 max_connections 的设定,以及应用层连接行为。
- 如果
max_connections设得太低(比如默认151),即使back_log和thread_cache_size调得再高,也会很快触发Too many connections错误 - 短连接场景下,
max_connections要按峰值并发量预估(例如QPS 1000、平均连接耗时100ms → 理论需100个连接),再留30%余量;否则连接池打满,上游就开始超时 - 修改这三个参数后,务必检查
SHOW VARIABLES LIKE '%connection%';和SHOW STATUS LIKE 'Threads%';,确认运行时值与配置一致(有些旧版本需要重启才生效)
别忽略操作系统和连接池的协同影响
MySQL参数只是链路一环。真正决定连接能否顺畅建立的,还有前端连接池配置、OS网络栈、以及是否启用了 skip-name-resolve。
- Java应用常用HikariCP,它的
maximumPoolSize必须 ≤ MySQL的max_connections,否则必然报错;同时建议开启connection-test-query避免拿过期连接 - 未配置
skip-name-resolve时,每个新连接都会触发DNS反查,可能卡在unauthenticated user状态几秒——这会人为拉长back_log排队时间,看起来像参数不够 - Linux上如果
net.ipv4.tcp_tw_reuse关闭,大量短连接关闭后进入TIME_WAIT,可能占满本地端口,导致客户端报Cannot assign requested address,这时调MySQL参数毫无意义
实际调优不是改几个数字就完事。最常被跳过的一步是:确认连接模式——你的应用到底用的是长连接还是短连接?这个问题没搞清,back_log 和 thread_cache_size 就永远在猜。










