显然随机内存耗尽错误

Posted

技术标签:

【中文标题】显然随机内存耗尽错误【英文标题】:Apparently random memory exhausted error 【发布时间】: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,但没有帮助。 【参考方案1】:

在我看来,您有一些行为不佳的 PHP 脚本和/或 PHP 的最大允许内存过高。 Memory_limit * max processes with some 15mb per process to idle 永远不应高于可用内存。如果您需要更多内存来处理某些请求,您应该设置一个具有更少最大 procs 的额外池。

还要考虑清漆会占用相当大的内存。限制缓存大小和最大并发连接数。每个连接都使用内存,但数量很大程度上取决于您的 VCL 和请求的大小(包括标头)。

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

【讨论】:

也许我错了,但据我了解,“允许的内存大小已用尽”错误与最大进程或可用总内存无关。如果这是问题,我认为错误将是“内存不足”。

以上是关于显然随机内存耗尽错误的主要内容,如果未能解决你的问题,请参考以下文章

Symfony 4 生产模式错误处理页面内存耗尽

超大表导致允许的内存大小为 x 字节耗尽错误

Php致命错误:使用composer安装用户捆绑时内存大小耗尽

错误:向量内存耗尽(达到限制?)R 3.5.0 macOS

如何修复 PHPExcel 耗尽的内存?

使用 php://input 耗尽内存