Press "Enter" to skip to content

php-fpm进程过多导致WordPress挂掉事故

今儿打开博客发现WordPress挂掉了,报数据库连接错误。

error establishing a database connection

what? 数据库挂了?

先检查下MySQL是否正常运行

ps -ef | grep mysql

没有起来服务,看来MySQL已经挂掉,看下错误日志。

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


2019-04-24T03:57:26.754207Z 0 [ERROR] InnoDB: Cannot allocate memory for the buffer pool
2019-04-24T03:57:26.754219Z 0 [ERROR] InnoDB: Plugin initialization aborted with error Generic error
2019-04-24T03:57:26.754233Z 0 [ERROR] Plugin 'InnoDB' init function returned error.
2019-04-24T03:57:26.754239Z 0 [ERROR] Plugin 'InnoDB' registration as a STORAGE ENGINE failed.
2019-04-24T03:57:26.754246Z 0 [ERROR] Failed to initialize builtin plugins.
2019-04-24T03:57:26.754251Z 0 [ERROR] Aborting

显示内存不够了。

这个server上并没有跑其他服务,难道别人攻击了?

查看php-fpm服务情况

ps -ef | grep php-fpm

果然,超过12个之多。

翻下php-fpm配置

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

pm = dynamic

pm.max_children = 50

pm.min_spare_servers = 5

pm.max_spare_servers = 35

可以看到默认php-fpm进程是动态分配的,起步5个,最多50个。

那每个进程会消耗多少内存呢?

看下/etc/php.ini

; Maximum amount of memory a script may consume (128MB)
; http://php.net/memory-limit
memory_limit = 128M

默认一个进程要占128M内存。

10个就超过1G内存了,这台server内存才1G,这就能解释MySQL为啥内存不够挂掉了。

OK,问题已经明白,着手调整配置。

主要是调整进程数和单个脚本内存限制。

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

pm = dynamic

pm.max_children = 10

pm.start_servers = 3

pm.min_spare_servers = 3

pm.max_spare_servers = 10

/etc/php.ini

; Maximum amount of memory a script may consume (128MB)
; http://php.net/memory-limit
memory_limit = 64M

小博客暂时够用了,也没啥人看?。后期可以装个WordPress静态插件,减少后端请求。