Назад | Перейти на главную страницу

Установка memory_limit в php.ini - могу ли я использовать всю доступную системную память?

Заранее извините за вопрос для новичков, но у меня есть выделенный виртуальный сервер, над которым я работаю, с 512 МБ оперативной памяти. Недавно я изменил memory_limit со 128M по умолчанию на 256M. Есть ли какая-то причина, по которой я не хотел бы увеличивать это полностью до доступных 512 МБ?

Есть ли какая-то причина, по которой я не хотел бы увеличивать это полностью до доступных 512 МБ?

Да - во-первых, это 512 МБ на процесс PHP. Неужели вашим процессам нужно так много?

Некоторые причины, которые я могу придумать, еще не раскрыты:

  1. Установка такого высокого предела только поощрит неуклюжее программирование (я не могу представить, что PHP будет лучшим языком для выбора, если вам нужно полгигаба оперативной памяти за один выстрел)

  2. Возможные атаки типа "отказ в обслуживании" (например, если вы загружаете обработку в память, и пользователь знает об этом, они просто загружают некоторые действительно большие файлы и отключит ваш сервер - вместо того, чтобы ваш сервер достиг 32/64 / 128M, он будет работать до 512M). Предполагается, что у вас нет других ограничений на загрузку, которые не выполняются в первую очередь.

  3. У вас есть виртуальный сервер. Если это OpenVZ / Virtuozzo, и вы не можете разорвать более 512 МБ, тогда ваши процессы начнут убиваться - быстро. Apache, вероятно, будет отключен, особенно при использовании dso. Это все отложит до перезапуска.

  4. Вы не узнаете, вызовет ли это серьезную проблему, пока она не начнет всплывать. В отличие от более сложного управления памятью, PHP не пытается выделить такой объем памяти с самого начала. Он просто говорит, что будет продолжать попытки до того как вы пытаетесь использовать больше, а затем отказываетесь. Насколько вам известно, возможно, вам вообще не удастся получить около 512 МБ - так что вы не можете предполагать, что все в порядке только потому, что вы перезапустили Apache и все еще работает.

  5. Предположим, у вас есть приложение, которому требуется 512 МБ памяти. Зачем делать это ограничение и для всех других процессов? Вы рискуете создать для них перечисленные выше проблемы. При стандартной установке сценарий, который требует этого (например, большое задание cron), может просто выполнять ini_set('memory_limit','512M'); в PHP и поднять собственный лимит. Это оставляет все остальные процессы «безопасными»

Вот еще несколько причин более низкого уровня:

  1. На весь ваш виртуальный сервер выделено 512 МБ. Это необходимо разделить на процессы, чтобы сервер работал, например (как минимум)

    • Cron
    • Apache
    • MySQL или какой-нибудь сервер базы данных

    Невозможно втиснуть все эти другие процессы и процесс PHP объемом 512 МБ в общую память 512 МБ.

  2. Вдобавок к этому ядро ​​оптимизирует неиспользуемую оперативную память в тайник - поэтому небрежное установление высокого лимита может привести к снижению производительности без реальной причины.

  3. Подтвердите, есть ли у вас своп (проверьте, используя top или free -m). Если вы это сделаете, ваш виртуальный сервер будет медленнее резко когда вы достигнете предела. Если у вас нет свопа, ваши процессы будут убиты гипервизором. В любом случае вы увидите хит производительности.

Итак, в общем, я бы не советовал поднимать глобальный предел для чего-то вроде этого.

Я уверен, что вы можете это настроить. Вероятно, это не рекомендуется, поскольку вашему ядру и другим процессам тоже нужна память. В зависимости от того, к какому типу хранилища подключена ваша виртуальная машина, ваша система также может получить выгоду от кеширования своего хранилища в памяти.

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