【发布时间】:2011-12-05 19:53:56
【问题描述】:
目前我的网站使用的是 drupal 6,apache http 使用的是 prefork mpm。 当我测试我的 Web 应用程序时,内存根本不会释放,它只会增加内存使用量。 但是在 windows 上,它使用 mpm_winnt.c ,效果很好,没有内存泄漏。
如果我将其更改为在我的 linux 服务器上使用 worker.c 是否有效?
【问题讨论】:
标签: php linux apache memory-leaks
目前我的网站使用的是 drupal 6,apache http 使用的是 prefork mpm。 当我测试我的 Web 应用程序时,内存根本不会释放,它只会增加内存使用量。 但是在 windows 上,它使用 mpm_winnt.c ,效果很好,没有内存泄漏。
如果我将其更改为在我的 linux 服务器上使用 worker.c 是否有效?
【问题讨论】:
标签: php linux apache memory-leaks
工作模式不适用于 Apache 的 mod_php。因为如果已知 PHP5 支持多线程,那么实际上并非所有 PHP 库和扩展都是如此(例如,语言环境调用将强制 apache 进程中所有 PHP 线程的语言环境设置)。
所以,不要使用工人模型。除非您在 Apache 之外使用 PHP(使用 php-fpm)。而在 Windows 上,您可能会遇到相同的线程损坏问题(但官方认为,Windows 上的 PHP 发行版是线程安全的,因此只要您不添加自编译的 PHP 外部组件...)。
当你说:
内存根本不会释放
我不确定您是否完全了解正在发生的事情。 Apache 将分叉大量子进程。如果您在这些子进程上使用 Drupal6 应用程序并允许 PHP 使用较大的 memory_limit,您可以确定 Drupal 将使用此内存限制,因此如果您说 128M 您的 apache 子进程,运行 PHP 将占用此 RAM(如果 Drupal 要求,但是有视图的 Drupal 肯定是一个很好的 RAM 食客)。当请求结束时,Apache 子进程不会释放 RAM,因为下一次查询可能需要相同的数量。因此,如果您允许 100 个 MaxClients 到 Apache 和 128M 的内存限制,您最终可能会得到 128M*100=12,5Go 的 RAM。现在在 Linux 上,使用可用 RAM 不是问题,您可以认为这是一件好事。您有可用的 RAM,为什么不使用它?您的问题可能是您没有这个数量的 RAM(这里是 12.5G,仅适用于 Apache)
您可以使用 MaxRequestsPerChild 强制 apache 子进程终止,假设值为 100,然后在 apache 子进程处理 100 个请求后,它将被杀死并重新创建。但是,如果您的所有请求都需要 128M 的 RAM,那么您很快就会遇到同样的问题。
【讨论】: