2012-01-11 60 views
1

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

我开发了尚未推出的网站。随机存取内存错误。有时服务器会崩溃。有助于重新启动。没有其他人使用应用程序,所以没有重负载。特别是超过了特权限制。我尝试了一些一般的东西 - 增加/减少PHP内存限制,寻找错误日志,记录缓慢的MySQL查询。没有...一样。

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

这里有一些问题和mysts对我来说。

  1. 为什么这两个进程在没有来自浏览器的活动请求的情况下运行那么久?我怎样才能防止他们?
  2. 为什么我在重新启动后有+ 40%的空闲内存,当我有10 + 5 + 4 + 3 + 0.5内存使用的Apache?这不应该是平等的?
  3. 这可能是内存泄漏吗?我如何检测它们?
  4. 我应该用什么技术从较高层次降低到低层次?想象一下,在我的一个函数中我有'内存泄漏',我应该如何让他在整个应用程序中?
  5. 如何基准我的特殊功能的内存和CPU使用率?
  6. 为什么服务器崩溃?即使基本的httpd重启正在返回“fork:无法分配内存”。这可能是内存泄漏的症状吗?

请逐点回答。

+0

您是否使用过任何注重性能的模块(例如[from this list])(http://drupal.org/project/modules?filters=tid%3A123%20drupal_core%3A103%20bs_project_sandbox%3A0&solrsort=sis_project_release_usage%20desc ))?当你使用一些分析器时你看到了什么?你是否执行一些不寻常的任务,例如。用你自己的模块(比如用每个请求重建菜单)?你使用缓存吗? – Tadeck 2012-01-11 08:44:37

+0

未使用性能模块。这不应该是发展中的问题,是的?一定要在生产中使用。我有一些自定义代码影响每一个请求,但我几乎可以肯定没有什么重要的东西。 – 2012-01-11 08:55:46

+2

您可以使用一些性能分析模块,这些模块将列出执行的功能和/或数据库查询以及执行所需的内存使用情况和时间。它可以缩小问题的范围。当涉及到这个自定义代码时,你可能是错的,这完全取决于。例如。如果做得不正确,修改菜单可能会造成一些主要的性能下降。 – Tadeck 2012-01-11 09:08:35

回答

1

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

Linux有东西存放在内存中,如果有另一个RAM进程突然需要,并且RAM没有被占用,Linux会为需要的应用程序释放/交换它。检查“免费”的输出,你会注意到一个缓存列,指出只有缓存,并可以在任何时候释放。

+0

好的,例如我有GD的问题,但我不知道它。我应该如何调试和理解问题出现在GD中?你如何做这样的事情? – 2012-01-11 10:15:05

+1

PHP通常会返回内存中的哪一行,然后从那里开始并向后注释代码块,直到找到内存管理器。你可以像@kidata所说的那样使用xdebug,但我不知道从哪里开始,真正的开发人员不使用调试器*(笑话)* – Geoffrey 2012-01-11 10:18:29

+0

我不知道你是如何预测的,但GD函数似乎有些问题: D – 2012-01-11 10:36:53