У меня есть веб-сервер apache 2.2 с fastcgi и php 5.3, у меня установлен предел памяти 256 МБ в php.ini, а с php-cgi -i я получил 256 МБ. Итак, конфигурации правильные, мой процесс прочитал их без проблем. Я сказал это, потому что прочитал много сообщений в Интернете, и проблема заключалась в неправильном расположении php.ini. В моем случае я уверен, что прав.
Мои процессы php-cgi 8 плюс родительский выделяют RSS для более 256 МБ, некоторые процессы выделяют также 700 МБ без проблем. Зачем?
Каков предел объема памяти, когда некоторые процессы php-cgi могут выделять более 256 МБ?
Я попытался найти ошибку, но ничего не нашел.
Мое приложение не использует ini_set для переопределения параметра memory_limit. Так что я уверен, что ограничение в 256 МБ следует соблюдать.
Мои процессы php-cgi 8 плюс родительский выделяют RSS для более 256 МБ, некоторые процессы выделяют также 700 МБ без проблем. Зачем?
Вы сказали нам, что используете fastCGI на своем веб-сервере - поэтому я ожидаю, что вы используете PHP через PHP-FPM, а не PHP-CGI.
Вы не сказали нам, к какой операционной системе это относится (довольно важное соображение, когда речь идет об управлении памятью).
Он не выделяет так много памяти - это только отображение этого объема памяти. Чтобы кратко объяснить разницу и почему это важно, вам следует прочитайте это.
Ответ Дэвида почти правильный - memory_limit - это ограничение на объем памяти, которое может быть неправильно выделено для среды выполнения скриптов, сам скрипт, если он не находится в кеше опкодов (и первая компиляция кода) вместе с пространством, выделенным для сохранение переменных PHP во время выполнения.
В случае выполнения PHP-кода, уже находящегося в кеше опкодов, я не знаю, засчитываются ли страницы в кэше опкодов для использования, ограниченного memory_limit, - и потребуется много работы над исходным кодом PHP, чтобы найти вне.
У меня установлен предел памяти 256 МБ в php.ini
Это довольно много. Поскольку вы не понимаете, как работает управление памятью, мне интересно, почему. Установка слишком высокого лимита ограничивает емкость вашей системы. Выполнение PHP с радостью заполнит пространство до memory_limit. Когда память становится нехваткой, начинается сборка мусора и освобождает пространство, занимаемое мертвыми (не имеющими ссылки) данными. Если память никогда не становится тесной, сборка мусора никогда не происходит.
Как представлено здесь, это не похоже на вопрос об управлении информационными системами в бизнес-среде. Вы сказали в комментариях, что:
Моя проблема в том, что RSS процесса php-cgi не ограничен
Но это ограничено лимитом памяти php.ini. Если вы мне не верите, напишите сценарий, который продолжает использовать данные, и вы увидите, что в какой-то момент он упадет.
Если вы действительно хотите спросить, как вы планируете и управляете мощностью системы, то это совсем другой вопрос - и вы не пытайся ответить на него просмотрев RSS и VSZ.
процесс не убит oom-killer, php-cgi начинает использовать своп и замедляет мою систему
Наконец! Правильная постановка проблемы!
Почему в вашей системе есть своп, если вы не собираетесь его использовать? Ссылка выше даст вам некоторую помощь в настройке вашей системы, чтобы этого не произошло. Если это мультитенантная система, в которой другим приложениям требуется свопинг, вы можете разделить их на виртуальные машины или контейнеры.
PHP memory_limit
настройка - это виртуальный ограничение памяти. RSS - это мера физический использование памяти. У них очень мало общего друг с другом.
В memory_limit
Параметр устанавливает объем виртуальной памяти, который PHP-скрипту разрешено напрямую выделять. Это не предел процесса и не предел физической памяти.