Решения по ограничению памяти для жадных приложений, которые могут привести к сбою ОС?


32

Я использую свой компьютер для научного программирования. Он имеет исправную 8GBоперативную память и 12GBпространство подкачки. Часто, когда мои проблемы увеличиваются, я превышаю всю доступную оперативную память. Вместо сбоя (что было бы предпочтительнее) кажется, что Ubuntu начинает загружать все в swap, включая Unity и любые открытые терминалы. Если я вовремя не поймаю запущенную программу, я ничего не могу поделать, кроме как ждать - для перехода в командную строку требуется 4-5 минут, например. Ctrl-Alt-F2где я могу убить оскорбительный процесс.

Так как моя собственная глупость выходит за рамки этого форума, как я могу предотвратить сбой Ubuntu из-за сбоя, когда я использую всю доступную память от одной программы-нарушителя?

Домашний эксперимент *!

Откройте терминал, запустите pythonи, если вы numpyустановили, попробуйте это:

>>> import numpy
>>> [numpy.zeros((10**4, 10**4)) for _ in xrange(50)]

* Предупреждение: может иметь побочные эффекты, контролировать процесс через iotopили topубить его вовремя. Если нет, увидимся после перезагрузки.

Ответы:


21

Встроенная оболочка ulimitпозволяет ограничивать ресурсы. Для вашего случая, чтобы ограничить использование памяти в оболочке (и ее дочерних элементах), используйте ulimit -v.

Демонстрация установки предела памяти в 100 МБ (100000 КБ):

$ ulimit -v
unlimited
$ python -c '[ "x" * 100000000 ]'
$ ulimit -v 100000
$ python -c '[ "x" * 100000000 ]'
Traceback (most recent call last):
  File "<string>", line 1, in <module>
MemoryError

При использовании ps uww -C script-name-hereэтого питона требуется не менее 29 МБ памяти (столбец VSZ). Предел RSS увеличивается по мере того, как вашему скрипту на python требуется больше памяти, поэтому адаптируйте этот столбец.


1
Жаль, что мы не знаем, как выглядит само приложение. Показанный ulimit влияет на все процессы, которые являются дочерними элементами этой оболочки. Мы даже не знаем, работает ли он как демон, или у него много детей, что еще больше усложнит ситуацию. См. Coldattic.info/shvedsky/pro/blogs/a-foo-walks-into-a-bar/posts/…
ppetraki

1
Есть ли не удобный передний конца для и всех ограничений контрольных групп ? В Windows, когда ОС приближается к концу ОЗУ, всплывающее предупреждение всегда позволяло мне избежать зависаний системы. В Ubuntu я должен постоянно следить за использованием памяти?
Дан Дакалеску

1
@DanDascalescu Если у вас настроен файл подкачки, то вы будете испытывать более длительные задержки, но все равно сможете работать. Как только вы заметите, что перестановка начинается, вы можете проверить системный монитор на предмет использования оперативной памяти. Если в вашей системе действительно не хватает памяти, вызывается убийца нехватки памяти (OOM), который убивает процесс с наивысшей оценкой «вредности» (обычно процесс, который потребляет большую часть памяти).
Лекенштейн

12

Cgroups должны позволить вам ограничить использование памяти для каждого процесса.

https://en.wikipedia.org/wiki/Cgroups

http://www.mjmwired.net/kernel/Documentation/cgroups/memory.txt

Научные вычисления, как известно, занимают много памяти, поскольку помещая ваше приложение в изолированную группу в песочнице, остальные процессы не должны становиться жертвами, поскольку нагрузка на память будет уменьшена.

В качестве альтернативы виртуальная машина может использоваться как своего рода жесткое ограничение, поскольку приложение может использовать только память, делегированную виртуальной машине, конечно, за счет производительности. Однако виртуальную машину гораздо проще настроить для непосвященного по сравнению с настройкой и поддержкой cgroup.

Решения решения :) Удачи!


1
Нет ли удобного интерфейса для ulimit и cgroups? В Windows, когда ОС приближается к концу ОЗУ, всплывающее предупреждение всегда позволяло мне избежать зависаний системы. В Ubuntu я должен постоянно следить за использованием памяти?
Дан Дакалеску

Нет. Также ваша ОС не должна зависать, это отдельная проблема. Всплывающие окна - это просто повязка для начала. Если вы используете тонны памяти, может быть, вам следует выяснить, почему? Например, современные браузеры с их sanboxing могут легко потреблять 70-150 МБ на вкладку. Отключение или настройка может освободить значительную память, используемую на регулярной основе конечным пользователем. Планировщики должны заменять редко используемые программы для экономии места, но если они просыпаются больше, чем должны, вам нужно их исправить, или если ваша основная задача - интенсивное использование памяти (веб), тогда требуется больше оперативной памяти.
ппетраки

8
Я знаю, что потребляет память - Chrome. Но ОС должна защищать свою стабильность от приложений, которые тем не менее работают.
Дан Даскалеску

1
Я понимаю, откуда вы как пользователь. Однако то, что вы просите, означает превращение общей вычислительной платформы в устройство. В качестве наименее сложного (подверженного ошибкам) ​​метода, который должен внедрить инженер операционной системы для обеспечения этих мер безопасности, - это принимать решительные решения о том, как работает весь компьютер. Это обычно происходит за счет гибкости конечного пользователя. Вы видите примеры этого в планшетных компьютерах. Однако в настольных компьютерах гибкость сохраняется.
ппетраки
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.