Решения по ограничению памяти для жадных приложений, которые могут привести к сбою ОС?
Я использую свой компьютер для научного программирования. Имеет здоровый 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.
Решения решения:) Удачи!