[英]Memory leak when run Drupal on linux apache, but same application wont leak mem on windows server
当前我的网站正在使用drupal 6,apache http正在使用prefork mpm。 当我测试我的Web应用程序时,内存根本不会释放,它只会增加内存使用量。 但是,在Windows上,它使用mpm_winnt.c可以正常工作,而不会发生内存泄漏。
如果我将其更改为在Linux服务器上使用worker.c,是否可以正常工作?
工作者模式不适用于Apache的mod_php。 因为如果已知PHP5是启用多线程的,则并非所有PHP库和扩展都并非如此(例如,语言环境调用将对apache进程中的所有PHP线程强制执行语言环境设置)。
因此,请勿使用辅助模型。 除非您在Apache之外使用PHP(与php-fpm一起使用)。 在Windows上,您可能会遇到相同的线程损坏问题(但正式地,Windows上的PHP发行版被认为是线程安全的,只要您不添加自编译的PHP外部组件...)。
当你说 :
内存根本不会释放
我不确定您是否完全了解正在发生的事情。 Apache将派生大量子进程。 如果您在这些子代上使用Drupal6应用程序,并为PHP设置了一个较大的memory_limit,则可以肯定的是Drupal将使用此内存限制,因此,如果您说您的Apache子进程为128M,则运行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,那么您很快就会遇到相同的问题。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.