PHP-FPM在执行繁重任务时有太多用户时崩溃

PHP-FPM在执行繁重任务时有太多用户时崩溃,php,mysql,apache,Php,Mysql,Apache,我有一台运行Apache/2.2.22(Debian)、PHP5.6.17(作为FPM)和MySQL 5.6.25的服务器 该项目使用一个名为Redaxo的CMS运行(我认为这没那么重要,但我还是会告诉你)。在Redaxo中,有些功能需要一些时间(例如,删除缓存并重建缓存需要1-2分钟)。在这段时间里,当其他用户访问网站时,FPM因500内部服务器错误而崩溃,我必须多次重新加载页面,直到服务器错误消失并完成处理 我注意到,只有当有太多的用户同时出现在网站上,并且只有在完成繁重的操作时,才会出现这

我有一台运行Apache/2.2.22(Debian)、PHP5.6.17(作为FPM)和MySQL 5.6.25的服务器

该项目使用一个名为Redaxo的CMS运行(我认为这没那么重要,但我还是会告诉你)。在Redaxo中,有些功能需要一些时间(例如,删除缓存并重建缓存需要1-2分钟)。在这段时间里,当其他用户访问网站时,FPM因
500内部服务器错误而崩溃,我必须多次重新加载页面,直到服务器错误消失并完成处理

我注意到,只有当有太多的用户同时出现在网站上,并且只有在完成繁重的操作时,才会出现这种情况

10个用户同时上网=没问题
10个用户同时只是浏览,而缓存删除=每个人500个错误

我通过禁止除我以外的所有人访问该网站(.htaccess deny/allow with ip)来检查这一点。然后我做了大手术,没有问题。当多人再次出现在网站上时,问题又出现了

可能是什么?你需要我提供什么信息

这些值在
php fpm.conf

[global]
pid = /run/php5-fpm.pid
error_log = /var/log/php5-fpm.log
emergency_restart_threshold = 0
include=/etc/php5/fpm/pool.d/*.conf
[projectname]
user = projectname
group = projectname

listen = /var/run/php5-fpm-projectname.sock
listen.owner = projectname
listen.group = projectname
listen.mode = 0660

pm = dynamic
pm.max_children = 150
pm.start_servers = 10
pm.min_spare_servers = 10
pm.max_spare_servers = 30

chdir = /

php_value[upload_max_filesize] = 128M
php_value[max_post_size] = 128M
php_value[max_execution_time] = 180
php_value[memory_limit] = 256M
这些值在特定于项目的
fpm.conf

[global]
pid = /run/php5-fpm.pid
error_log = /var/log/php5-fpm.log
emergency_restart_threshold = 0
include=/etc/php5/fpm/pool.d/*.conf
[projectname]
user = projectname
group = projectname

listen = /var/run/php5-fpm-projectname.sock
listen.owner = projectname
listen.group = projectname
listen.mode = 0660

pm = dynamic
pm.max_children = 150
pm.start_servers = 10
pm.min_spare_servers = 10
pm.max_spare_servers = 30

chdir = /

php_value[upload_max_filesize] = 128M
php_value[max_post_size] = 128M
php_value[max_execution_time] = 180
php_value[memory_limit] = 256M
当脚本失败时,它对MySQL和文件创建有很大帮助(如果有帮助的话)?但是它相当大,所以我不确定我是否应该把它贴在这里?或者这是否是问题所在

apache错误日志显示

[Tue Feb 09 10:54:01 2016] [error] [client {IP}] (104)Connection reset by peer: FastCGI: comm with server "/fcgi-bin-php5-fpm-projectnmae" aborted: read failed
[Tue Feb 09 10:54:01 2016] [error] [client {IP}] FastCGI: incomplete headers (0 bytes) received from server "/fcgi-bin-php5-fpm-projectnmae"
还是这个

[Tue Feb 09 11:00:46 2016] [error] [client {IP}] FastCGI: incomplete headers (0 bytes) received from server "/fcgi-bin-php5-fpm-projectname"
[Tue Feb 09 11:00:48 2016] [error] [client {IP}] (104)Connection reset by peer: FastCGI: comm with server "/fcgi-bin-php5-fpm-projectname" aborted: read failed
fpm日志
说明如下。当然总是不同的时间

[10-Feb-2016 09:40:59] WARNING: [pool projectname] child 10970 exited on signal 7 (SIGBUS) after 50.186611 seconds from start
[10-Feb-2016 09:40:59] NOTICE: [pool projectname] child 11092 started
有时候里面会有这样的警告

[09-Feb-2016 11:00:41] WARNING: [pool projectname] seems busy (you may need to increase pm.start_servers, or pm.min/max_spare_servers), spawning 8 children, there are 0 idle, and 6 total children
[09-Feb-2016 11:00:42] WARNING: [pool projectname] seems busy (you may need to increase pm.start_servers, or pm.min/max_spare_servers), spawning 16 children, there are 0 idle, and 7 total children
下面是更多的调试信息

[18-Feb-2016 17:42:01] WARNING: [pool projectname] child 9088 exited on signal 7 (SIGBUS) after 70.130564 seconds from start
[18-Feb-2016 17:42:01] NOTICE: [pool projectname] child 9205 started
[18-Feb-2016 17:43:55] WARNING: [pool projectname] child 9099 said into stderr: "NOTICE: PHP message: PHP Notice:  Undefined offset: 1181 in /var/www/projectname/htdocs/redaxo/include/classes/class.ooarticle.inc.php on line 44"
[18-Feb-2016 17:43:55] WARNING: [pool projectname] child 9099 said into stderr: "NOTICE: PHP message: PHP Warning:  Invalid argument supplied for foreach() in /var/www/projectname/htdocs/redaxo/include/classes/class.ooredaxo.inc.php on line 134"
[18-Feb-2016 17:43:55] WARNING: [pool projectname] child 9099 exited on signal 7 (SIGBUS) after 183.838886 seconds from start
[18-Feb-2016 17:43:55] NOTICE: [pool projectname] child 9330 started
[18-Feb-2016 17:44:00] WARNING: [pool projectname] child 9101 exited on signal 7 (SIGBUS) after 188.987954 seconds from start
[18-Feb-2016 17:44:00] NOTICE: [pool projectname] child 9336 started

这可能是MySQL服务器的一些锁问题造成的

您必须在延迟期间连接到MySQL主机

  • 如果无法连接,则MySQL服务器或用户允许的并发连接数将用完

  • 如果可以连接,则必须查看mysql命令“showProcessList”返回的内容。现在您有两个选择:

    • 许多“等待查询缓存锁定”:这需要您更改一些MySQL服务器配置。(这可能是由于查询缓存过大造成的)

    • 您有一个需要所有资源的请求,您必须对其进行优化


每次服务器挂断时,如果php和/或Apache达到它们的限制,您都会看到不同的错误

如果您的主机是Unix/Linux,您是否可以在CMS执行任何硬任务时检查命令
$top
的结果

如果您看到内存耗尽,大部分交换内存被填满,CPU位于顶部,请尝试调整php.ini的内存限制以分配资源。但您可能需要增加资源、内存和CPU


如果内存和CPU不忙,可能是因为您为php分配的内存比预期的少。您可以运行更多的php fpm工作程序,减少每个进程的内存限制,。。。看见还可以查看Apache内存和CPU配置。

除非您有足够的可用RAM(比如超过16GB的可用内存),否则我建议您的资源不足,这将导致500错误

您的配置是,您可以生成多达150个PHP-FPM进程,每个进程可以使用256MB的内存—仅此一项就可以使PHP-FPM服务器使用超过38GB的内存,如果不可用,将导致500个错误

计算每个服务器可以使用的内存,然后正确设置。这个CMS需要高达256MB的内存吗?它能用更少的内存(比如32MB)运行吗?如果MySQL、Apache和Nginx位于同一台服务器中,请将各自使用的内存分开,然后为
pm.max\u children
php\u value[memory\u limit]
设置适当的值

请注意,资源的缺乏是系统范围内的,因此如果您的PHP进程使用了所有可用内存,MySQL可能会因为资源不足而崩溃(这可能是找不到记录的原因)

如果您能说出您有多少可用内存,我可以帮助您配置这些数字


在发出缓存删除之前,最好先知道有多少内存可用,以及在运行时有多少内存可用——这可能确实占用了太多内存,并使其他进程窒息(如果它使用PHP-CLI,则可能没有内存限制).

我已经盯着这个看了几天了,终于决定增加我2美分的价值

我已经使用FPM很长一段时间了,这是一件很棒的事情,但是使用它来获得可伸缩的配置是另一回事。有很多问题可能会导致你的问题,但我有一个怀疑

我想把重点放在输出中出现的PHP错误上,因为它们表明出现了不应该出现的错误。我想知道,当您清除缓存和用户浏览站点时,他们是否同时提取不完整的数据,因为某些信息被删除或正在重建。您甚至可能会看到缓存被删除,同时缓存新内容的情况。我还没有看过缓存删除的CMS代码,但是您显示的PHP错误似乎表明在这个过程中提取了一些无效数据

要尝试的一件事是在删除缓存之前显式锁定表,然后释放它们。这样,当删除内容时,用户不能读取或写入数据。在您调用以清除缓存的任何脚本中,尝试添加查询
锁定表articles WRITE、othertable WRITE、anyothertable WRITE
。这将防止其他会话(用户)在清除缓存时读取或更新这些表

如果用户试图加载一个页面,而该页面却没有给他们任何反馈,那么他们就会不耐烦