Я считаю, что это не такая уж редкая проблема: один процесс выделяет огромные объемы памяти (будь то из-за ошибки утечки памяти, потому что вы пытаетесь обработать невероятно большой входной файл или что-то еще). Оперативная память заполняется, и в какой-то момент Linux должен переключиться на обмен. Ну, иногда это только последнее средство: если у меня идут дорогостоящие вычисления, я не хочу терять данные, если к концу у меня заканчивается ОЗУ.
Однако довольно часто (по моему опыту) потребление памяти не ограничено из-за мошеннического, возможно, ошибочного процесса. То есть, я не просто получаю не так срочно необходимые данные, перемещаемые для обмена, но ОС вынуждена панически менять местами загрузки данных. И это, к сожалению, не только сильно нарушает процесс нарушения, но и может привести к практически полной остановке всей системы (это больше не так плохо на машинах с SSD, но OTOH заставляет меня беспокоиться о том, может ли запись гигабайтов и гигабайт данных мусора долгосрочный вред флеш-клеток).
Пока я не увижу проблему и не завершу процесс вручную (если на самом деле это заняло несколько минут, пока я даже не вошел в виртуальный терминал!), Половина моего рабочего сеанса находится в режиме подкачки, и мне нужно подождать некоторое время, пока система не будет работать нормально очередной раз.
Существует одно драконичное решение проблемы: установить жесткий предел памяти. Но выполнение этого в масштабе всей системы иногда убивало бы процессы, которые мне, скорее всего, по-прежнему нужны, и если мне придется вручную, ulimit
прежде чем запускать процесс, вызывающий сбой ... ну, я часто буду забывать, пока не станет слишком поздно.
Возможные варианты решения, с которым я был бы счастлив:
- Если какой-либо процесс превышает определенное использование памяти, он искусственно останавливается, поэтому остальная часть системы остается отзывчивой.
- Если какой-либо процесс превышает определенное использование памяти, это
SIGSTOP
пед, поэтому у меня есть время, чтобы выяснить, что делать дальше. - Если процесс приближается к пределу оперативной памяти, я получаю предупреждение, прежде чем начнется большой обмен.
Есть ли способ получить такое поведение или подобное?
ulimit
для.Ответы:
niceload --noswap yourprg создан именно для этой ситуации: он рассматривает обменную активность:
Он не приостанавливает процесс до начала перестановки, но позволяет перестановке работать в течение 1 секунды, прежде чем действовать.
niceload --mem 1G yourprg
работает аналогично: если менее 1 ГБ свободно, youprg приостанавливается. Когда более 1 ГБ свободно, ваш PRRG возобновляется.источник
Да. Это довольно легко сделать практически с любой современной оболочкой.
Вы можете использовать
-l
опцию для заблокированных ограничений памяти. Ваш процесс будет сигнализироваться, если предел превышен.источник
Cronjob для очистки кэша: как очистить кэш памяти в Linux
У меня на самом деле похожие проблемы. У меня есть группа пользователей, которые запускают свои собственные пользовательские сценарии, и время от времени их сценарии занимают всю доступную память и отключают сервер redhat. Причиной массового потребления оперативной памяти было то, что их сценарии могут работать в течение нескольких дней, просто ожидая какого-либо события, тем самым перебивая ресурсы, когда в действительности они не используются. Так что я просто очистил кеш с помощью cronjob, и с тех пор у меня не было проблем.
Простой и ленивый.
источник