Uploads grandes de arquivos consomem uma quantidade desproporcional de memória

1

Pensando nisso mais, a questão é: por que o Apache está colocando um upload em progresso na memória em vez de no disco? Eu deveria poder carregar um arquivo maior do que a memória total disponível para o servidor

O PHP nunca entra na equação, pois o upload nunca termina, e o Apache morre antes de poder passar o arquivo para o PHP.

Muito estranho. Eu estive pesquisando por horas, sem sucesso.

Eu tenho um VPS com 512 MB de RAM e estou tentando fazer upload de arquivos entre 100 e 250 MB. Arquivos de até cerca de 100 MB funcionam bem, mas qualquer coisa além disso e eu me deparo com problemas de memória.

Aqui está a saída de top enquanto tento fazer o upload de um arquivo de 130 MB, imediatamente antes da morte do 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  

De alguma forma, ele está usando 393 MB de memória para um arquivo de 130 MB? (Sem mencionar que apenas 80% do arquivo foi carregado.) Não consigo imaginar o que o httpd está fazendo com todo esse espaço.

Olhando no log de erros do apache, vejo:

[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)

Não tenho certeza se isso é uma limitação da pilha de software (CentOS, Apache e PHP através do mod_fcgid), ou um erro de configuração do Apache ou do PHP.

Eu uso a seguinte diretiva mod_fcgid no meu vhost.conf, mas com pouco efeito:

MaxRequestInMem 1048576

Existem valores semelhantes de configuração do apache que eu deveria ajustar?

Obrigado pela sua consideração.

    
por JKS 01.02.2011 / 19:18

3 respostas

2

Isso é um bug conhecido no mod_fcgid , mas aparentemente a arquitetura mod_fcgid torna difícil abordar de forma abrangente.

No momento, o melhor que você pode fazer é atualizar para o mod_fcgid 2.3.7 (ou posterior); possui melhorias que, pelo menos, liberam a memória em algum momento após o upload do arquivo ser alocado. Minha experiência até agora tem sido que pode levar mais de meia hora para que a memória seja recuperada.

    
por 29.04.2013 / 21:27
0

Eu duvido que alguém tenha outras limitações, exceto o script de upload (autor (es)) ...

    
por 01.02.2011 / 19:38
0

Eu já vi problemas semelhantes a isso antes com apache + php (com horde). Tente adicionar à sua configuração do Apache:

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

Não tenho 100% de certeza se memory_limit pode ser definido na configuração do apache. É possível que ele precise ser configurado no php.ini. Opcionalmente, você também pode definir:

    php_value max_execution_time 180
    php_value max_input_time 180
    
por 02.02.2011 / 00:38