У меня есть стандартный ноутбук Linux (тестирование Debian) с разделом подкачки.
Я делаю много экспериментов с этим. Некоторые из них действительно требуют много памяти, и поведение Linux по умолчанию является проблемой для меня ... Давайте приведем глупый пример:
- Сядьте перед ноутбуком
- Откройте терминал
- Тип
python
, тогдаa = [0]*100000000
Теперь высоки шансы, что у вас не будет достаточно оперативной памяти для обработки этого большого списка. Linux заполнит оперативную память, затем произойдет своп и, через пару минут, OOM killer будет запущен и уничтожит (почти) случайные службы, и, надеюсь, если вы нажмете Ctrl + C в нужное время python
, и если терминал все еще был фокус, компьютер снова станет отзывчивым.
Я хотел бы установить некоторые ограничения памяти, чтобы избежать нежелательного обмена и отказать процессу в выделении большего количества памяти, чем у меня (в ОЗУ). Если требование к памяти ниже определенного предела или запрашивается пользователем root, просто убейте процесс, наиболее требовательный к памяти, любого пользователя, кроме root.
ulimit -Sv [mem]
Я слышу в спину!
Хо Хо! "Используйте cgroups
через cgexec
!" кто-то говорит в первом ряду!
Да, вы правы: это действительно очень хорошие решения. Но:
- Они не применяются в масштабе всей системы
- Пределы установлены для каждого процесса
- Ограничения статичны, без учета реального объема свободной оперативной памяти (AFAIK)
- Здесь и там , они говорят , что это на самом деле не является хорошим решением для обеспечения соблюдения жестких ограничений.
Я хотел бы, чтобы ядро говорило: «Вы принадлежите пользователю foo (не root), вы используете много памяти, и у нас закончится память. Извините, чувак ... умри сейчас!»
Или: «Что, черт возьми, вы делаете? Вам нужно x МБ, а доступно только y МБ. Да, SWAP пуст, но вы не собираетесь использовать SWAP для выполнения своей грязной работы, не так ли? Нет, я сказал нет! У тебя нет памяти! Если ты настаиваешь, ты умрешь! "
/proc/sys/vm/overcommit_memory
влияет на поведение ядра при нехватке памяти.overcommit_memory
специальный файл использует RAM + SWAP в качестве используемой памяти. Я все еще собираюсь поменяться :)ulimits
это плохая идея, показанная почти везде, так как это ограничение для каждого процесса ... Я знаю, вы знаете :) Оcgroups
, это определенно лучше, но не хватает чего-то более общего: я говорю о своем ноутбуке, но я также владеть «расчетным» сервером, которым мы делимся три. Если я буду применять такие ограничения для каждого пользователя, я буду ограничен худшим сценарием, не так ли?Ответы:
Кто-то предложил вам услышать
cgroups
. Ну, попробуйте найти это направление, поскольку оно может предоставить вам:Нечто подобное может приблизить вас к вашим целям :
Это говорит о том, что задачи в этой группе могут использовать максимум 50 МБ памяти и 50 МБ памяти + подкачка, поэтому, когда память заполнена, она не поменяется, но если память не заполнена и некоторые данные могут быть сопоставлены своп, это может быть разрешено.
Вот выдержка из документации по памяти cgroup :
источник
overcommit_memory
переменной ядра. Спасибо вам всем.Я часто сталкиваюсь с той же проблемой. Мой общий рабочий процесс включает в себя тяжелые вычисления в MATLAB. Время от времени я буду случайно пытаться выделить новую переменную, которая превышает объем доступной памяти. Система зависает, и мне обычно приходится сильно перезагружать машину, чтобы вернуться к работе. :П
В моем случае, и это звучит так же, как и в вашем, я не был настолько обеспокоен ограничением объема памяти, который использует MATLAB, до статического объема - меня интересовало отсутствие замороженной машины, и я был готов пожертвовать своим процессом MATLAB. для того, чтобы сохранить отзывчивость системы.
Вдохновленный ответом на этот пост , я написал следующий скрипт (я назвал его watch_memory.sh):
Этот скрипт проверяет каждую секунду процент свободного объема памяти. Когда система заканчивается, ваш pid "козла отпущения" (переданный в качестве аргумента скрипту) будет убит.
Без корректировки приоритета (благородства) сценария потребовалось около 10-20 секунд, чтобы убить козла отпущения, но это все равно работало. Запуск сценария с отрицательным приоритетом привел к немедленному уничтожению после нарушения (в этом примере 11916 - это pid, который я хочу уничтожить, если у меня заканчивается память):
источник