You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何自动终止Ubuntu 18.04中阻塞的MySQL线程?

解决MySQL阻塞线程自动终止与php-fpm CPU占用100%的问题

兄弟,我来帮你搞定这两个棘手的问题,分两部分给你讲清楚:

一、自动化终止超时的MySQL阻塞线程

当然可以实现自动清理超时线程,给你两个实用方案:

1. 用MySQL内置参数快速解决

如果这些Sleep线程是客户端连接后闲置导致的,直接调整MySQL配置就能自动清理:
打开你的MySQL配置文件(通常是/etc/mysql/my.cnf或/etc/mysql/mysql.conf.d/mysqld.cnf),添加或修改以下参数:

wait_timeout = 3600  # 这里设置你想要的超时阈值,比如1小时,按需调整
interactive_timeout = 3600

保存后重启MySQL服务:systemctl restart mysql。不过要注意,这个参数会作用于所有闲置连接,如果你的应用有长连接需求,得谨慎设置。

2. 自定义脚本+定时任务(更灵活精准)

如果需要针对性清理(比如只杀特定用户、数据库的Sleep线程),写个Shell脚本配合定时任务就很合适:

下面这个脚本会杀掉超过指定秒数的目标线程,你可以修改THRESHOLD的值:

#!/bin/bash
# 配置参数
THRESHOLD=18000  # 超时时间,比如18000秒=5小时,改成你需要的数值
MYSQL_USER="root"  # 有权限执行KILL命令的MySQL用户
MYSQL_PASS="your_mysql_password"  # 对应密码
MYSQL_HOST="localhost"
LOG_FILE="/var/log/mysql_kill_timeout_threads.log"

# 查询符合条件的线程,生成KILL命令
KILL_CMDS=$(mysql -u$MYSQL_USER -p$MYSQL_PASS -h$MYSQL_HOST -e "SELECT CONCAT('KILL ', id, ';') FROM information_schema.processlist WHERE user='ms_db_use' AND db='app_pro' AND state='Sleep' AND time > $THRESHOLD;" -sN)

# 执行清理并记录日志
if [ -n "$KILL_CMDS" ]; then
    mysql -u$MYSQL_USER -p$MYSQL_PASS -h$MYSQL_HOST -e "$KILL_CMDS"
    echo "$(date '+%Y-%m-%d %H:%M:%S'): 已终止线程: $KILL_CMDS" >> $LOG_FILE
else
    echo "$(date '+%Y-%m-%d %H:%M:%S'): 无超时线程需要终止" >> $LOG_FILE
fi

把脚本保存为mysql_kill_timeout_threads.sh,给它加执行权限:chmod +x mysql_kill_timeout_threads.sh,然后添加到crontab定时执行,比如每半小时跑一次:

crontab -e
# 添加下面一行,替换成你的脚本路径
*/30 * * * * /home/your_user/mysql_kill_timeout_threads.sh

这样就能自动帮你清理超时的Sleep线程了。

二、排查php-fpm进程CPU占用100%的问题

php-fpm跑满CPU大概率是代码执行效率低或者死循环,按下面的步骤一步步排查:

1. 定位具体的问题请求

首先得搞清楚这些高CPU进程在处理什么请求,用strace跟踪进程:

strace -p 124 -c  # 124是你看到的高CPU进程的PID,替换成实际的

这个命令会统计进程的系统调用情况,帮你判断是在忙IO还是计算。或者用lsof看进程关联的文件和连接:

lsof -p 124

另外,开启php-fpm慢日志是个好办法,能直接抓到执行时间长的脚本:
打开php-fpm的池配置文件(比如/etc/php/7.2/fpm/pool.d/www.conf,版本可能不同),修改以下配置:

slowlog = /var/log/php-fpm/www-slow.log
request_slowlog_timeout = 5s  # 超过5秒的请求就记录日志,按需调整

重启php-fpm:systemctl restart php7.2-fpm,之后查看慢日志就能找到拖慢性能的脚本。

2. 分析代码瓶颈

拿到慢日志里的脚本后,用性能分析工具深挖问题:

  • 如果是SQL查询慢,就去看对应的SQL语句,加索引、优化查询逻辑;
  • 如果是代码逻辑问题(比如死循环、递归调用过多),直接修改代码;
  • 如果是调用第三方API或者外部服务慢,考虑加缓存或者改成异步处理。

你也可以用xdebug做代码级的性能分析,能精准定位到耗时的函数。

3. 调整php-fpm配置优化资源

有时候进程数设置不合理也会导致CPU过载,检查www.conf里的进程配置:

pm = dynamic  # 服务器资源有限的话用dynamic,资源充足可以用static
pm.max_children = 50  # 最大进程数,建议按CPU核心数的2倍设置,比如4核CPU设8-10
pm.start_servers = 10  # 启动时的进程数
pm.min_spare_servers = 5  # 最小空闲进程数
pm.max_spare_servers = 20  # 最大空闲进程数

如果是static模式,pm.max_children别设太大,避免进程过多抢占CPU。

内容的提问来源于stack exchange,提问作者Ultra Sharing

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 11:37:31