【问题标题】:PHP 5.5.6 Random memory leakPHP 5.5.6 随机内存泄漏
【发布时间】:2015-08-16 08:52:11
【问题描述】:

在我们从 PHP 5.3.3 迁移到 PHP 5.5.6Apache 2.4 之后,在 Kohana 3.3 上运行的每个站点都会不时遇到 Out of memory 异常。

完整的错误信息

PHP Fatal error:  Allowed memory size of 268435456 bytes exhausted (tried to allocate 140316914598360 bytes) in Unknown on line 0

PHP 说它会尝试分配127TB 的内存(最后的字节数发生了变化,但仍然在 TB 左右)。它完全随机发生。有时你会连续几个小时没有问题,然后突然出现 1 条甚至 10 条内存不足的消息。它发生在所有项目中,无论是连接到 MySQL、MSSQL 或 MongoDB 的 Web 服务还是普通网站。

最糟糕的是 - Unknown on line 0 它告诉我什么都没有。即使禁用注册的shutdown_function,消息也没有改变。

起初我怀疑PDO dblib + freetds 是罪魁祸首,但如https://bugs.php.net/bug.php?id=64511this question 中所述,使用while($row = $query->fetch()) 无处可寻。

到目前为止我已经尝试过:

  • xdebug
  • memory_usage() 日志记录
  • httpd 上的 strace

它们都表明内存分配处于完美状态。

只有strace 显示了一些承诺,因为在每个out of memory 抛出异常之前,都会有一堆munmap 调用,这表明内存不断减少,然后突然抛出异常。虽然我不确定它是否可靠,因为日志有时看起来很混杂(来自不同的调用)。

有没有人遇到过类似的事情?

调试此问题的最佳步骤是什么?

目前,我不知道我能做些什么来解决这个问题......

【问题讨论】:

  • 所以您需要帮助追踪泄漏源吗?运行不同的脚本,看看它是在每个页面上还是在特定页面上。如果它发生在每个脚本上,请检查您的包含,删除部分/全部。如果我们能够找到负责的脚本,将更容易追踪。
  • 说起来容易做起来难。它发生在众多网站上并发生在应用程序上。平均每30分钟一次?有时会安静 2 小时
  • 我建议您记录使用情况并记录它何时尝试发现任何模式。

标签: php apache pdo memory-leaks freetds


【解决方案1】:

我将为自己和将来参考回答这个问题。

毕竟真正的错误在pdo_dblib。根据这个错误 - 我昨天发现的 https://bugs.php.net/bug.php?id=67130 PDOStatement::nextRowset() 导致内存损坏,从而导致我们所有的问题。我通过删除这部分代码来验证它,并让它在没有它的情况下在“高峰”流量中运行 12 小时。

此错误已与 https://bugs.php.net/bug.php?id=64511 一起修复,我一开始并没有注意到这两个是相关的。

我们的系统在 CentOS 上运行,PHP 是从 Software Collections 安装的,因此我们下载了该模块的源代码并手动应用了补丁,因为来自 Remi 的 RPM 存储库的同一软件包的两个版本不起作用或不兼容。

这真的很有趣,因为我们从5.3.3 迁移到5.5.6 是因为https://bugs.php.net/bug.php?id=57593(有几个错误报告和功能请求)其中PDOStatement::nextRowset() 没有实现(在5.3.7 中已修复)。

【讨论】:

    猜你喜欢
    • 2019-05-15
    • 2016-01-27
    • 1970-01-01
    • 2016-02-10
    • 2023-03-17
    • 2012-04-17
    • 2012-01-12
    • 2017-01-28
    • 2016-03-30
    相关资源
    最近更新 更多