Я запускаю Apache с рабочим MPM и PHP с fastcgi.
Ниже приведены мои ограничения по mpm:
StartServers 5
MinSpareThreads 5
MaxSpareThreads 10
ThreadLimit 64
ThreadsPerChild 10
MaxClients 10
MaxRequestsPerChild 2000
Я также настроил свой php-cgi следующим образом:
PHP_FCGI_CHILDREN=5
PHP_FCGI_MAX_REQUESTS=500
Я заметил, что мой средний процесс php-cgi использует около 200+ МБ оперативной памяти, даже как только они запускаются. Однако мой php memory_limit составляет всего 128 МБ.
Как это возможно и что можно сделать, чтобы снизить потребление памяти php-cgi?
решение1
Бывают случаи, когда PHP может превысить настроенный лимит памяти (память выделяется непосредственно в расширениях), однако я подозреваю, что это может быть не так.
Я заметил, что мой средний процесс php-cgi использует около 200+ МБ
Как вы это измерили? Большинство сегментов TXT будут общими, поэтому фактическое использование памяти намного меньше того, что вы увидите в файловой системе /proc или в ps/top. Хотя вы можете попытаться проанализировать вывод lsof, на практике я считаю гораздо более разумным немного отступить и посмотреть на количество выполняемых запросов (например, по количеству подключенных сокетов) и сравнить это с сообщаемым объемом свободной памяти (за вычетом буферов/кэша).
решение2
Ограничение памяти в PHP — это ограничение внутренней памяти, то есть это объем, который движок позволяет пользовательскому скрипту выделять через свой частный аллокатор. Но помимо этого есть память, которая выделяется движком для его внутренних нужд, которая не всегда учитывается в лимите (часть учитывается, но не вся), память, выделяемая библиотеками и т. д. Поэтому ожидайте, что реальное использование памяти будет немного больше, чем memory_limit
установлено.
Кроме того, как упоминалось выше, некоторые из показателей, сообщаемых инструментами, представляют собой память, выделенную для кода, стека, буферов ввода-вывода ОС, разделяемой памяти между библиотеками и т. д., поэтому внимательно изучите, какой показатель вы проверяете.