我正在使用一个用 Drupal 构建的网站,该网站通常运行良好。经过一些优化后,大多数请求需要 20-75MB 内存和 0.5-2 秒。但偶尔会需要 15-20 秒,并且该过程会占用超过 1GB 的内存。
我尝试跟踪 PHP 执行开始和结束时的时间和内存使用情况(将代码放入 Drupal 的 index.php 中),结果没有发现任何异常(报告显示开始和结束时相差 1 秒,内存使用量在一个示例中上升了 72MB)。不知何故,PHP 占用了大量资源,但实际的 PHP 代码中却没有。
这个问题最早是在 apache 中发现的。迁移到新服务器(使用标准 Ubuntu 软件包)后,网站会更可靠一些,但这种情况仍然会发生。即使切换到 nginx+php-fpm 并完全关闭 apache,php-fpm 进程仍会显示相同的内存使用模式。除了标准 PHP 模块外,唯一的附加模块是 memcache、stats 和 xhprof。
什么可以揭示为什么 PHP 在脚本本身之外使用了这么多的内存?
答案1
我相信内存泄漏在 php 及其库中相当常见。此外,通常 PHP 操作码缓存会占用提供给 PHP 的大部分内存。
您是否 100% 确定您有用于问题情况的 xhprof 转储文件并且它没有显示过多的内存使用情况?
如果您是对的 - 您需要使用 gdb 创建和分析可疑 PHP 进程的核心转储 - 它需要一些基本的 C 知识。
还请检查您的 php 和 libs 版本的错误跟踪器。
答案2
原来,一个函数使用 register_shutdown 在主代码结束后运行(以显示调试信息)。这解释了为什么它没有显示在我所做的日志记录中,也没有显示在 xhprof 中,后者在关闭函数之前结束。修改这一点似乎暂时解决了这个问题。
答案3
您可能在 Drupal 中启用了低效的模块。首先禁用所有这些模块,看看是否有什么变化。
此外,听起来你的踪迹并不是真实的跟踪,看看这个以获得更好的跟踪:http://www.youtube.com/watch?v=eF-p--AH37E
操作码缓存(APC)只能让您在性能方面获得有限的帮助,因此我最后会去那里提高性能。