草庐IT

PHP 5.5.6 随机内存泄漏

coder 2024-04-18 原文

在我们从 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 的网络服务还是普通网站。

最糟糕的是 - Unknown on line 0 这告诉我绝对没有。即使在禁用已注册的 shutdown_function 后,消息也没有改变。

起初我怀疑 PDO dblib + freetds 是罪魁祸首,但是使用 while($row = $query->fetch()) 没有任何进展,如https://bugs.php.net/bug.php?id=64511this question

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

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

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

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

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

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

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

最佳答案

我将自己回答这个问题,以供将来引用。

毕竟真正的错误在 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 中修复)。

关于PHP 5.5.6 随机内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30598181/

有关PHP 5.5.6 随机内存泄漏的更多相关文章

  1. ruby-on-rails - Ruby net/ldap 模块中的内存泄漏 - 2

    作为我的Rails应用程序的一部分,我编写了一个小导入程序,它从我们的LDAP系统中吸取数据并将其塞入一个用户表中。不幸的是,与LDAP相关的代码在遍历我们的32K用户时泄漏了大量内存,我一直无法弄清楚如何解决这个问题。这个问题似乎在某种程度上与LDAP库有关,因为当我删除对LDAP内容的调用时,内存使用情况会很好地稳定下来。此外,不断增加的对象是Net::BER::BerIdentifiedString和Net::BER::BerIdentifiedArray,它们都是LDAP库的一部分。当我运行导入时,内存使用量最终达到超过1GB的峰值。如果问题存在,我需要找到一些方法来更正我的代

  2. ruby-on-rails - Ruby 中的内存模型 - 2

    ruby如何管理内存。例如:如果我们在执行过程中采用C程序,则以下是内存模型。类似于这个ruby如何处理内存。C:__________________|||stack|||------------------||||------------------|||||Heap|||||__________________|||data|__________________|text|__________________Ruby:? 最佳答案 Ruby中没有“内存”这样的东西。Class#allocate分配一个对象并返回该对象。这就是程序

  3. 华为OD机试用Python实现 -【明明的随机数】 2023Q1A - 2

    华为OD机试题本篇题目:明明的随机数题目输入描述输出描述:示例1输入输出说明代码编写思路最近更新的博客华为od2023|什么是华为od,od薪资待遇,od机试题清单华为OD机试真题大全,用Python解华为机试题|机试宝典【华为OD机试】全流程解析+经验分享,题型分享,防作弊指南华为o

  4. 键删除后 ruby​​ 哈希内存泄漏 - 2

    你好,我无法成功如何在散列中删除key后释放内存。当我从哈希中删除键时,内存不会释放,也不会在手动调用GC.start后释放。当从Hash中删除键并且这些对象在某处泄漏时,这是预期的行为还是GC不释放内存?如何在Ruby中删除Hash中的键并在内存中取消分配它?例子:irb(main):001:0>`ps-orss=-p#{Process.pid}`.to_i=>4748irb(main):002:0>a={}=>{}irb(main):003:0>1000000.times{|i|a[i]="test#{i}"}=>1000000irb(main):004:0>`ps-orss=-p

  5. ruby-on-rails - HTTParty 的内存问题和下载大文件 - 2

    这会导致Ruby出现内存问题吗?我知道如果大小超过10KB,Open-URI会写入TempFile。但是HTTParty会在写入TempFile之前尝试将整个PDF保存到内存吗?src=Tempfile.new("file.pdf")src.binmodesrc.writeHTTParty.get("large_file.pdf").parsed_response 最佳答案 您可以使用Net::HTTP。参见thedocumentation(特别是标题为“流媒体响应机构”的部分)。这是文档中的示例:uri=URI('http://e

  6. ruby - 如何在 Ruby 中生成一个非常大的随机整数? - 2

    我想在ruby​​中生成一个64位整数。我知道在Java中你有很多渴望,但我不确定你会如何在Ruby中做到这一点。另外,64位数字中有多少个字符?这是我正在谈论的示例......123456789999。@num=Random.rand(9000)+Random.rand(9000)+Random.rand(9000)但我认为这是非常低效的,必须有一种更简单、更简洁的方法来做到这一点。谢谢! 最佳答案 rand可以将范围作为参数:pa=rand(2**32..2**64-1)#=>11093913376345012184putsa.

  7. ruby-on-rails - 多次选择一个随机数,但绝不会两次选择相同的随机数 - 2

    这个问题在这里已经有了答案:关闭10年前。PossibleDuplicate:HowdoIgeneratealistofnuniquerandomnumbersinRuby?我想做的事:Random.rand(0..10).timesdoputsRandom.rand(0..10)end但如果随机数已经显示过,则无法再次显示。如何最轻松地做到这一点?

  8. ruby - 以随机顺序将数组拆分为多个数组 - Ruby - 2

    我试图在每次运行时以随机顺序将一个名称数组拆分为多个数组。我知道如何拆分它们:name_array=["bob","john","rob","nate","nelly","michael"]array=name_array.each_slice(2).to_a=>[["bob","john"],["rob","nate"],["nelly","michael"]]但是,如果我希望它每次都以随机顺序吐出它们怎么办? 最佳答案 在做同样的事情之前,打乱数组。(Array#shuffle)name_array.shuffle.each_s

  9. ruby-on-rails - 这个 C 和 PHP 程序员如何学习 Ruby 和 Rails? - 2

    按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visitthehelpcenter指导。关闭9年前。我来自C、php和bash背景,很容易学习,因为它们都有相同的C结构,我可以将其与我已经知道的联系起来。然后2年前我学了Python并且学得很好,Python对我来说比Ruby更容易学。然后从去年开始,我一直在尝试学习Ruby,然后是Rails,我承认,直到现在我还是学不会,讽刺的是那些打着简单易学的烙印,但是对于我这样一个老练的程序员来说,我只是无法将它

  10. ruby - 生成X和Y之间的随机数,不包括某些数字 - 2

    有没有办法在ruby​​中生成介于1-100但不包括20、30和40之间的随机数?我可以做类似的事情defrandom_numberrandom_number=rand(100)whilerandom_number==20||30||40random_number=rand(100)endreturnrandom_numberend...但这似乎不是很有效(再加上那个特定的例子可能根本行不通)。有没有更简单的方法?任何帮助深表感谢! 最佳答案 创建一个1到100的数组。从该数组中删除不需要的元素。然后从数组中选择一个随机数。([*1

随机推荐