У меня есть поле Debian Wheezy VPS, где запускаю несколько приложений Django в производстве. Идеально, попробовал бы, решил мои текущие проблемы объема потребляемой памяти путем оптимизации приложений, добавления большего количества RAM или увеличения с Подкачкой. Но проблема состоит в том, что я сомневаюсь, что существует много оптимизации памяти, которую я доил бы от оптимизации приложений Django (стек, являющийся открытым исходным кодом и устойчивый) и добавляющий, что RAM является ограничением стоимости для меня (это - удаленный VPS) также хост не предлагает опций использовать Подкачку!
Так, тем временем (поскольку я ожидаю для обеспечения большего количества ресурсов для предоставления большего количества RAM), я хочу смягчить сценарии, где сервер заканчивается память так, чтобы я просто запросил перезапуск VPS (как в, в той точке, я не могу даже SSH в поле!).
Так, что я любил бы в решении, способность обнаружить, когда процесс (или обычно, общее использование системной памяти) превышает определенную критическую сумму (на данный момент, пример, СВОБОДНАЯ RAM падает для высказывания 10%) - то, которое я заметил, происходит после VPS's, на который возросли долгое время, и когда также трафик внезапно очень к некоторым тяжелым приложениям (большинство просто подготавливает приложения так или иначе).
Так, я хочу смочь уничтожить/перезапустить незаконный процесс (процессы) - наиболее вероятный Apache. Какое решение при ручном выполнении в этих ситуациях восстановило нормальные уровни использования памяти - подсказка, что возможно один или несколько приложений Django имеет утечку памяти?
Вкратце:
В ядро linux встроен так называемый OOM Killer. Это "Убийца вне памяти". Поэтому, когда ваш ящик исчерпает свой таран и замену, ядро начнет убивать, чтобы сделать сервер доступным.
Вы можете настроить приоритеты процессов, чтобы определить "вероятность" убийства процесса. Подробнее об этом читайте по ссылке , см. раздел "Настройка убийцы OOM".
В основном, вы настраиваете вероятность в файле /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'
Также я рекомендую полностью отключить swap на сервере, где у вас эта проблема, так как swap настолько медленный, что может привести к виртуальной остановке сервера, даже несмотря на то, что пространство подкачки все еще осталось, таким образом, никогда не приводя в действие убийцу OOM.
Если эти приложения работают внутри сервера apache2
, вы можете настроить сервер. Рассмотрим:
Если у ваших процессов утечка памяти, вы можете использовать /etc/security/limits.conf
для ограничения объема памяти, который может содержать сервер. Это предотвратит рост серверов. Тот же эффект может быть достигнут на временной основе с помощью команды ulimit
. Лучше всего использовать ulimit
для определения подходящего размера, а затем установить эти значения в файле limit.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/
Также limits.conf имеет много ограничений,лучше решение - использовать cgroups для ограничения использования памяти для каждого процесса
Так что в /etc/cgconfig. conf вы можете определить группу управления следующим образом (здесь я ограничиваю использование моего приложения только 256MB памяти)
group test {
memory {
memory.limit_in_bytes = 256m;
}
}
а затем в /etc/cgrules.conf я могу определить, что использование вашего приложения (в вашем случае django не может превышать 256)
*:django memory test/
Для получения более подробной информации о cgroup вы можете обратиться к
Но идея перезапуска приложения кажется плохой.
.