Debian 9, Apache 2, PHP7 - Утечка памяти

У меня проблема с Apache и PHP7 в Debian ... Он автоматически настраивается apt ... мои скрипты выполняют много вычислений с большим объемом используемой памяти (ограничение - 512 МБ ). Но я заметил, что каждый раз, когда я запускаю сценарий с разными параметрами, / usr / sbin / apache2 -k start использует все больше и больше памяти ... кажется, что она не освобождается должным образом. Есть идеи, как это исправить? Или как узнать, что именно вызывает?

Проблема серьезная и заканчивается ошибкой mmap (): [12] Невозможно выделить память в Apache и PHP Неустранимая ошибка: Недостаточно памяти в PHP. При использовании 100% общей памяти (которая никогда не освобождается) и невозможности сделать что-либо еще.

Кажется, это не убивает новые порожденные процессы после подключения ...

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

Значение между * - это MEM% из htop . Каждый новый расчет порождает новый процесс. А другие используют все больше и больше памяти ...

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
1
задан 9 February 2018 в 22:08
1 ответ

То, что вы видите, является нормальным поведением при использовании mod_php с предварительным форком apache2.

Когда php-скрипт запускается в предварительно форкованном процессе, в предварительно форкованном процессе есть что-то вроде "буфера памяти PHP" процесс apache. Он увеличивается всякий раз, когда выполняющийся скрипт требует больше памяти, чем уже выделено, но сжимается только тогда, когда предварительно созданный процесс перезапускается (т.е. перезапускается).

Вы можете смягчить эту проблему, установив ServerLimit и MaxClients на (системная память / php memory_limit), что приведет к не более чем этому количеству предварительно форкованных процессов. Это число, умноженное на ваш php memory_limit, уместится в памяти.

Вы также можете установить MaxRequestsPerChild 1 , но это очень плохо скажется на производительности.

В долгосрочной перспективе вам, вероятно, следует перейдите на php-fpm и тщательно спланируйте максимальное количество процессов php с учетом потребления ими памяти.

0
ответ дан 4 December 2019 в 04:14

Теги

Похожие вопросы