【发布时间】:2015-03-18 02:23:12
【问题描述】:
我遇到了一个无法调试的奇怪问题。 我有一个通过 Symfony2 编码的应用程序,分布在负载均衡器后面的三个网络服务器中。每个网络服务器上都有一个 Varnish 实例。
在随机时间,一些网络服务器(一两个,很少全部)在主页上响应 503 错误大约 10 分钟左右,然后一切恢复正常。
该错误是由 PHP Allowed memory size exhausted 致命错误引起的。但我无法理解的是为什么同一个应用程序,使用相同的代码,连接到同一个数据库等。从一个时刻到另一个失败,然后再次恢复正常。甚至在具有相同硬件和软件的不同服务器上的相同应用程序也会同时表现出不同的行为。
我的第一个猜测是,Varnish 缓存在故障服务器上过期,而正常运行的服务器仍然缓存了一个没有错误的新副本。但是如果我手动刷新所有服务器上的缓存,没有错误的服务器会以 200 OK 响应,并且缓存会成功重新生成,而其他服务器则一直失败。
只是为了变得更奇怪......我意识到相同的 URL 因某些随机查询参数失败而与其他一些参数正确响应。我的意思是在代码中什么都不做的参数。
关于如何调试这个问题,我已经没有什么想法了。任何线索将不胜感激。谢谢!
更新: 我还使用 Memcached 来缓存 Doctrine 查询和结果。当 Doctrine 尝试在 Memcached 中存储某些内容时,会触发 Memory exhausted 错误。第一个猜测是认为它试图存储一个非常大的结果,但它仍然无法解释为什么它在一个网络服务器上失败而其他网络服务器没有问题,并且所有这些都在处理来自同一个数据库的相同查询。
【问题讨论】:
-
如果我不得不猜测,APC 会填满并恐慌。
-
@castis 哇,我忘了提到我正在使用操作码缓存,但我不知道它会导致 PHP 出现内存耗尽错误。我一定会调查的!我会告诉你这是否能解决问题。非常感谢。
-
@castis 实际上我使用的是 Opcache - 而不是 APC。我尝试在错误发生时重置 Opcache,但没有帮助。
标签: php symfony memcached varnish http-status-code-503