一直以来,网站都会不时出现“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_servers
、pm.min_spare_servers
和pm.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
你2G默认配置都会不够用??我1G都没啥问题我。。
这个就不晓得了,可能默认php设置不一样?