Я запускаю Debian на машине с ограниченным объемом памяти и без возможности добавить пространство подкачки. Машина служит веб-сервером и сервером базы данных. Проблема, которую я вижу, заключается в том, что при поступлении нескольких веб-запросов моя база данных перестает принимать соединения и иногда даже дает сбой, потому что в системе больше нет доступной оперативной памяти.
Можно ли указать Linux убить определенные процессы (в моем случае Apache), если другой процесс (в моем случае Firebird) запрашивает память, а ее недостаточно? Если это невозможно сделать изначально, может быть, есть какой-нибудь инструмент, который поможет мне добиться этого?
Вы можете настроить убийцу OOM, чтобы предпочесть определенные процессы. У каждого процесса есть оценка, которая указывает вероятность того, что процесс будет остановлен в случае, если система будет работать в ситуации OOM. Вы можете увидеть оценку процесса в /proc/${PID}/oom_score
. Вы можете изменить решение убийцы OOM, используя /proc/${PID}/oom_adj
: высокое значение увеличивает вероятность того, что убийца OOM собирается убить $ {PID}. Значение oom_adj
наследуется дочерними элементами, поэтому вы просто устанавливаете его в главном процессе apache при запуске (в этом случае вы должны иметь сторожевой таймер, который перезапускает apache); альтернативой является оставить главный процесс на уровне по умолчанию и настроить каждого дочернего процесса так, чтобы мастер оставался живым и повторно порождал дочерние элементы по мере необходимости (в этом случае вам нужен внешний демон, который проверяет наличие новых дочерних элементов и мелодий oom_adj
). Конечно, это предполагает, что вы используете многопроцессорный рабочий ;-)
Обратите внимание, что нормальный диапазон oom_adj
values (-16,15) - это только смещение, эвристика убийцы OOM все же может выбрать другой процесс, если его оценка достаточно высока. Специальное значение -17 делает процесс неубиваемым OOM-убийцей, но это опасно, потому что, если неубиваемый процесс (например, ваша БД) переходит в неистовство, ядро может не восстановиться после нехватки памяти.
Если вы используете арендованную виртуальную машину, просто добавьте файл подкачки вместо раздела подкачки. Производительность ниже, но, по крайней мере, при необходимости у вас будет доступная память :)
Как создать файл подкачки?
sudo dd if=/dev/zero of=/swapfile bs=1024 count=1000000
Это создаст файл (/ swapfile) размером 1 ГБ (круглый).
sudo mkswap /swapfile
добавьте этот файл в свой пул подкачки
sudo swapon /swapfile
Это выполнит свою работу, теперь у вас есть дополнительный ГБ памяти подкачки.