Я обнаружил, что иногда в моем Linux-устройстве не хватает памяти, и он начинает срывать случайные процессы, чтобы справиться с этим.
Мне интересно, что администраторы делают, чтобы избежать этого? Является ли единственное реальное решение для увеличения объема памяти (поможет ли только подкачка?), Или есть более эффективные способы установки программного обеспечения, чтобы избежать этого? (т.е. квоты или что-то такое?).
linux
low-memory
Эдди Паркер
источник
источник
Ответы:
По умолчанию в Linux реализована концепция управления памятью, которая несколько повреждена мозгом: она позволяет вам выделять больше памяти, чем у вашей системы, а затем случайным образом снимать процесс с головы при возникновении проблем. (Фактическая семантика того, что убивают, более сложна, чем Google - Linux OOM Killer для Linux, где много деталей и аргументов о том, хорошо это или плохо).
Чтобы восстановить некое подобие здравомыслия в управлении вашей памятью:
vm.oom-kill = 0
в /etc/sysctl.conf)vm.overcommit_memory = 2
в /etc/sysctl.conf).Обратите внимание, что это триное значение: 0 = "оцените, если у нас достаточно ОЗУ", 1 = "всегда говорите", 2 = "говорите" нет ", если мы этого не сделаем иметь память ")
Эти настройки приведут к тому, что Linux будет вести себя традиционным образом (если процесс запрашивает больше памяти, чем доступно, malloc () завершится с ошибкой, и ожидается, что процесс, запрашивающий память, справится с этой ошибкой).
Перезагрузите компьютер, чтобы перезагрузить его
/etc/sysctl.conf
, илиproc
сразу включите файловую систему без перезагрузки:источник
/etc/sysctl.conf
, скорее всего, вступит в силу только при следующей перезагрузке; если вы хотите внести изменения сейчас, вы должны использоватьsysctl
команду с правами root, напримерsudo sysctl vm.overcommit_memory=2
Вы можете отключить overcommit, см. Http://www.mjmwired.net/kernel/Documentation/sysctl/vm.txt#514.
источник
Краткий ответ для сервера - купить и установить больше оперативной памяти.
Сервер, который обычно испытывает ошибки OOM (Out-Of-Memory), а затем, помимо опции sysctl менеджера VM (виртуальной памяти) в ядрах Linux, это не очень хорошая вещь.
Увеличение объема подкачки (виртуальной памяти, которая была выгружена на диск диспетчером памяти ядра) поможет, если текущие значения будут низкими, и использование включает в себя множество задач, каждый из которых имеет такой большой объем памяти, а не одну или несколько обрабатывает каждый запрос огромного объема доступной виртуальной памяти (RAM + swap).
Для многих приложений, выделяющих более двух раз (в 2 раза) объем оперативной памяти в качестве подкачки, снижается отдача от улучшений. В некоторых больших вычислительных симуляциях это может быть приемлемо, если замедление скорости терпимо.
С оперативной памятью (ECC или нет), которая должна быть достаточно доступной для скромных объемов, например, 4-16 ГБ, я должен признать, что я не испытывал этой проблемы сам в течение длительного времени
Основы рассмотрения потребления памяти, включая использование
free
иtop
, отсортированные по использованию памяти, как две наиболее распространенные быстрые оценки моделей использования памяти. Поэтому убедитесь, что вы понимаете значение каждого поля в выводе этих команд как минимум.Без специфики приложений (например, базы данных, сервера сетевых услуг, обработки видео в реальном времени) и использования сервера (мало опытных пользователей, 100–1000 соединений пользователя / клиента), я не могу придумать какие-либо общие рекомендации в отношении работы с проблема ООМ.
источник
Увеличение объема физической памяти не может быть эффективным ответом при любых обстоятельствах.
Один из способов проверить это - команда «поверх». Особенно эти две строки.
Это наш сервер, когда он был здоров:
Когда он работал плохо (и до того, как мы настроили overcommit_memory с 50 на 90, мы увидели бы поведение с vmcom, работающим более 50G, процессы взрыва oom-killer каждые несколько секунд, и нагрузка продолжала радикально подпрыгивать из-за взрыва дочерних процессов NFSd и воссоздан на постоянной основе.
Недавно мы дублировали случаи, когда многопользовательские терминальные серверы Linux чрезмерно перерасходовали выделение виртуальной памяти, но на самом деле очень мало запрашиваемых страниц используется.
Хотя не рекомендуется следовать этому точному маршруту, мы изменили overcommit-memory со значения по умолчанию от 50 до 90, что уменьшило некоторые проблемы. Нам пришлось переместить всех пользователей на другой сервер терминалов и перезапустить, чтобы увидеть все преимущества.
источник
Вы можете использовать ulimit, чтобы уменьшить объем памяти, на который процесс может претендовать до того, как его уничтожат. Это очень полезно, если ваша проблема - один или несколько запущенных процессов, которые приводят к сбою вашего сервера.
Если ваша проблема в том, что вам просто не хватает памяти для запуска необходимых вам сервисов, есть только три решения:
Уменьшите объем памяти, используемой вашими службами, ограничив кэширование и тому подобное
Создайте большую область обмена. Это будет стоить вам производительности, но может выиграть время.
Купить больше памяти
источник
У меня была похожая проблема, связанная с этой ошибкой, и я решил использовать старое / более новое (исправленное) ядро.
Однако в то время я не мог перезагрузить свой компьютер, поэтому какой-то уродливый обходной путь состоял в том, чтобы войти в систему как root и очистить системные кэши с помощью этой команды:
источник
@ voretaq7 linux не имеет поврежденной концепции управления памятью, по умолчанию vm.overcommit_ratio равно 0,
Таким образом, если у вас есть 4 ГБ оперативной памяти, и вы пытаетесь выделить 4,2 ГБ с помощью malloc виртуальной памяти, ваше распределение завершится неудачно.
С vm.overcommit_ratio = 1
С vm.overcommit_ratio = 2
Таким образом, по умолчанию Linux не перегружается, если у вашего приложения больше памяти, чем у вас, возможно, ваш код содержит ошибки
источник