Вопрос или проблема
В прежние времена я ругал 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 срабатывал быстрее, освобождая ресурсы системы.
Примеры
-
Уменьшение размера swap: Современные системы по умолчанию могут выделять количество swap, равное или вдвое превышающее физическую память. Однако в современных условиях блоковое управление памятью позволяет сократить размер swap без ущерба для производительности. Это способствует более быстрому срабатыванию OOM-Killer и сокращению времени реакции системы.
-
Настройка параметров системы:
- Установка
vm.oom_kill_allocating_task=1
в файле конфигурации/etc/sysctl.conf
позволяет системе убивать процесс, который пытается выделить память, когда она исчерпана. Это делают так:echo 1 > /proc/sys/vm/oom_kill_allocating_task
- Установка
-
Использование утилит:
- Утилита
earlyoom
позволяет настроить пороговые значения для свободной ОЗУ и swap, при достижении которых процессы начинают завершаться. Это полезно для предотвращения "замораживания" системы. - Установка
systemd-oomd
, более современного инструмента, который отслеживает использование памяти и завершает процессы до того, как система достигнет критического состояния. Это решение более гибкое и учитывает зависимость процессов в пользовательском пространстве.
- Утилита
Применение
Для восстановления "агрессивности" OOM-Killer, необходимо настроить параметры виртуальной памяти так, чтобы система быстро реагировала на нехватку ресурсов:
-
Проверка и настройка swap:
- Определите текущие размеры swap:
swapon --show
- При необходимости уменьшите размер swap до более разумного значения.
- Определите текущие размеры swap:
-
Настройка системных параметров:
- В случае, если вы удовлетворены текущим поведением OOM-Killer после временных изменений, закрепите их в системе:
echo "vm.oom_kill_allocating_task=1" >> /etc/sysctl.conf sysctl -p /etc/sysctl.conf
- В случае, если вы удовлетворены текущим поведением OOM-Killer после временных изменений, закрепите их в системе:
-
Установка и конфигурация
earlyoom
:- Установите пакет:
sudo apt install earlyoom
- Настройте
earlyoom
на такие параметры, которые соответствуют вашим системным требованиям для своевременного завершения процессов при нехватке памяти.
- Установите пакет:
-
Интеграция с
systemd-oomd
:- Активируйте и настройте
systemd-oomd
:
Убедитесь, что он может нормально взаимодействовать с другими механизмами управления ресурсами и завершением процессов.
- Активируйте и настройте
Управление памятью — это сложный баланс, и в ситуации, когда вы хотите вернуть системе способность быстро реагировать на нехватку памяти, важно учитывать не только агрессивность OOM-Killer, но и общую конфигурацию системы и используемое программное обеспечение. Каждое изменение системы требует детального анализа и тестирования, чтобы избежать непредвиденных побочных эффектов и потери важных данных.