显然随机内存耗尽错误

时间:2015-01-19 23:43:39

标签: php symfony memcached varnish http-status-code-503

我有一个奇怪的问题,我无法调试。 我有一个在Symfony2上编码的应用程序,分布在负载均衡器后面的三个Web服务器中。每个网络服务器上都有一个Varnish实例。

随机时间,一些网络服务器 - 一个或两个,很少全部 - 在主页上响应503错误大约10分钟左右然后一切都恢复正常。

错误是由PHP允许的内存大小耗尽致命错误引起的。但是我无法理解为什么相同的应用程序,使用相同的代码,连接到同一个数据库等,从一个时刻到另一个时刻失败,然后再次恢复正常。即使是具有相同硬件和软件的不同服务器上的相同应用程序也会同时表现不同。

我的第一个猜测是,Varnish缓存在发生故障的服务器上过期,而正常运行的缓存仍然有一个没有错误的新副本缓存。但是如果我手动刷新所有服务器上的缓存,那么没有错误的服务器会响应200 OK并且缓存会成功重新生成,而其他服务器会一直失败。

而且只是为了变得更奇怪......我意识到同一个URL失败并且有一些随机查询参数与其他一些参数正确响应。我的意思是在代码中什么都不做的论点。

我对如何调试此问题的想法不足。任何线索都会得到真正的体会。谢谢!

更新: 我还使用Memcached来缓存Doctrine查询和结果。当Doctrine尝试在Memcached中存储内容时,会触发内存耗尽错误。第一个猜测是认为这是试图存储一个非常大的结果,但它仍然无法解释为什么它在一个网络服务器上失败,而其他网络服务器没有问题,所有这些都处理相同的问题来自同一个数据库的查询。

1 个答案:

答案 0 :(得分:0)

对我而言,听起来你有一些表现不佳的PHP脚本和/或PHP的最大允许内存太高。每个进程大约15mb的Memory_limit * max进程应该永远不会高于可用内存。如果某些请求需要更多内存,则应设置一个额外的池,其中包含较少的最大触发量。

另外还要考虑清漆可以占用相当大的内存。限制高速缓存大小和最大并发连接。每个连接都使用内存,但ammount高度依赖于您的VCL和请求的大小(包括标头)。

如果将清漆放在负载均衡器层,它可能会更容易处理并确保提供更好的缓存效率。