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

Ограничение объема оперативной памяти для процесса (Linux)

У меня есть сервер Zope (просто длительный процесс на Python), который через пару дней съедает всю оперативную память на моем сервере. Я не хочу перезапускать его каждую ночь - может, лучше ограничить оперативную память для этого процесса и посмотреть, все ли может работать.

Итак, как я могу ограничить этот процесс, чтобы использовать не более 256 МБ ОЗУ?

Сервер - это 64-битная машина Intel, работающая под управлением Centos 5.3. Я слышал о ulimit для ограничения процесса bash, но как я могу ограничить его для процесса python?

Обновить:

Спасибо за идеи! Я собираюсь использовать смешанный подход к своей проблеме:

Таким образом, я думаю, что я нахожусь в безопасности: автоматический плавный перезапуск при необходимости (через nagios) и принудительная остановка службы (через ulimit) в случае внезапного пика использования его оперативной памяти.

В resource модуль является эквивалентом Python ulimit.

ulimit - это молоток. Это сильно убьет процесс, когда он достигнет предела.

Возможно, вам захочется чего-нибудь менее агрессивного. (что-то, что делает плавный перезапуск) Взгляните на monit. http://mmonit.com/monit/

Вот пример конфигурации для zope. http://mmonit.com/wiki/Monit/ConfigurationExamples#zope

Посмотрите на использование параметров mem или totalmem для запуска перезапуска.

Удачи.

У других респондентов, похоже, есть ваш главный вопрос, но мне кажется, что то, что вы спрашиваете, похоже на лечение симптомов, а не причины. Почему у приложения так сильно утечка памяти? Если вы можете отследить это, ограничение на самом деле не нужно.

Поскольку ulimit влияет на оболочку и ее подпроцессы, если это возможно, вы можете попробовать запустить процесс Python изнутри другой (ulimit-ed) оболочки.

Используя Python, это будет что-то вроде

subprocess.Popen('ulimit -v 262144; python_application', shell=True)

Использовать Cgroups чтобы ограничить память.

Cgroup ограничивает память до настраиваемого количества и не является тяжелым молотком, как ulimit. OOM не убьет процесс. Остальная часть памяти, необходимая процессу, будет выгружена на диск.