Автоматически Уничтожьте/Перезапустите Процесс (процессы), Когда Память будет Критически Низкой

У меня есть поле Debian Wheezy VPS, где запускаю несколько приложений Django в производстве. Идеально, попробовал бы, решил мои текущие проблемы объема потребляемой памяти путем оптимизации приложений, добавления большего количества RAM или увеличения с Подкачкой. Но проблема состоит в том, что я сомневаюсь, что существует много оптимизации памяти, которую я доил бы от оптимизации приложений Django (стек, являющийся открытым исходным кодом и устойчивый) и добавляющий, что RAM является ограничением стоимости для меня (это - удаленный VPS) также хост не предлагает опций использовать Подкачку!

Так, тем временем (поскольку я ожидаю для обеспечения большего количества ресурсов для предоставления большего количества RAM), я хочу смягчить сценарии, где сервер заканчивается память так, чтобы я просто запросил перезапуск VPS (как в, в той точке, я не могу даже SSH в поле!).

Так, что я любил бы в решении, способность обнаружить, когда процесс (или обычно, общее использование системной памяти) превышает определенную критическую сумму (на данный момент, пример, СВОБОДНАЯ RAM падает для высказывания 10%) - то, которое я заметил, происходит после VPS's, на который возросли долгое время, и когда также трафик внезапно очень к некоторым тяжелым приложениям (большинство просто подготавливает приложения так или иначе).

Так, я хочу смочь уничтожить/перезапустить незаконный процесс (процессы) - наиболее вероятный Apache. Какое решение при ручном выполнении в этих ситуациях восстановило нормальные уровни использования памяти - подсказка, что возможно один или несколько приложений Django имеет утечку памяти?


Вкратце:

  1. Контролируйте полное системное Использование оперативной памяти
  2. Когда СВОБОДНАЯ RAM падает ниже данного критического порога (скажите ниже 10%), уничтожьте/перезапустите незаконный процесс (процессы) - или более простой, если мы принимаем от моего текущего анализа журнала (использующий тире Linux), что Apache часто является преступником, затем уничтожьте/перезапустите его.
  3. Промывка и повторение...
1
задан 20 August 2014 в 20:46
3 ответа

В ядро 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.

4
ответ дан 3 December 2019 в 16:45

Если эти приложения работают внутри сервера apache2, вы можете настроить сервер. Рассмотрим:

  • Ограничить MaxRequestWorkers (Это ограничивает количество рабочих, использующих память).
  • Ограничить MaxConnectionsPerChild (Это перерабатывает серверы так, чтобы они не потребляли много памяти. Это полезно, если у приложений утечка памяти.

Если у ваших процессов утечка памяти, вы можете использовать /etc/security/limits.conf для ограничения объема памяти, который может содержать сервер. Это предотвратит рост серверов. Тот же эффект может быть достигнут на временной основе с помощью команды ulimit. Лучше всего использовать ulimit для определения подходящего размера, а затем установить эти значения в файле limit.conf. Если ваш сервер поддерживает это, бросьте файл в /etc/security/limits.d вместо редактирования /etc/security/limits.conf.

.
1
ответ дан 3 December 2019 в 16:45

Прежде всего, я бы сказал, что перезапуск - это не проблема решения, и лучший способ - это найти обидный процесс и почему он потребляет много памяти. Как упоминалось выше, в 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 вы можете обратиться к

https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/6/html/Resource_Management_Guide/sec-memory.html

Но идея перезапуска приложения кажется плохой.

.
1
ответ дан 3 December 2019 в 16:45

Теги

Похожие вопросы