Есть несколько дискуссий, в которых жалуются на высокое использование памяти PHP-FPM
, без какого-либо практического подхода к преодолению. Поскольку я исследовал проблему с помощью многочисленных тестов, проблема связана с возрастом PHP-FPM
возраст.
Представьте, что у нас есть pm.max_children
= 10, а сценарий PHP использует 10 МБ памяти. Ожидается, что потребуется 100 МБ МБ. Это верно для первых 10 процессов. После обработки 20 сценариев PHP использование системной памяти составляет 200 МБ, что означает, что память, потребляемая во время первых 10 процессов, не была освобождена.
Это увеличит использование памяти до достижения pm.max_requests
когда PHP-FPM
процессы сброшены.
НОТА: Это был просто упрощенный пример для пояснения, а не фактическое поведение. В реальном мире такое иногда случается. Обычно в конце сценария PHP память, потребляемая PHP, автоматически освобождается. В PHP-FPM эта память sometimes
(Не знаю когда) не будет освобожден.
Это означает, что для обработки похожих сценариев (с использованием 10 МБ памяти) с
pm.max_children = 10
pm.max_requests = 100
Вам не нужно 100 МБ или 1000 МБ памяти; но что-то среднее. Другими словами, следы некоторого PHP previous processes
оставаться на PHP-FPM
дети.
В соответствии с этой теорией, высокое использование памяти PHP-FPM
будет преодолен за счет сокращения pm.max_requests
, но это не окончательное решение, и нам нужно найти подход, чтобы освободить влияние предыдущих процессов PHP на PHP-FPM
дети. Любая идея?
Не зная точно, какое приложение вы используете, нам трудно сказать, что вам следует делать. Но рассматривали возможность использования диспетчера процессов ondemand? Он завершит процессы через N раз, тем самым сохраняя вашу память более свободной, чем динамическая или статическая, которую вы, вероятно, используете.