【问题标题】:PHP Application performancePHP 应用程序性能
【发布时间】:2012-01-11 08:35:00
【问题描述】:

首先我想说的是,我使用 Drupal 作为 CMS,并且我知道有单独的 Drupal stackexchange 站点。但我的问题不是 Drupal 特定的,它不在用户或高级用户级别。它与 PHP 和服务器相关。好的,现在问题。

我已经开发了尚未启动的网站。我随机出现内存错误。有时服务器会崩溃。帮助重启。没有其他人在使用应用程序,因此没有繁重的负载。特别是超出 privmmpages 限制。我尝试了一些一般的事情——增加/减少 PHP 内存限制,查看错误日志,记录缓慢的 MySQL 查询。没什么……一样。

我已经运行了 'top' linux 命令。根据浏览器请求,有 4-5 个 apache 进程。其中 MEM 使用率(%)分别为 10、5、4、3、0.5。两个进程正在运行 > 10 小时。 重新启动 apache 后,我获得了 +40% 的可用内存。

这里有一些问题和谜团。

  1. 当没有来自浏览器的活动请求时,为什么两个进程运行这么长时间?我该如何预防?
  2. 当我有 10+5+4+3+0.5 的内存被 apache 使用时,为什么我在重新启动后获得了 +40% 的可用内存?这不应该相等吗?
  3. 这可能是内存泄漏吗?如何检测它们?
  4. 我应该使用什么技术从较高级别降到低级别?想象一下,我的一个函数中有“内存泄漏”,我应该如何让他进入整个应用程序?
  5. 如何对我的特定函数的内存和 CPU 使用率进行基准测试?
  6. 为什么服务器崩溃了?即使是基本的 httpd restart 也会返回“fork:无法分配内存”。这可能是内存泄漏的症状吗?

请逐点回答。

【问题讨论】:

  • 您是否使用过任何注重性能的模块(例如来自this list)?当您使用一些分析器时,您会看到什么?您是否执行一些不寻常的任务,例如。使用您自己的模块(例如根据每个请求重建菜单)?你使用缓存吗?
  • 尚未使用性能模块。这不应该是开发中的问题,是吗?一定要在生产中使用。我有一些自定义代码会影响每个请求,但我几乎可以肯定没有什么沉重的东西。
  • 您可以使用一些分析模块,这些模块将列出已执行的函数和/或数据库查询以及内存使用情况和执行时间。它可以缩小问题的范围。当谈到这个自定义代码时,你可能错了,这一切都取决于。例如。如果操作不当,修改菜单可能会对性能造成重大影响。

标签: php performance debugging profiling benchmarking


【解决方案1】:

听起来你可能在某处有一个无限循环,或者你在处理诸如 GD 之类的事情时没有释放资源。

Linux 在有空闲 ram 时将内容保存在 RAM 中,如果另一个进程突然需要 RAM,并且 ram 没有被占用,Linux 将释放/交换它以供需要的应用程序使用。查看“free”的输出,你会注意到一个cached列,表示刚刚缓存了多少,可以随时释放。

【讨论】:

  • 好的,例如我对 GD 有问题,但我不知道。我应该如何调试并理解问题出在 GD 中?你是怎么做这样的事情的?
  • PHP 通常会返回它耗尽 RAM 的那一行,从那里开始并向后注释代码块,直到找到内存占用。您可以使用@kidata 提到的xdebug,但我不知道从哪里开始,真正的开发人员不使用调试器(笑话)
  • 我不知道你是怎么预测的,但是GD函数似乎有问题:D
  • 很高兴听到 :),这通常是因为 ram 中的未压缩图像对于真彩色图像可能非常大(w * h * 3)字节,对于带有 alpha 的真彩色图像可能是 * 4。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-07-30
  • 1970-01-01
  • 2022-11-11
  • 2012-05-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多