Можно ли наложить какое-то мягкое ограничение на потребление памяти процессами?

10

Я считаю, что это не такая уж редкая проблема: один процесс выделяет огромные объемы памяти (будь то из-за ошибки утечки памяти, потому что вы пытаетесь обработать невероятно большой входной файл или что-то еще). Оперативная память заполняется, и в какой-то момент Linux должен переключиться на обмен. Ну, иногда это только последнее средство: если у меня идут дорогостоящие вычисления, я не хочу терять данные, если к концу у меня заканчивается ОЗУ.

Однако довольно часто (по моему опыту) потребление памяти не ограничено из-за мошеннического, возможно, ошибочного процесса. То есть, я не просто получаю не так срочно необходимые данные, перемещаемые для обмена, но ОС вынуждена панически менять местами загрузки данных. И это, к сожалению, не только сильно нарушает процесс нарушения, но и может привести к практически полной остановке всей системы (это больше не так плохо на машинах с SSD, но OTOH заставляет меня беспокоиться о том, может ли запись гигабайтов и гигабайт данных мусора долгосрочный вред флеш-клеток).
Пока я не увижу проблему и не завершу процесс вручную (если на самом деле это заняло несколько минут, пока я даже не вошел в виртуальный терминал!), Половина моего рабочего сеанса находится в режиме подкачки, и мне нужно подождать некоторое время, пока система не будет работать нормально очередной раз.

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

Возможные варианты решения, с которым я был бы счастлив:

  • Если какой-либо процесс превышает определенное использование памяти, он искусственно останавливается, поэтому остальная часть системы остается отзывчивой.
  • Если какой-либо процесс превышает определенное использование памяти, это SIGSTOPпед, поэтому у меня есть время, чтобы выяснить, что делать дальше.
  • Если процесс приближается к пределу оперативной памяти, я получаю предупреждение, прежде чем начнется большой обмен.

Есть ли способ получить такое поведение или подобное?

leftaroundabout
источник
2
Вы можете ограничить объем оперативной памяти, используемой процессом или группой процессов, используя cgroups. stackoverflow.com/questions/3043709/…
Марк Плотник
2
Это буквально точная вещь ulimitдля.
DopeGhoti
1
Можно использовать Ulimit -m, за исключением того, что он не работал в Linux с 2.4.30, а до этого работал только в определенных ситуациях. unix.stackexchange.com/questions/129587/…
Марк Плотник
niceload --noswap yourprg
Оле Танге

Ответы:

6

niceload --noswap yourprg создан именно для этой ситуации: он рассматривает обменную активность:

  • Если выгрузка: пусть процесс запустится
  • Если обмен: Позвольте процессу выполняться
  • Если обмен включается и выключается: приостановите процесс, пока обмен не прекратится, и возобновите процесс, когда обмен был остановлен

Он не приостанавливает процесс до начала перестановки, но позволяет перестановке работать в течение 1 секунды, прежде чем действовать.

niceload --mem 1G yourprgработает аналогично: если менее 1 ГБ свободно, youprg приостанавливается. Когда более 1 ГБ свободно, ваш PRRG возобновляется.

Оле Танге
источник
0

Да. Это довольно легко сделать практически с любой современной оболочкой.

sh -c 'ulimit -S -m "$1"
       shift; exec your_command "$@"
' -- some_size args

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

mikeserv
источник
-1

Cronjob для очистки кэша: как очистить кэш памяти в Linux

У меня на самом деле похожие проблемы. У меня есть группа пользователей, которые запускают свои собственные пользовательские сценарии, и время от времени их сценарии занимают всю доступную память и отключают сервер redhat. Причиной массового потребления оперативной памяти было то, что их сценарии могут работать в течение нескольких дней, просто ожидая какого-либо события, тем самым перебивая ресурсы, когда в действительности они не используются. Так что я просто очистил кеш с помощью cronjob, и с тех пор у меня не было проблем.

Простой и ленивый.

D.Zou
источник
Гектометр Интересное предложение, хотя я боюсь, что оно ничего не делает для большинства проблем, с которыми я сталкиваюсь. Моя основная проблема связана с отдельными процессами (научными приложениями), которые могут быстро выделить много гигабайт памяти.
оставил около
Очистка кешей обычно создает проблемы с производительностью. Очень редко они решают проблемы с производительностью. Но они не заставят память стать доступной, когда ее там нет.
Жиль "ТАК - перестань быть злым"