Как мне вернуть OOM killer агрессивность?

Вопрос или проблема

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

Как вернуть OOM-killer к его старым, кровожадным методам?

Я бы уменьшил количество доступного пространства swap. В наши дни типичные установки пытаются выделить столько же swap, сколько есть физической памяти (а иногда и вдвое больше). Проблема в том, что когда что-то идет не так, система попадает в спираль смерти, пытаясь “переместить” данные из памяти на диск и обратно, и она делает этого так много, что не успевает реагировать на ввод пользователя.

В старые добрые времена целые процессы выгружались на диск (и обратно), поэтому требовалось много swap.

В современных системах виртуальной памяти память выгружается блоками (а не целыми процессами), поэтому можно обойтись меньшими swap. В вашем случае, было бы лучше, если бы процессы убивались, и использование меньшего swap приведёт к тому, что OOM начнет убивать процессы раньше (вместо того, чтобы система тратила чрезмерное количество времени на переноса данных на/с диска).

Вот что сработало для меня:

echo 1 > /proc/sys/vm/oom_kill_allocating_task

Это настройка только для этого запуска. Вы можете протестировать, запустив следующее в консольной вкладке инспектора вашего браузера:

a = []; while (true) { a.push(1); }

Если вас устраивает эта настройка, вы можете сделать её стандартной для всех будущих запусков:

echo "vm.oom_kill_allocating_task=1" >> /etc/sysctl.conf

Установите earlyoom, он доступен на GitHub и также может быть установлен через apt в дистрибутиве Ubuntu, который я использую. Это полностью настраиваемый демон, который вмешивается до того, как ситуация выходит из-под контроля, и вы можете сами определить процент свободной оперативной памяти и/или swap, который будет триггерить процесс убийства.

Некрология, но… увеличьте vm.min_free_kbytes, так как при достижении этого уровня запускается OOM-Killer. Я полагаю, что код не изменился с момента вашего предыдущего опыта, когда OOM-Killer вызывался часто. Но количество памяти и swap изменилось относительно этого min_free_kbytes, что, возможно, давно не менялось.

Также я начал использовать systemd-oomd. Не знаю, лучше ли это или хуже, чем триггер OOM-Killer через min_free_kbytes. Я попробовал, и кажется, что он убивает весь “скоп” systemd, т.е. он завершил ssh-сессию, из которой я запускал программы, потребляющие память. Не знаю, лучше или хуже OOM-Killer с точки зрения процесса, который он убивает. Но обнаружение нехватки памяти на стороне системы systemd-oomd кажется лучше или, по крайней мере, более гибким.

.

Ответ или решение

Настройка системы для эффективного управления памятью — задача, требующая внимательного подхода, особенно когда речь идет о балансировке между производительностью и стабильностью. В данном контексте речь идет о настройке механизма OOM-Killer в Linux для более агрессивной реакции в условиях нехватки памяти. Рассмотрим теоретическую часть, примеры, а также применение на практике для достижения желаемого результата.

Теория

OOM-Killer — это встроенная в ядро Linux функция, отвечающая за завершение процессов в условиях критической нехватки оперативной памяти, чтобы предотвратить системный сбой. В "старые добрые времена" пользователи часто сталкивались с тем, что OOM-Killer убивал процессы слишком агрессивно, что вызывало неудобства. Сегодня ситуация изменилась, и иногда система оказывается неспособной реагировать из-за чрезмерного использования swap.

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

Примеры

  1. Уменьшение размера swap: Современные системы по умолчанию могут выделять количество swap, равное или вдвое превышающее физическую память. Однако в современных условиях блоковое управление памятью позволяет сократить размер swap без ущерба для производительности. Это способствует более быстрому срабатыванию OOM-Killer и сокращению времени реакции системы.

  2. Настройка параметров системы:

    • Установка vm.oom_kill_allocating_task=1 в файле конфигурации /etc/sysctl.conf позволяет системе убивать процесс, который пытается выделить память, когда она исчерпана. Это делают так:
      echo 1 > /proc/sys/vm/oom_kill_allocating_task
  3. Использование утилит:

    • Утилита earlyoom позволяет настроить пороговые значения для свободной ОЗУ и swap, при достижении которых процессы начинают завершаться. Это полезно для предотвращения "замораживания" системы.
    • Установка systemd-oomd, более современного инструмента, который отслеживает использование памяти и завершает процессы до того, как система достигнет критического состояния. Это решение более гибкое и учитывает зависимость процессов в пользовательском пространстве.

Применение

Для восстановления "агрессивности" OOM-Killer, необходимо настроить параметры виртуальной памяти так, чтобы система быстро реагировала на нехватку ресурсов:

  1. Проверка и настройка swap:

    • Определите текущие размеры swap:
      swapon --show
    • При необходимости уменьшите размер swap до более разумного значения.
  2. Настройка системных параметров:

    • В случае, если вы удовлетворены текущим поведением OOM-Killer после временных изменений, закрепите их в системе:
      echo "vm.oom_kill_allocating_task=1" >> /etc/sysctl.conf
      sysctl -p /etc/sysctl.conf
  3. Установка и конфигурация earlyoom:

    • Установите пакет:
      sudo apt install earlyoom
    • Настройте earlyoom на такие параметры, которые соответствуют вашим системным требованиям для своевременного завершения процессов при нехватке памяти.
  4. Интеграция с systemd-oomd:

    • Активируйте и настройте systemd-oomd:
      Убедитесь, что он может нормально взаимодействовать с другими механизмами управления ресурсами и завершением процессов.

Управление памятью — это сложный баланс, и в ситуации, когда вы хотите вернуть системе способность быстро реагировать на нехватку памяти, важно учитывать не только агрессивность OOM-Killer, но и общую конфигурацию системы и используемое программное обеспечение. Каждое изменение системы требует детального анализа и тестирования, чтобы избежать непредвиденных побочных эффектов и потери важных данных.

Оцените материал
Добавить комментарий

Капча загружается...