20 дек. 2013 г.

Linux Out-of-Memory Killer (OOM)

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

Текущая реализация OOM Killer в Linux стремится выбрать наименее важный процесс. Он выбирается среди всех процессов, кроме init и kernel threads, на основе подсчета для всех процессов очков и тот, что набрал больше всех очков - убивается. Алгоритм анализа достаточно сложен и я не буду его приводить здесь.

Бывает, необходимо защитить определенный, важные процессы от "убиения". В конце подсчета очков для процесса, число возводится в степень приоритета, которая может принимать значения -15...15 или -17. "-17" означает, что процесс не будет принудительно завершен вообще. Значение приоритета хранится в файлике /proc/$PID/oom_adj. Т. е. этот файлик создается для каждого процесса и уничтожается с его завершением.

Соответственно, дабы защитить процесс от "убиения", необходимо узнать PID этого процесса и записать в его файл oom_adj значение -17. Например, для процесса sshd, можно использовать команду:

pgrep -f "/usr/sbin/sshd" | while read PID; do echo -17 > /proc/$PID/oom_adj; done

Эта команда для всех процессов демона sshd назначает приоритет. Но нужно быть осторожным с приоритетами - система может вести себя непредсказуемо, если защищенный таким образом процесс займет всю память (скорее всего закончится это т. н. kernel panic). Поэтому рекомендуют ставить минимальный приоритет "-15".

Приведенную выше команду нужно выполнять после запуска процесса, т. е. или в конце стартового скрипта или по cron-у.

Ссылки на более детальную информацию: