Out Of Memory Killer или OOM Killer - это процесс, который ядро linux использует, когда системе критически не хватает памяти. Такая ситуация возникает из-за того, что ядро linux выделило слишком много памяти для своих процессов.
Когда процесс запускается, он запрашивает у ядра блок памяти. Этот первоначальный запрос обычно имеет большой объем, который процесс не сможет сразу или вообще когда-либо использовать. Ядро, зная об этой тенденции процессов запрашивать избыточную память, выделяет системную память в избытке. Это означает, что когда в системе имеется, например, 2 ГБ оперативной памяти, ядро может выделить процессам 2,5 ГБ.
Обычно такая ситуация не вызывает проблем. Однако если достаточное количество процессов начнет использовать все запрашиваемые блоки памяти, то физической памяти не хватит для их поддержки. Это означает, что запущенные процессы требуют больше памяти, чем физически доступно. Такая ситуация является критической и должна быть решена немедленно.
Решение, которое использует ядро linux, заключается в том, чтобы вызвать OOM Killer для проверки всех запущенных процессов и убить один или несколько из них, чтобы освободить системную память и сохранить работоспособность системы.
OOM Killer будет вызываться только тогда, когда системе критически не хватает памяти.
Хотя то, что будет убито, часто кажется случайным или просто самым большим потребителем памяти, OOM Killer работает не так. Вместо этого, он выбирает, какой процесс убить, основываясь на его oom_score. Это значение контролируется самой операционной системой на основе ряда критериев.
Вы можете проверить oom_score процесса, посмотрев /proc/$PID/oom_score.
Хотя мы не можем действительно предотвратить уничтожение прцоесса в случае необходимости, мы можем настроить oom_score, чтобы сделать процесс менее вероятным для уничтожения OOM Killer. Для этого вы можете отредактировать следующий файл:
1 | /proc/$PID/oom_score_adj |
Файлы в /proc не являются реальными файлами, это интерфейс к нижним уровням операционной системы. Поэтому вы не можете редактировать их с помощью nano или vi. Скорее, вы можете передать значение в файл как таковое:
1 | echo -100 > /proc/$PID/oom_score_adj |
Вы можете изменить значение в этом файле, допустимыми значениями являются целые числа в диапазоне от -1000 до 1000. Чем меньше значение, тем меньше шанс, что он будет убит.
Опять же, это не предотвратит уничтожение процесса, но повлияет на вероятность этого. Имейте в виду, что если процесс перезапустится, вам придется снова установить значение oom_score_adj.