解决WordPress不时出现的数据库连接错误问题

一直以来,网站都会不时出现“Error establishing a database connection”错误提示,频率大概在2~3天1次(应该有潜在未被发现的情况)。发作时常常无法通过ssh连接服务器,需要等待一段时间才能连接通,解决办法也只有重启。看日志也没有看出个名堂来。

这个问题相当奇怪并且有不容忽视的破坏性。今天再次碰上了,就一举解决了。

 

首先尝试使用mysql命令连接数据库,报错:

使用systemctl status mysqld查看mysql的运行状态,发现一直处于activating。在这个时候,决定再次查看mysql的日志:

tail -n 100 /var/log/mysqld.log

发现关键报错信息:

应该是内存不足的问题,这能解释为什么ssh无法连接。查看空闲内存:

果然如此。

我的服务器内存是2G,对于我的应用来说已经绰绰有余了。在这个地方,我可以调低mysql的内存占用来临时解决这个问题。但是这并没有触及根本:为什么占用这么厉害?

使用命令

ps auxw|head -1;ps auxw|sort -rn -k4|head -40

查看内存占用情况,发现存在很多的php-fpm进程,每个进程占用约2%的内存。如此一来,内存就被吃光了。是php-fpm的配置有问题:

vim /etc/php-fpm.d/www.conf

调低了pm.max_children的数量(原来是50),并一起调整了pm.max_spare_serverspm.min_spare_serverspm.start_servers。这样一来,内存占用情况就好多了,问题解决。

同时我还添加了swap分区来防止内存再次不足。

此外,有资料(见参考资料3)提到可以pm=dynamic替换为pm=ondemand来使仅在有需求的时候创建进程,但我没有这样做。

参考资料

Mysql突然无法连接,重启时命令直接卡住不动,日志有报错mmap(137363456 bytes) failed; errno 12 – zwlsuperman

解决Linux下php-fpm进程过多导致内存耗尽问题 – 熊建刚的博客

How to reduce PHP-FPM (php5-fpm) RAM usage by about 50% – http://linuxbsdos.com

[Linux]创建和启用Swap交换区 – zsummer

2
评论

avatar
1 评论
1 评论回复
0 订阅
 
最多赞/踩的评论
最热门评论
2 评论者
Bear_Dic.高渐离 最近评论
  订阅  
最新 最旧 最赞
提醒我
高渐离
游客

你2G默认配置都会不够用??我1G都没啥问题我。。