Главная страница » Блог » Как ограничить потребление памяти на один воркер?

Как ограничить потребление памяти на один воркер?

Как ограничить потребление памяти на один воркер?

Ограничение задаётся на уровне cgroup: в systemd это директива MemoryMax= в секции [Service] юнита, а в cgroup v2 — запись лимита в байтах в файл memory.max каталога /sys/fs/cgroup/<группа>/. Для PHP-FPM параллельно работает директива memory_limit в php.ini или php_admin_value[memory_limit] в конфиге пула, для Gunicorn — параметры –max-requests и –max-requests-jitter.

Разница между лимитами принципиальна. memory.max и MemoryMax= — жёсткий предел: при его превышении ядро убивает процесс через OOM-killer, и воркер просто перезапускается. memory.high и MemoryHigh= задают мягкий порог: память не отбирается, но процесс начинает тормозиться и активно вытеснять страницы в swap — это безопаснее для нагруженного сервиса, чем внезапный рестарт. Лимит PHP memory_limit вообще не убивает воркер: скрипт падает с fatal error, а процесс продолжает обслуживать следующие запросы, поэтому реальный RSS воркера может оставаться выше ожидаемого.

Проверяйте фактическое потребление, а не номинал: cgroup v2 учитывает и page cache, поэтому сравнивайте memory.current со значением memory.stat anon, иначе лимит сработает раньше времени. Мини-чек-лист: сверьте версию cgroup через mount | grep cgroup2; выставьте MemoryHigh= на 70–80% от MemoryMax=; включите max_requests для воркеров с утечками; после правки выполните systemctl daemon-reload и systemctl restart, затем проверьте срабатывание через systemd-cgtop или cat /sys/fs/cgroup/<группа>/memory.events.

Внимание:
Условия: Продвижение сайта ежедневными статьями — от 15 000 ₽/мес (1-й месяц — 25 000 ₽, настройка). Если бюджет подходит — посмотреть тарифы →
Прокрутить вверх