扩容后把 worker 并发从 8 调到 32,上线 2 分钟接口开始报 1040 Too many connections,MySQL 的 Threads_connected 卡在 500。乍看像缓存或者权限的锅,追下去往往不是。

SHOW VARIABLES LIKE 'max_connections';
SHOW STATUS LIKE 'Threads_connected';
SHOW STATUS LIKE 'Threads_running';

追下去是这么回事:每个 worker 进程各建一个连接池,池大小默认 10,32 个进程就是 320 条连接,再乘实例数就超过 max_connections。任务本身是 IO 等待型,加并发并不能提高吞吐。

「并发配置过高」相关的验证我通常做两遍,改完一次、隔天再看一次,确认不是临时生效。验证用真实数据走一遍,测试数据太干净,边界情况根本碰不到。

能分两步做的操作就别合成一步,中间看一眼返回值,出问题好判断。报错里带路径的,先去看那个路径在不在、权限对不对。

同一份配置存在多处的,先确认改的是被加载的那一份。

具体做法是,把并发调回压测得出的值 不要按 CPU 核数直接乘;每个进程的池大小设小 比如 5 并开启连接复用;配置连接超时和获取超时 避免无限等;观察 Threads_connected 峰值 确认留出 30% 余量。

验收就看一点,并发回到 8 后 Threads_connected 峰值在 350 以下 跑满一批任务不再出现 1040。

作者 9823189