A situação
Estou tendo um problema com um script PHP recebendo a seguinte mensagem de erro:
Fatal error: Out of memory (allocated 359923712) (tried to allocate 72 bytes) in /path/to/piwik/core/DataTable.php on line 969
O script que estou executando é: /path/to/piwik/misc/cron/archive.sh
Estou assumindo que os números são Bytes, o que significa que o total é de aproximadamente 360 MB.
Para todas as intenções e propósitos, eu aumentei os limites de memória no servidor bem acima de 360MB, mas este é o número (mais ou menos um byte) em que ele é consistentemente com erros.
Por favor note : Esta questão não é sobre como consertar um vazamento de memória no script, nem sobre por que o próprio script está usando tanta memória. O script é parte do processo de arquivamento do Piwik, portanto não posso consertar qualquer vazamento de memória, etc. Para obter mais informações sobre esse script e por que estou aumentando o limite de memória, consulte " Como configurar o arquivamento automático "
A questão
Dado que o script está tentando usar mais de 360MB de memória, o que não posso mudar, por que não parece possível aumentar a quantidade de memória disponível para php no meu servidor?
Atualização 23 de junho : Veja "O que eu tentei" > "Aumentando os limites de memória por processo do Linux" abaixo para segundo plano ... Se eu definir ulimit -v 1024000
, então verifique com ulimit -v
, recebo o valor correto de '1024000'. Se eu executar o script novamente, ele irá progredir muito mais, mas acabará por errar com o mesmo limite de memória (~ 360MB) atingido. Se eu verificar imediatamente ulimit -v
, ele foi redefinido para o valor original de '524288'. Isso parece que pode ser a causa raiz do problema.
O que eu tentei
Aumentando o memory_limit do PHP
Dado o arquivo php.ini:
php -i | grep php.ini
Configuration File (php.ini) Path => /usr/local/lib
Loaded Configuration File => /usr/local/lib/php.ini
Eu editei esse arquivo, então a diretiva memory_limit lê;
memory_limit = -1
Reinicie o Apache e verifique se o novo valor está parado;
$ php -i | grep memory_limit
memory_limit => -1 => -1
Execute o script e obtenha o mesmo erro.
Eu também tentei 1G
, 768M
, etc, todos com o mesmo resultado (ou seja, sem alteração).
Atualização 22 de junho : Baseado em A ajuda do Vangel , tentei definir post_max_size
para 20M em combinação com a configuração memory_limit
. Mais uma vez, isso não tem efeito.
Atualização 23 de junho : Baseado em ajuda do olefebvre , posso confirmar que o usuário que está executando o script tem permissão de leitura / gravação para o arquivo php.ini contendo as configurações de memory_limit
.
Removendo o limite de memória nos processos filhos do Apache
Eu encontrei e editei o arquivo httpd.conf para ter certeza de que não há uma diretiva RLimitMEM
.
Eu então usei o Apache Configuration > Restrições de uso de memória para gerar uma restrição, que alegou ter sido em 1000M (e confirmada pela verificação de httpd.conf).
Ambos resultaram em nenhuma alteração no script com erros de 360MB.
Aumentando os limites de memória por processo do Linux
Os limites atuais definidos no sistema:
$ ulimit -m
524288
$ ulimit -v
524288
Eu tentei definir ambos para ilimitado:
$ ulimit -m unlimited
$ ulimit -v unlimited
$ ulimit -m
unlimited
$ ulimit -v
unlimited
Mais uma vez, isso resultou em absolutamente nenhuma melhoria no meu problema.
Atualização 23 de junho : encontrei uma questão relacionada aqui. Se eu definir ulimit -v 1024000
, verifique com ulimit -v
e obtenho o valor correto de '1024000'. Se eu executar o script novamente, ele progredirá muito mais, mas acabará com o erro com o mesmo limite de memória atingido. Se eu verificar imediatamente ulimit -v
, ele foi redefinido para o valor original de '524288'. Isso parece que pode ser a causa raiz do problema.
Minha configuração
$ cat /etc/redhat-release
CentOS release 5.5 (Final)
$ uname -a
Linux example.com 2.6.18-164.15.1.el5 #1 SMP Wed Mar 17 11:30:06 EDT 2010 x86_64 x86_64 x86_64 GNU/Linux
$ php -i | grep "PHP Version"
PHP Version => 5.2.9
$ httpd -V
Server version: Apache/2.0.63
Server built: Feb 2 2011 01:25:12
Cpanel::Easy::Apache v3.2.0 rev5291
Server's Module Magic Number: 20020903:13
Server loaded: APR 0.9.17, APR-UTIL 0.9.15
Compiled using: APR 0.9.17, APR-UTIL 0.9.15
Architecture: 64-bit
Server compiled with....
-D APACHE_MPM_DIR="server/mpm/prefork"
-D APR_HAS_SENDFILE
-D APR_HAS_MMAP
-D APR_HAVE_IPV6 (IPv4-mapped addresses enabled)
-D APR_USE_SYSVSEM_SERIALIZE
-D APR_USE_PTHREAD_SERIALIZE
-D SINGLE_LISTEN_UNSERIALIZED_ACCEPT
-D APR_HAS_OTHER_CHILD
-D AP_HAVE_RELIABLE_PIPED_LOGS
-D HTTPD_ROOT="/usr/local/apache"
-D SUEXEC_BIN="/usr/local/apache/bin/suexec"
-D DEFAULT_PIDLOG="logs/httpd.pid"
-D DEFAULT_SCOREBOARD="logs/apache_runtime_status"
-D DEFAULT_LOCKFILE="logs/accept.lock"
-D DEFAULT_ERRORLOG="logs/error_log"
-D AP_TYPES_CONFIG_FILE="conf/mime.types"
-D SERVER_CONFIG_FILE="conf/httpd.conf"
Saída de $ php -i
: link