在linux下运行Drupal时出现内存泄漏apache,但同样的应用程序不会在windows服务器上泄漏mem

目前我的网站使用的是drupal 6,apache的http使用的是prefork mpm。 当我testing我的Web应用程序时,内存不会释放,它只是增加了内存使用量。 但是,在Windows上,它使用mpm_winnt.c,它工作得很好,没有内存泄漏

如果我将其更改为在我的Linux服务器上使用worker.c,它会工作吗?

Solutions Collecting From Web of "在linux下运行Drupal时出现内存泄漏apache,但同样的应用程序不会在windows服务器上泄漏mem"

工作者模式不适用于Apache的mod_php。 因为如果已知PHP5是启用多线程的,那么对于所有的PHP库和扩展来说都不是这样(例如一个语言环境调用将强制执行apache进程中所有PHP线程的语言环境设置)。

所以,不要使用工人模型。 除非你使用PHP以外的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的内存结束。 现在在Linux上,使用可用RAM的事实不成问题,您可以将其视为一件好事。 你有内存可用,为什么不使用它? 你的问题可能是你没有这个数量的RAM(这里只有12.5G的Apache)

你可以使用MaxRequestsPerChild强制执行一个apache子进程的死亡,比方说值为100,然后在一个由apache子进程处理的100个请求之后,它将被终止并重新创建。 但是,如果你所有的请求都需要128M的内存,你很快就会遇到同样的问题。

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