确认系统级线程限制卡死需直接检查mysqld进程的max processes值:用pidof mysqld获取pid,再执行cat /proc/pid/limits | grep "max processes",若显示如"512 512"即证实被os硬限制锁定。

“Thread creation failed” 是 MySQL 在尝试为新连接分配线程时彻底失败的信号,不是配置没生效、也不是连接池等应用层问题,而是操作系统已拒绝为 mysqld 进程创建任何新线程。必须立刻查 PID 的 Max processes 限制,而不是先改 max_connections。
怎么确认是系统级线程限制卡死的?
别猜,直接看 mysqld 进程当前被 OS 强制设的上限:
- 先拿到 MySQL 主进程 PID:
pidof mysqld或ps -ef | grep mysqld | grep -v grep | awk '{print $2}' - 再查它实际能开多少线程:
cat /proc/<code>PID/limits | grep "Max processes" - 如果输出类似
Max processes 512 512 processes,就坐实了——哪怕max_connections只设了 200,只要活跃连接 + 内部线程(如复制、监控)接近 512,就会报Thread creation failed
注意:这个值和 ulimit -u 输出的可能不同,因为 systemd 会覆盖 shell 级限制;/etc/security/limits.d/ 下的配置在 systemd 环境下大概率不生效。
为什么改了 max_connections 还是失败?
根本原因在于:MySQL 启动后,每个连接 ≈ 一个 OS 线程,而线程数受三重限制叠加:
-
max_connections是 MySQL 自己的逻辑上限,但只是“申请门槛”,不是 OS 许可证 - systemd 的
TasksMax(默认常为 512 或 1024)才是硬闸门,mysqld进程无法突破 - 每个线程还要占文件描述符(
nofile),若ulimit -n是 1024,即使线程够,也卡在 open files 不足上
典型症状:修改 my.cnf 中 max_connections = 2000 并重启,日志却报 Can't start server: Bind on TCP/IP port. Got error: 24: Too many open files——说明系统连 socket 都分配不出,更别说线程。
如何快速验证并临时解围?
紧急情况下,不重启 mysqld 就能测试是否真卡在系统限制:
- 用 root 执行:
echo -n "Max processes=65535:65535" > /proc/<code>PID/limits - 立刻执行
mysql -uroot -p -e "SHOW STATUS LIKE 'Threads_connected';"看能否新建连接 - 若成功,说明就是
TasksMax问题;若仍失败,再查nofile和内存(free -h、cat /proc/<code>PID/status | grep VmRSS)
注意:该操作仅对当前进程有效,重启后失效;部分老内核(如 3.10 之前)会拒绝写入 /proc/<code>PID/limits,必须走 systemd 配置。
永久修复必须改 systemd 的 TasksMax
在 CentOS 7+/Ubuntu 16.04+ 上,/etc/security/limits.conf 对 mysqld 基本无效,真正起效的是:
- 首选:
/etc/systemd/system.conf中取消注释或添加DefaultTasksMax=65535,然后systemctl daemon-reload - 次选(更精准):
/etc/systemd/system/mysqld.service.d/override.conf新建文件,内容为:[Service] TasksMax=65535
,再systemctl daemon-reload && systemctl restart mysqld - 同步检查并调高
nofile:LimitNOFILE=65535也要加进上面的override.conf里
做完这步,再配 max_connections 和 thread_cache_size 才有意义。否则,你调得再高,OS 层早就把路封死了。
最常被忽略的是 systemd 的 TasksMax 默认值——它比 ulimit 更底层、更顽固,且错误日志里完全不提它。排查时盯着 /proc/<code>PID/limits 这一行,比翻 MySQL 错误日志还管用。











