Автоматически убивать / перезапускать процесс (ы), когда память критически мала
У меня есть Debian Wheezy VPS box, где я использую пару приложений Django. В идеале, я бы попытался решить текущие проблемы с объемом памяти, оптимизировав приложения, добавив больше оперативной памяти или увеличив объем с помощью Swap. Но проблема в том, что я сомневаюсь в том, что я оптимизирую память на оптимизацию приложений Django (стек с открытым исходным кодом и надежный), и добавление ОЗУ является для меня ограничением затрат (это также удаленный VPS), хост не предлагает варианты использования Swap!
Итак, пока (пока я жду, чтобы выделить больше ресурсов и выделить больше оперативной памяти), я хочу смягчить сценарии, когда серверу не хватает памяти, так что мне просто нужно запросить перезапуск VPS (как в тот момент, когда я не могу даже SSH в коробку!).
Итак, что бы мне понравилось в решении, так это способность обнаруживать, когда процесс (или, как правило, общее использование системной памяти) превышает определенную критическую величину (на данный момент, например, БЕСПЛАТНАЯ ОЗУ падает, скажем, на 10%) - что я замечено, что это происходит после того, как VPS долго работал, и когда к некоторым тяжелым приложениям внезапно приходит большой трафик (большинство в любом случае просто ставят приложения).
Итак, я хочу иметь возможность убить / перезапустить нарушающий процесс (а) - скорее всего, Apache. Какое решение при ручном выполнении в этих ситуациях восстановило разумные уровни использования памяти - намек на то, что, возможно, одно или несколько приложений Django имеют утечку памяти?
Вкратце:
- Мониторинг общего использования оперативной памяти системы
- Когда уровень свободной оперативной памяти падает ниже заданного критического порога (скажем, ниже 10%), убейте / перезапустите нарушающий процесс (ы) - или проще, если мы предположим из моего текущего анализа журнала (используя linux-dash), что Apache часто является нарушителем, затем убейте / перезапустите его.
- Промыть и повторить...
3 ответа
Ядро Linux имеет так называемый встроенный OOM Killer. Это "Убийца нехватки памяти". Поэтому, когда ваш ящик исчерпал свой оперативной памяти и подкачки, ядро начнет убивать вещи, чтобы сделать сервер доступным.
Вы можете настроить приоритеты процессов, чтобы определить "вероятность" процесса, который будет убит. Подробнее читайте по этой ссылке, см. Раздел "Настройка OOM Killer".
По сути, вы настраиваете вероятность в файле /proc/*/oom_adj. Например. повысить вероятность убийства любого из запущенных в данный момент экземпляров apache?
pgrep apache2 | sudo xargs -I% PID sh -c 'echo 10> / proc /% PID / oom_adj'
Или уменьшите вероятность того, что SSH будет убит:
pgrep sshd | sudo xargs -I% PID sh -c 'echo -17> / proc /% PID / oom_adj'
Кроме того, я рекомендую полностью отключить подкачку на сервере, где у вас есть эта проблема, потому что подкачка настолько медленная, что может перевести сервер в виртуальное состояние покоя, даже несмотря на то, что остается пространство подкачки, что никогда не вызывает убийцу OOM.
Если эти приложения работают внутри apache2
сервер, вы можете настроить сервер. Рассматривать:
- Ограничить MaxRequestWorkers (это ограничивает количество работников, использующих память).
- Ограничить MaxConnectionsPerChild (Это перезапускает серверы, чтобы они не занимали много памяти. Это полезно, если приложения имеют утечку памяти.
Если ваши процессы имеют утечку памяти, вы можете использовать /etc/security/limits.conf
ограничить объем памяти, который может содержать сервер. Это предотвратит слишком большой рост серверов. Тот же эффект может быть достигнут на временной основе с помощью ulimit
команда. Это может быть лучше всего использовать ulimit
найти подходящий размер, а затем установить эти значения в limits.conf
файл. Если ваш сервер поддерживает это, поместите файл в /etc/security/limits.d
а не редактирование /etc/security/limits.conf
,
Прежде всего, я бы сказал, что перезапуск не является проблемой решения, и лучший способ состоит в том, чтобы найти нарушающий процесс и почему он потребляет много памяти. Как упомянуто выше, в linux уже есть механизм OOM, чтобы найти нарушающий процесс и убить его, чтобы снять нагрузку на память
Другой способ выяснить это с помощью Kdump, настроить этот параметр vm.panic_on_oom = 1(/etc/sysctl.conf), это сгенерирует vmcore, когда системе не хватает памяти. Вы можете найти больше информации об этом здесь
http://people.redhat.com/anderson/crash_whitepaper/
Также limit.conf имеет много ограничений, лучшее решение состоит в том, чтобы использовать cgroups для ограничения использования памяти на процесс
Таким образом, в /etc/cgconfig.conf вы можете определить группу управления следующим образом (здесь я ограничиваю свое приложение использованием только 256 МБ памяти)
group test {
memory {
memory.limit_in_bytes = 256m;
}
}
и затем в /etc/cgrules.conf я могу определить, что использование вашего приложения (в вашем случае django не может превышать 256)
*:django memory test/
Для получения дополнительной информации о cgroup вы можете обратиться
Но идея перезапуска приложения кажется плохой.