Назад | Перейти на главную страницу

Есть ли способ автоматически предотвратить нехватку памяти?

Мне часто не хватает памяти на моем сервере VPS ubuntu. Хотелось бы, чтобы был способ просто перезапустить apache2, когда ему начинает не хватать памяти, поскольку это, похоже, решает проблему. Или мне просто лень решать проблему? У меня ограниченная память на сервере ...

Хорошо, подробнее:

Я запускаю предварительный форк apache2, вот мои настройки памяти (я их настраивал ...):

StartServers         3
MinSpareServers      1
MaxSpareServers      5
MaxClients           150
MaxRequestsPerChild  1000

VPS имеет 1 ГБ оперативной памяти, работает под управлением 32-разрядной версии ubuntu 11.04.

Что касается скриптов, у меня есть сеть wordpress с 5 блогами, установка AskBot (клон python / django stackexchange) и установка MediaWiki, которая на самом деле не используется. Существует также самодельный mp3-скрипт, который обращается к библиотеке getid3 для отображения информации в списках подкастов, и, похоже, выдает некоторые ошибки php, не уверен, что это виноват ...

Apache не должен испытывать нехватку памяти, если у вас нет утечки памяти в приложении, которое вы запускаете под apache, или если определенный запрос требует огромной памяти. Я хотел бы исследовать, почему у меня заканчивается память, в первую очередь, чем реализовать решение грубой силы, подобное тому, о котором вы просите.

С учетом вышесказанного, должно быть очень просто реализовать базовый сценарий задания cron, который просто вызывает «ps» для процессов apache, определяет, сколько памяти они потребляют, и перезапускает его при необходимости. Запускать это каждую минуту должно быть достаточно.

Но опять же - это не лучший подход.

Монит может это сделать.

Вы можете использовать такую ​​строку конфигурации, как:

 check process apache 
    with pidfile "/var/lock/apache/httpd.pid"
    start program = "/etc/init.d/httpd start" with timeout 60 seconds
    stop program = "/etc/init.d/httpd stop"
    if 2 restarts within 3 cycles then timeout
    if totalmem > 100 Mb for 5 cycles then restart
    if children > 255 for 5 cycles then stop
    if cpu usage > 95% for 3 cycles then restart
    if failed port 80 protocol http then restart
    group server
    depends on httpd.conf, httpd.bin

(Изменено с этот пример конфигурации на monit.com)

Это также может сыграть роль в упомянутой ранее опции ulimit.

Перезапуск сервиса - бандаж. Вместо этого вам следует попытаться выяснить, почему происходит утечка памяти.

Запуск apache под ulimit -m X заставит его быть убитым, когда он (и его дети) превысит XК RSS. Я не знаю, использует ли Ubuntu Upstart по-прежнему, но если это так, вы можете добавить respawn в конфигурационный файл apache upstart, чтобы он автоматически перезапускался после его уничтожения.

На самом деле это довольно сложный вопрос, потому что он зависит от того, что потребляет память. Если вы строго обслуживаете статический контент (кто это еще делает?), Вам нужно взглянуть на свою конфигурацию Apache, чтобы убедиться, что он не допускает большего количества одновременных подключений / потоков, чем может обрабатывать ваша доступная память.

Скорее всего, у вас есть PHP-скрипты или плохо настроенное серверное приложение, которое неправильно использует всю вашу память. Это часто случается с большими PHP-приложениями, которые увеличивают максимальный объем оперативной памяти до 32 или 64 МБ при запуске, и вы получаете сразу 4 посетителей.

Не могли бы вы опубликовать дополнительную информацию о том, как apache настроен на вашем сервере?

Другая причина, по которой вам может не хватить памяти, является то, что на вашем сервере ubuntu нет файла подкачки.

На вашем компьютере может не хватить памяти из-за определенного запроса, который время от времени возникает, что приводит к потреблению большого количества памяти. Если у вас есть файл подкачки (он должен быть примерно в два раза больше памяти сервера), это может решить вашу проблему.

Но все же вам нужно выяснить, что вызывает потребление всей памяти. Если память потребляется все время и не освобождается, файл подкачки не поможет - это может даже ухудшить ситуацию, так как вся память будет израсходована, и из-за подкачки машина будет работать очень-очень-очень медленно.