Для оценки того, сколько памяти может потребоваться вашему приложению, можно использовать 2 подхода:
- замер используемой памяти
- ограничение памяти доступной приложению
Каждый имеет свои плюсы. Рассмотрим общие инструменты, независимые от языка, т.к. в том же PHP можно использовать memory_get_usage, xdebug с профилированием, и т.п.
Замер используемой памяти
Этот метод хорош, когда вы примерно знаете сценарий выполнения приложения и его время работы довольно ограничено. Из минусов - нельзя поймать все худшие сценарии или пики потребления памяти.
Используем программу GNU time. Не путайте его со стандартной командной bash, которая тоже называется time.
Устанавливаем программу:
sudo apt install time
Делаем единичный замер:
/usr/bin/time -f '%M' php test.php
На выводе получаем максимальное количество памяти в килобайтах, которое было задействовано во время выполнения скрипта. В это число входит размер самого бинарника приложения + то, что выделяется в куче + размер разделяемых библиотек.
Эта цифра иногда гуляет, в зависимости от характера самого скрипта. Даже при детерминированной программе, которая не зависит от внешних данных, разбег может быть в несколько килобайт при каждом запуске. Поэтому для более точного замера:
for i in 1 2 3 4 5 6 7 8 9 10; do /usr/bin/time -f '%M' php test.php > /dev/null; done
Ограничение памяти доступной приложению
Понадобится root доступ и дистрибутив, в котором есть systemd
sudo systemd-run --scope -p MemoryMax=38M user php test.php
В случае достижения потребления MemoryMax процесс просто будет убит.
Здесь память считается по-другому: размер бинарника + куча, разделяемые библиотеки не учитываются. Это следует помнить, если вы уже ориентируетесь на результат от GNU time.