【发布时间】:2015-08-16 08:52:11
【问题描述】:
在我们从 PHP 5.3.3 迁移到 PHP 5.5.6 和 Apache 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=64511 或this question 中所述,使用while($row = $query->fetch()) 无处可寻。
到目前为止我已经尝试过:
- xdebug
- memory_usage() 日志记录
- httpd 上的 strace
它们都表明内存分配处于完美状态。
只有strace 显示了一些承诺,因为在每个out of memory 抛出异常之前,都会有一堆munmap 调用,这表明内存不断减少,然后突然抛出异常。虽然我不确定它是否可靠,因为日志有时看起来很混杂(来自不同的调用)。
有没有人遇到过类似的事情?
调试此问题的最佳步骤是什么?
目前,我不知道我能做些什么来解决这个问题......
【问题讨论】:
-
所以您需要帮助追踪泄漏源吗?运行不同的脚本,看看它是在每个页面上还是在特定页面上。如果它发生在每个脚本上,请检查您的包含,删除部分/全部。如果我们能够找到负责的脚本,将更容易追踪。
-
说起来容易做起来难。它发生在众多网站上并发生在应用程序上。平均每30分钟一次?有时会安静 2 小时
-
我建议您记录使用情况并记录它何时尝试发现任何模式。
标签: php apache pdo memory-leaks freetds