【问题标题】:Debugging LAMP/CakePHP site memory leak?调试 LAMP/CakePHP 站点内存泄漏?
【发布时间】:2018-02-27 02:16:52
【问题描述】:

我在 AWS 上运行一个基于 CakePHP 2.2.3、PHP 5.6.32 和 MySQL 数据库的站点。最近,我遇到了服务器崩溃的问题,这些问题似乎是在服务器内存不足时开始的。

我已设置 CloudWatch 来监控内存使用情况,并在过去几天看到以下情况(服务器在大约 5 天前重置):

在服务器上运行 'top' 会产生相同的内存使用结果。

对我来说这看起来像是内存泄漏(对吗?),但我的理解是 PHP 5.6 应该进行垃圾收集。我根本没有在我的代码中使用显式内存分配,但不能排除 CakePHP 使用的可能性。或许 PHP 完全没有问题。

我是网络开发的新手,不知道从哪里开始。由于分配量大,Google 搜索返回了 OOM 错误的解决方案,但这不是这里的问题。什么可能导致网站显示出像这样几乎单调增加的内存使用量?我该如何寻找罪魁祸首?

编辑:“top”的输出在下方按内存使用情况排序,以防有帮助。

编辑 2:'atop -m' 的输出如下。

【问题讨论】:

  • top,哪个进程正在吃掉所有的内存?
  • 此时屏幕截图没有任何问题。要获得更好的历史数据,请使用atop
  • 为什么是“PHP 5.6.32”,种类的旧
  • @JasonCooper atop 记录统计信息,因此下次发生时您可以获得更好的图片。目前数字看起来不错,您的服务器没有任何问题。
  • @JasonCooper 是的,我会说它或多或少是正确的。

标签: php mysql amazon-web-services cakephp memory-leaks


【解决方案1】:

我的建议是连接到分析服务https://blackfire.iohttps://newrelic.com。他们具有深入的分析和日志记录,并且在资源分配以及哪个脚本/模块是罪魁祸首时可以非常精确。

除此之外,如果您知道您的应用程序可能在哪里出现问题,您可以使用 strace (https://linux.die.net/man/1/strace) 附加到您的 PHP 进程以查看堆栈输出并执行这些脚本/ modules.... strace 在调试 php 进程时非常方便。

祝你好运!

【讨论】:

    【解决方案2】:

    我进入了 Cakephp 的 Mysql.php 代码,并在 closeCursor 之后将每个变量设置为 null,例如:

    $cols->closeCursor(); $cols = null;
    

    这阻止了我们的内存泄漏和崩溃。它通常在最大内存时达到顶峰并在一段时间后崩溃。

    【讨论】:

      猜你喜欢
      • 2010-12-01
      • 2021-01-10
      • 2010-11-23
      • 2018-11-22
      • 1970-01-01
      • 1970-01-01
      • 2013-09-28
      • 2010-10-14
      • 1970-01-01
      相关资源
      最近更新 更多