технология в операционных системах семейства Linux, которая при израсходовании, почти, всей оперативной памяти на основе определенного алгоритма принимает решение, какой процесс нужно убить, чтобы не допустить перерасхода ресурсов и зависания системы. Аббревиатура расшифровывается как Out of Memory Killer.
Чтобы увидеть, применялся ли в системе oom killer, используем dmesg:
dmesg -T | egrep -i ‘killed process’
Будет выполнен анализ лога, и если killer запускался, мы увидим что-то на подобие:
[Wed Sep 18 12:03:36 2024] Out of memory: Killed process 785923 (postmaster) total-vm:1261472kB, anon-rss:15000kB, file-rss:4kB, shmem-rss:1025780kB, UID:20 pgtables:4320kB oom_score_adj:0
Если упрощенно, данная строчка нам говорит, что 18 сентября в 12:03 был остановлен процесс с идентификатором 785923. Имя процесса postmaster (PostgreSQL).
Какой процесс уничтожить. Чтобы понять, какой процесс можно остановить, OOM Killer запускает внутреннюю функцию oom_badness(). Данная функция получает значения занимаемого объема оперативной памяти в процентном эквиваленте для каждого из запущенных процессов, после чего эти значения модифицируются в соответствии с алгоритмом:
Полученный результат может иметь значения от 0 до 1000, поделив который на 10 мы получаем процент вероятности, что процесс будет убит (0 или 100%).
В итоге, на основе полученных чисел функция oom_badness составляет список всех процессов, которых должен убить oom killer. Как правило, в этот список попадают те, кто больше всех потребляет памяти, но при этом наименее активен, а также имеет самое короткое время жизни.
Как смотреть значения OOM для процесса.
Для нас интересны значения 3-х опций:
cat /proc/<PID>/oom_adj
cat /proc/<PID>/oom_score_adj
cat /proc/<PID>/oom_score
* где <PID> — идентификатор процесса. Подробнее о работе с процессами Linux читайте в статье Работа с процессами в Linux.
Разберем их подробнее:
Как можно менять приоритеты для киллера.
Мы можем изменить значение для oom_adj на лету, например:
echo -17 > /proc/<PID>/oom_adj
Данная команда приведет к тому, что процесс не будет убит с помощью OOM-киллера.
Или наоборот:
echo 15 > /proc/<PID>/oom_adj
… повысит вероятность до 100%, что при необходимости процесс будет уничтожен.
Однако, данная настройка будет действовать до перезапуска процесса. Для указания перманентного значения лучше всего использовать опцию OOMScoreAdjust для systemd. Например, мы хотим изменить приоритет для сервиса nginx — создаем drop-in файл:
systemctl edit nginx
И добавляем:
[Service]
OOMScoreAdjust=-300
* вероятность уничтожения nginx будет немного понижена.
Перезапускаем процесс, чтобы изменения применились:
systemctl restart nginx
Zulip — программное обеспечение для реализации корпоративного чата. Разработан в 2012 году, в 2014 был…
Zookeeper — cервис-координатор, который позволяет обеспечить контроль синхронизации данных. Разработан на Java компанией Apache Software…
Zimbra — программное обеспечение для реализации почтового сервиса или, если сказать точнее, автоматизации совместной деятельности…
Zabbix — бесплатная система мониторинга. Позволяет отслеживать состояние сетевых узлов, компьютеров и серверов. Возможности: Поддержка…
YouTube — компания-владелец одноименного портала для просмотра и хранения видео. Чтобы пользоваться данным порталом достаточно…
Yota — провайдер, предоставляющий доступ к сети Интернет по беспроводной связи. Впервые, сервис начал работать…