Страница 1 из 1

Небольшой трюк, ограничение памяти для отдельного приложения.

Добавлено: 01 дек 2022, 18:31
slant
Допустим, у вас есть программа которая любит ЖРАТЬ память. Причем сколько не дай - все свободное сожрет. Но это не настоящая утечка, а именно любовь захапать под себя свободные ресурсы.
Такое поведение может сильно мешать, когда эта программа не единственная на машине. Или вы не видите смысла давать ей столько памяти - все равно лучше не работает. :) Как отучить? Вообще, для этого в линукс служат crgoups. Но чтобы их эффективно использовать самостоятельно - нужно курить документацию, ибо не все там просто и очевидно, а главное - многое взаимосвязано.

Однако! Если у вас дистрибутив на systemd, особенно из боле-менее свежих, то для простого запуска с ограничением памяти для единственной программы ничего долго и нудно курить не надо. Можно просто сделать так:

systemd-run --scope -p MemoryMax=2G --user my_limited_program

Здесь --user нужен для того, чтобы запускалось от обычного пользователя (вас), т.к. по умолчанию будет от root, с запросом пароля. Вообще systemd-run умеет еще много всякого интересного, но это уже тема для другого разговора.

А здесь он просто сконфигурирует для нас cgroup для запуска программы. В примере выше - ей будет доступно не более 2GB памяти. Если не уложится - вылетит с ошибкой о недостатке памяти. Но большинство нормальных программ на современных языках программирования в такой ситуации сначала будут запускать свои сборщики мусора, скидывать буфферы, и т.д. В общем - начнут себя вести как приличный жилец коммунальной жилплощади. :)

Небольшой трюк, ограничение памяти для отдельного приложения.

Добавлено: 01 дек 2022, 19:40
slant
UPD:
Если оно просто "не работает" (память жрет) но ошибок не выкидывает - скорее всего не активны cgroupsv2. Тогда надо убрать ключ --user. Да, так оно будет просить пароль, но работать будет все равно из под юзера - я там в посте выше неправильно написал.