问题描述:
linux服务器中放了一个PHP的系统和系统配套使用的数据库MySQL。最近发现系统老是进不去,调查结果显示,MySQL服务挂了。
解决方案:尝试进入MySQL:
mysql -r root -p
报错: Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (111)
查看MySQL状态:
service mysqld status
显示:Redirecting to /bin/systemctl status mysqld.service
Unit mysqld.service could not be found.
原因:默认的这个环境一起安装了一个叫MariaDB的数据库(他是MySQL的一个分支版本),可百度查看这个数据库的详细信息。 也就是没有安装MySQL数据库,要使用MariaDB命令操作。
接着输入命令:
systemctl start mariadb.service
显示:Job for mariadb.service failed because the control process exited with error code. See "systemctl status mariadb.service" and "journalctl -xe" for details.
按照提示分别输入systemctl status mariadb.service 和 journalctl -xe 后,显示的内容没有任何报错原因提示。
查找数据库的错误日志:先看配置文件中配置的路径 cat /etc/my.cnf :,
再打开log-error后面路径中的文件即可: tail -f xxxxxx.log(从上面文件中找到的文件名),打开后就发现了错误原因:
200328 11:41:13 InnoDB: Fatal error: cannot allocate memory for the buffer pool
200328 11:41:13 [ERROR] Plugin 'InnoDB' init function returned error.
200328 11:41:13 [ERROR] Plugin 'InnoDB' registration as a STORAGE ENGINE failed.
200328 11:41:13 [Note] Plugin 'FEEDBACK' is disabled.
200328 11:41:13 [ERROR] Unknown/unsupported storage engine: InnoDB
200328 11:41:13 [ERROR] Aborting
也就是内存不够了,导致innoDb起不来,去配置启动时所需要的内存即可:
vim /etc/my.cnf
在该文件中,找是否有innodb_buffer_pool_size 这个属性 ,如果有改成128M以内的值,如果没有则添加这个属性设置值:
innodb_buffer_pool_size = 80M
保存退出。再启动数据库服务:
systemctl start mariadb.service
OK !!!! 顺利启动完成,再登陆到mysql 中就算启动成功了。
分界线------------------------------------------------------------------------------------------------------------------------------------------------------分界线
过了一会,服务器又挂了,what ??? 满脸黑人问号
使用命令:free -mh ,发现内存不多了,查看哪些进程占内存多:ps auxw --sort=%mem ,发现有一堆相同名字的进程占了很多内存:
这是什么鬼,百度后发现这个时php -fpm服务的进程,这个进程有这么多,是因为可以开辟很多子进程,这个服务时可以配置的,修改配置文件:
vim /etc/php-fpm.d/www.conf
找到 pm.max_children
字段,这个是控制子进程的数量的发现其值过大:我的是 pm.max_children
值为50,每一个进程占用1%-2.5%的内存,加起来就耗费大半内存了,所以我们需要将其值调小,将其设置为25,同时,检查以下两个属性:pm.max_spare_servers
: 该值表示保证空闲进程数最大值,如果空闲进程大于此值,此进行清理 pm.min_spare_servers
: 保证空闲进程数最小值,如果空闲进程小于此值,则创建新的子进程;
这两个值均不能不能大于 pm.max_children
值,通常设置 pm.max_spare_servers
值为 pm.max_children
值的60%-80%。max_spare_servers
我设置为20
最后,重启php-fpm:systemctl restart php-fpm,报错了:
原因:这个服务已经在运行这,端口已经被占用了,那就简单了 ,先停掉,再启动即可:
systemctl stop php-fpm
systemctl start php-fpm
这个时候还要吧停掉的数据库服务启动下就好了:systemctl start mariadb.service,完成优化,内存使用情况也变好了。
希望能给遇到同样问题的人填坑。加油