У меня программное обеспечение с закрытым исходным кодом с некоторыми проблемами утечки памяти. Есть ли инструмент или решение для процессов «песочницы» в фиксированном объеме памяти без использования «ulimit» (в общем, мне нужен контроль памяти для каждого приложения)
«ulimit» - это элемент управления «для каждого приложения»… фактически для каждого процесса. Команда оболочки ulimit - это встроенная оболочка, устанавливающая ограничение для процесса оболочки и его дочерних элементов. Поместите команду ulimit в скрипт, запускающий ваше приложение, и ограничение будет установлено только для этого приложения.
В дистрибутивах на основе systemd вы также можете использовать systemd-run (который косвенно использует контрольные группы). Например:
systemd-run --scope -p MemoryLimit=1G firefox
Примечание: у вас будет запрошен пароль, но приложение запускается от имени вашего пользователя. Не позволяйте этому ввести вас в заблуждение, заставляя думать, что команда должна выполняться с sudo
, потому что это приведет к запуску команды под root, что вряд ли было вашим намерением.
Если вы не хотите вводить пароль (действительно, зачем вам пароль, чтобы ограничивать память, которая у вас уже есть), вы могли бы использовать --user
вариант, однако для этого вам понадобится поддержка cgroupsv2, которая прямо сейчас требует загрузки с systemd.unified_cgroup_hierarchy
параметр ядра.
Вы можете использовать демон управления процессами, например monit
для отслеживания объема памяти, используемого вашими процессами, и перезапуска его, когда он превысит установленный вами предел.
Это звучит радикально, но, учитывая, что ваше приложение, как известно, имеет утечку, регулярный перезапуск его в зависимости от его использования просто откладывает неизбежное, когда размер процесса становится больше, чем меньший, физической памяти вашего компьютера или любых наложенных ограничений адресного пространства. вашей операционной системой.
Используйте контрольные группы. https://www.kernel.org/doc/Documentation/cgroups/
Обратите внимание на разницу между memory.limit_in_bytes
и memory.memsw.limit_in_bytes
. Также обратите внимание memory.soft_limit_in_bytes
. https://www.kernel.org/doc/Documentation/cgroups/memory.txt