У меня есть стандартный ноутбук 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 для выполнения своей грязной работы, не так ли? Нет, я сказал нет! У тебя нет памяти! Если ты настаиваешь, ты умрешь! "
overcommit_memory
специальный файл использует RAM + SWAP в качестве используемой памяти. Я все еще собираюсь поменяться :)
ulimits
это плохая идея, показанная почти везде, так как это ограничение для каждого процесса ... Я знаю, вы знаете :) О cgroups
, это определенно лучше, но не хватает чего-то более общего: я говорю о своем ноутбуке, но я также владеть «расчетным» сервером, которым мы делимся три. Если я буду применять такие ограничения для каждого пользователя, я буду ограничен худшим сценарием, не так ли?
/proc/sys/vm/overcommit_memory
влияет на поведение ядра при нехватке памяти.