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

Я использую свой компьютер для научного программирования. Имеет здоровый 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 убить это вовремя. Если нет, увидимся после перезагрузки.

2 ответа

Решение

Оболочка встроенная 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 требуется больше памяти, поэтому адаптируйте этот столбец.

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

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

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

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

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

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

Другие вопросы по тегам