如何自动终止Ubuntu 18.04中阻塞的MySQL线程?
兄弟,我来帮你搞定这两个棘手的问题,分两部分给你讲清楚:
一、自动化终止超时的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

