Задать вопрос

Почему возникает утечка памяти в php-fmp?

Обратил внимание что при использовании nginx + php-fmp, после отработки скриптов, память у процессов не освобождается.

Решил воспроизвести утечку на тестовом сервере.

Для воспроизведения утечки подготовил тестовый сервер с панелью ispmanager.
Intel Xeon 2 GHz (2 cores), 4Gb оперативки, 10SSD
ПО: centos.6, PHP 7.3 PHP-FPM, nginx 1.20.2

Нет ни mysql, а также каких-то CMS.
Отключены все модули в том числе opcache, memcache и т.п.

Настройки php-fmp:
pm = static
pm.max_children = 5
pm.max_requests = 500
pm.status_path = /status


php.ini

Чтобы утечка проявила себя более явно установил memory_limit = 1G
Остальное оставил или как из коробки или отключил, весь php.ini выкладывать думаю нет смысла.

Тестовый скрипт:
$data = array();
for($i = 0; $i<1000000; $i++) {
    $data[] = array(
        'id' => $i
        );
}
die();


Начало тестирования

Делаю рестар службы php-fmp.
В процессах вижу 5ть запущенных php-fpm процессов (потребление памяти ~ 5 МБ).

642d60b125026841177968.png

Перехожу в браузер, запускаю 3 раза вышеуказанный скрипт(чистый скрипт, ни каких CMS).
Перехожу в просмотр процессов и вижу что из 5ти процессов, 3 стали потреблять уже не 5ть, а 180 МБ ...

642d615374a38851470695.png

Чтобы убедиться что процесс не выполняется, я захожу в /status (php-fpm):

642d63ab1e496544659029.png

Видно что PIDы находятся в статусе - Idle, т.е. скрипт отработан и в ожидании задачи (не running).

Если зажать f5 в браузере, подождать несколько секунд, и затем вернуться в процессы, то видно что утечка возросла до 350 мегабайт на процесс.

642d64639e032341152526.png

У меня нет сомнений в том что скрипт отработал и завершил своё выполнение.

Утечка пропадает когда установлен параметр pm.max_requests = 1, т.е. принудительный перезапуск после каждого выполнения процесса (но опять же, это лишнее потребление ресурсов).

Также если после этого скрипта запустить, какой-нибудь маленький скрипт, утечка снижается...

Утечки также проявляются в dynamic и ondemand (конечно по своему), в static проблема мне кажется более очевидна.

Попробовал разные версии php-fmp, утечка наблюдается в 7,8 версиях, в 5 такой проблемы нет.
В apache pforke, на этой же версии php (с этими же настройками) на этом же сервере утечки нет.
Такая же картина наблюдается на ubuntu 20.04.

Мне кажется что так быть не должно)

Сталкивался ли кто-нибудь с этой проблемой?
  • Вопрос задан
  • 1678 просмотров
Подписаться 6 Сложный 35 комментариев
Пригласить эксперта
Ответы на вопрос 2
neuotq
@neuotq
Прокрастинация
В прошлом месяце была большая дискуссия(а началась ещё год назад), закрывали пару багов в 8.1/8.2, пока ещё не в релизной версии.
Ответ написан
@Vitsliputsli
Утечка - это когда процесс не пользуется памятью, но и не высвобождает. По вашему описанию, php-fpm прекрасно использует память для других скриптов, а также высвобождает при необходимости. Т.е. это не утечка.

Чтобы утечка проявила себя более явно установил memory_limit = 1G

Выделение памяти операционкой это медленный процесс, поэтому при возможности выгоднее запросить побольше, вы выставили лимит в 1G, почему бы не зарезервировать сразу 18%.

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

Войдите, чтобы написать ответ

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