小内存服务器引发的mariadb无法连接问题

由于资源限制问题,有一套PHP的系统部署在一台512M内存的服务器上。系统是centos8,采用nginx + php-fpm + mariadb的方式部署服务。因为这套系统每天也没有几个用户请求的,并且一开始也没什么问题。但是某一天,点击多几次页面之后,就出现数据库无法连接。并且无法使用systemctl去重启mariadb,然后从maraidb的日志得出内存不足的信息。

It is possible that mysqld could use up to key_buffer_size

日志出现上面的信息,既然内存不足,那么直接加内存即可。但是由于某些原因不能升级服务器,那么好办,直接加虚拟内存。似乎问题得到解决,但过不了多久,变成了请求504错误。

这个时候就应该登录服务器去分析问题,结果服务器也登录不了了,在云服务商的面板看了一下,发现读磁盘高达100m每秒。怎么会有这么高的IO呢?很简单的原因,因为配置了虚拟内存,应该是内存不断读取,结果变成了磁盘读写。只好先强制重启服务器,再去处理。

首先,不再配置虚拟内存,而是要降低一下内存的使用。所以先修改mariadb的配置,结果依旧。然后通过命令查询占用内存过多的进程列表。结果发现大量php-fpm进程,原因应该就是php-fpm了。那么直接限制php-fpm的进程数量,问题到此完美解决。