Debian 9, Apache 2, PHP7 - vazamento de memória

1

Eu tenho um problema com Apache e PHP7 no Debian ... Ele é configurado automaticamente pelo apt ... meus scripts estão fazendo muitos cálculos com muita memória usada (limite - 512MB). Mas notei que toda vez que executo o script com parâmetros diferentes, /usr/sbin/apache2 -k start está usando mais e mais memória ... parece que não está sendo liberado corretamente. Alguma idéia de como consertar isso? Ou como chegar ao que exatamente causa isso?

O problema é sério e acaba em mmap() failed: [12] Cannot allocate memory no Apache e PHP Fatal error: Out of memory no PHP. Com 100% da memória total usada (que nunca é liberada) e incapacidade de fazer mais nada.

Não parece matar novos processos gerados após a conexão ...

PID USER      PRI  NI  VIRT   RES   SHR S CPU% MEM%   TIME+  Command
12123 www-data   20   0  369M  117M  7272 S  0.0  *6.0*  0:18.40 /usr/sbin/apache2 -k start
12132 www-data   20   0  357M  105M  7272 S  0.0  *5.4*  0:17.96 /usr/sbin/apache2 -k start
12122 www-data   20   0  333M 84296  7860 S  0.0  *4.2*  0:18.35 /usr/sbin/apache2 -k start
12133 www-data   20   0  311M 61160  7272 S  0.0  *3.1* 0:08.00 /usr/sbin/apache2 -k start
12131 www-data   20   0  293M 42732  7272 S  0.0  *2.1*  0:17.70 /usr/sbin/apache2 -k start
12134 www-data   20   0  291M 40676  7272 S  0.0  *2.0*  0:08.32 /usr/sbin/apache2 -k start
12124 www-data   20   0  275M 25040  7900 S  0.0  *1.2*  0:16.19 /usr/sbin/apache2 -k start
12125 www-data   20   0  265M 13084  6768 S  0.0  *0.7*  0:00.01 /usr/sbin/apache2 -k start
12128 www-data   20   0  265M 13060  6708 S  0.0  *0.7*  0:00.01 /usr/sbin/apache2 -k start
12126 www-data   20   0  265M  9468  3332 S  0.0  *0.5*  0:00.00 /usr/sbin/apache2 -k start

O valor entre * é MEM% de htop . Cada novo cálculo novo processo gera. E outros estão usando mais e mais memória ...

apache2 -l

Compiled in modules:
  core.c
  mod_so.c
  mod_watchdog.c
  http_core.c
  mod_log_config.c
  mod_logio.c
  mod_version.c
  mod_unixd.c

a2query -M

prefork
    
por Flash Thunder 09.02.2018 / 20:13

1 resposta

0

O que você está vendo é um comportamento normal ao usar o mod_php com o apache2 prefork.

Quando um script php é executado em um processo pré-feito, há algo como um "buffer de memória PHP" nesse processo de pré-carregamento do apache. Ele cresce sempre que o script em execução exige mais memória do que o já alocado, mas só diminui quando o processo pré-fabricado é reciclado (isto é, reiniciado).

Você pode atenuar esse problema configurando ServerLimit e MaxClients para (memória do sistema / limite_de_Memória do php), o que levará a não mais que o número de processos pré-fabricados. Esse número multiplicado pelo seu memory_limit do php vai caber na memória.

Você também pode definir MaxRequestsPerChild 1 , mas isso terá um efeito muito ruim no desempenho.

No longo prazo, você provavelmente deve migrar para php-fpm e planejar cuidadosamente o número máximo de processos php com o consumo de memória.

    
por 10.02.2018 / 00:40