У меня есть сервер 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 не убьет процесс. Остальная часть памяти, необходимая процессу, будет выгружена на диск.