大文件上载消耗不成比例的内存量

更多地思考这个问题,问题实际上是:为什么Apache在内存中而不是在磁盘上进行正在进行的上载? 我应该可以上传一个大于服务器可用内存总量的文件。

PHP永远不会进入方程,因为上传永远不会结束,并且Apache在将文件传递给PHP之前就会死亡。

很奇怪。 我一直在Googlesearch几个小时,无济于事。


我有一个VPS有512 MB内存,我试图上传100-250 MB之间的文件。 文件高达100 MB工作正常,但任何结束,我遇到内存问题。

下面是从top的输出,因为我试图上传一个130 MB的文件,紧接在PID 18367被杀害之前:

 top - 09:43:06 up 6 days, 9:31, 1 user, load average: 0.00, 0.00, 0.00 Tasks: 51 total, 1 running, 50 sleeping, 0 stopped, 0 zombie Cpu(s): 0.2% us, 0.1% sy, 0.0% ni, 99.8% id, 0.0% wa, 0.0% hi, 0.0% si Mem: 916144k total, 916144k used, 0k free, 0k buffers Swap: 0k total, 0k used, 0k free, 0k cached PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 18367 apache 16 0 721m 393m 2288 S 0 44.0 0:01.90 httpd 

不知何故,它使用一个130 MB的文件393 MB的内存? (更不用说,只有大约80%的文件已经上传了。)我无法想象httpd在这个空间里做了什么。

在Apache的错误日志看,我看到:

 [Tue Feb 01 09:43:07 2011] [error] (12)Cannot allocate memory: fork: Unable to fork new process [Tue Feb 01 09:43:17 2011] [notice] child pid 18367 exit signal Segmentation fault (11) 

我不确定这是否是软件堆栈(CentOS,Apache和PHP通过mod_fcgid)的限制,或是Apache或PHP的错误configuration。

我在我的vhost.conf中使用了下面的mod_fcgid指令,但效果不大:

 MaxRequestInMem 1048576 

是否有类似的Apacheconfiguration值,我应该调整?

感谢您的考虑。

这是mod_fcgid中的一个已知错误 ,但显然mod_fcgid体系结构很难全面解决。

目前,你可以做的最好的是升级到mod_fcgid 2.3.7(或更高版本)。 它具有增强function ,至less在file upload分配完毕后的某个时候释放内存。 尽pipe如此,迄今为止我的经验是可以花费半个多小时才能回收记忆。

我怀疑除了上传者脚本(作者)之外,还有其他的限制。

我之前用apache + php(和horde)看过类似的问题。 尝试添加到您的Apacheconfiguration:

  php_value memory_limit 150M php_value post_max_size 150M php_value upload_max_filesize 150M 

我不是100%确定如果memory_limit可以在Apacheconfiguration中设置。 这可能需要在php.ini中设置。 或者,您也可以设置:

  php_value max_execution_time 180 php_value max_input_time 180