Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/234.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Nginx-php-fpm在高负载下会阻塞写入连接_Php_Nginx_Debian_Opcode Cache - Fatal编程技术网

Nginx-php-fpm在高负载下会阻塞写入连接

Nginx-php-fpm在高负载下会阻塞写入连接,php,nginx,debian,opcode-cache,Php,Nginx,Debian,Opcode Cache,我们在debian 8系统上使用php5 fpm(5.6)运行了nginx/1.6.2 在过去的几天里,由于有更多的用户访问我们的服务器,我们得到了比平常更高的负载。大多数游客都是在晚上6点到午夜之间来的 几天后,运行上述设置的两台不同的服务器在几个小时内显示出非常慢的响应速度。在Munin,我们看到,突然有数百个nginx连接处于“编写”状态,而以前一次只有20个 在尝试访问这些服务器时,除了远程主机上的连接超时之外,我们没有收到任何错误。我看到的所有日志都很正常 重新启动php5 fpm可修

我们在debian 8系统上使用php5 fpm(5.6)运行了nginx/1.6.2

在过去的几天里,由于有更多的用户访问我们的服务器,我们得到了比平常更高的负载。大多数游客都是在晚上6点到午夜之间来的

几天后,运行上述设置的两台不同的服务器在几个小时内显示出非常慢的响应速度。在Munin,我们看到,突然有数百个nginx连接处于“编写”状态,而以前一次只有20个

在尝试访问这些服务器时,除了远程主机上的连接超时之外,我们没有收到任何错误。我看到的所有日志都很正常

重新启动php5 fpm可修复该问题。

我现在的问题是:为什么突然有数百个进程声称他们正在编写?是否存在一些已知的问题或可能是我们遗漏的配置设置导致了这种情况

以下是我们看到的症状的完整列表:

  • 与<20个非常快速的活动连接/s不同,我们看到最多100到900个连接处于写入状态(所有nginx连接都达到php5 fpm,这些服务器不提供静态内容)。php脚本的平均脚本运行时间为80ms
  • 只有当nginx请求总量超过300/s时,问题才会出现,然后从约350个请求/s下降到约250个请求/s,但这250个请求/s显示多达900个“写入”连接
  • 这些连接中的许多最终会超时,并且没有给出正确的结果
  • 我们的日志中没有错误
  • eth/数据库通信量以及CPU负载对应于总下降的较低级别250req/s,因此不会发生“写入”
对于设置: 如上所述。我们使用Zend的内置操作码缓存,APCu用于某些用户变量缓存,其中一台服务器运行memcache实例(在整个问题中运行良好),另一台服务器运行Redis版本,在问题发生时也运行良好

有人能解释一下问题所在吗


谢谢

我们发现了问题:APCu在PHP5.6中似乎不稳定

详情:

  • debian 8
  • nginx/1.6.2
  • PHP 5.6.14-0+deb8u1
  • APCu 4.0.7(修订版:328290126m shmèU尺寸)
当服务器运行缓慢时(请参见问题),我们使用xhprof分析请求,并注意到APCu每次读/写操作的时间>100ms。清除APCu变量没有帮助。代码的其他部分速度正常

我们完全禁用了APCu的使用,自那时以来,系统一直保持稳定


因此,这个APCu版本在使用PHP5.6加载时似乎不稳定。至少对我们来说是这样。

我们也遇到了同样的问题,原因是Redis中的数据超过了“maxmemory”,因此Redis无法写入更多的数据。我可以使用redis cli登录,但无法设置值,如果您遇到此问题,您可以使用redis cli登录redis并尝试进行设置,如果redis内存已满,则会出现错误