【问题标题】:Memory leak when run Drupal on linux apache, but same application wont leak mem on windows server在 linux apache 上运行 Drupal 时内存泄漏,但相同的应用程序不会在 Windows 服务器上泄漏内存
【发布时间】: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


    【解决方案1】:

    工作模式不适用于 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,那么您很快就会遇到同样的问题。

    • 为 MaxClients 设置较低的值(小于一个进程的可用 RAM/平均 RAM),
    • 将 MySQL 服务器推送到另一台服务器上,同时也是大内存消耗者
    • 尝试找到 memory_limit 的下限(这对于 Drupal 来说可能非常困难,但检查所有 Drupal 分析模块,并检查块的所有可见性设置,您会得到很好的提示)
    • 如果您的项目很大,请购买几台 apache 服务器并构建一个具有 http 负载平衡的解决方案。
    • 在 fastcgi 模式下使用 php(如 php-fpm),这样至少所有非 php 页面都将与工作 apache 服务器一起使用(但您会遇到相同的 RAM 使用问题在你的 fastcgi php 服务器中)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-06-28
      • 1970-01-01
      • 2023-03-21
      • 1970-01-01
      • 1970-01-01
      • 2012-08-23
      • 1970-01-01
      相关资源
      最近更新 更多