CentOS系统下mysqld与httpd无法同时正常工作问题咨询
解决mysqld与httpd共存时Apache卡顿、mysqld显示"dead but subsys locked"的问题
这种情况我之前排查过好几次,大概率是资源竞争或者进程/锁文件残留导致的,咱们一步步来解决:
1. 先搞定mysqld的"dead but subsys locked"状态
这个提示说明MySQL进程已经挂了,但系统的子系统锁文件还没释放,导致服务无法正常重启或运行:
- 先强制停止MySQL服务:
service mysqld stop(如果是systemd系统用systemctl stop mysqld) - 找到并删除锁文件,通常位置是
/var/lock/subsys/mysqld或者/var/run/mysqld/mysqld.pid:rm -f /var/lock/subsys/mysqld rm -f /var/run/mysqld/mysqld.pid - 检查是否有残留的MySQL僵尸进程,杀掉它们:
ps aux | grep mysqld | grep -v grep | awk '{print $2}' | xargs kill -9 - 重新启动MySQL:
service mysqld start
2. 排查资源竞争问题
两个服务单独跑正常,一起跑就卡,很大可能是内存或CPU被占满,导致系统频繁使用swap(虚拟内存),拖慢Apache:
- 用
free -m查看内存使用情况,如果used接近total,且swap有大量使用,说明内存不足 - 用
top或htop实时监控,看两个服务的CPU、内存占用率 - 解决方法:
- 临时调整服务配置减少资源占用:比如MySQL的
my.cnf里调小innodb_buffer_pool_size(别设超过物理内存的50%);Apache的httpd.conf里调低MaxClients/ServerLimit,减少并发连接数 - 长期方案是升级服务器内存
- 临时调整服务配置减少资源占用:比如MySQL的
3. 检查MySQL socket文件权限
如果Apache需要连接MySQL,可能因为socket文件权限问题导致连接超时,进而拖慢Apache:
- 找到MySQL的socket文件位置(一般在
/var/lib/mysql/mysql.sock),查看权限:ls -l /var/lib/mysql/mysql.sock - 如果文件所属组是
mysql,把Apache的运行用户(通常是apache或www-data)加入mysql组:usermod -aG mysql apache - 重启Apache服务:
service httpd restart
4. 查看日志定位细节
以上方法都没解决的话,一定要看日志找线索:
- MySQL错误日志:
/var/log/mysqld.log,看进程崩溃时的具体报错 - Apache错误日志:
/var/log/httpd/error_log(CentOS/RHEL)或/var/log/apache2/error.log(Debian/Ubuntu),看是否有连接MySQL超时、资源不足的报错
内容的提问来源于stack exchange,提问作者JrZ
相关产品推荐
相关产品推荐

