Отключение процессов Apache, когда использование памяти достигает 90%.

Моя ситуация следующая: мы запускаем Magento Professional на 15-гигабайтном экземпляре оперативной памяти, в стойке.

При запуске htop мы могли видеть, что «запуск apache2 -k» порождает все больше дочерних процессов, некоторые из них потребляют ~ 900 МБ памяти.

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

Затем происходят те же процедуры.

Мой вопрос: можем ли мы настроить Ubuntu / Apache для уничтожения дочерних процессов и освобождения памяти, когда использование памяти достигает 85-90%?

1
задан 10 January 2014 в 05:19

3 ответа

Это не совсем то, что вы просили, но вы можете использовать этот метод:

Вы должны знать два параметра: среднее использование памяти на процесс apache, объем оперативной памяти, который вы хотите выделить для apache (например, полная память - 2 ГБ)

Затем вы устанавливаете директиву MaxClients на

MaxClients = объем ОЗУ, который вы хотите выделить для Apache (например, полная ОЗУ - 2 ГБ) / среднее использование памяти на apache process

Итак, если я считаю вашу ситуацию корректной: 14 ГБ (15-1 для системы) / 800 => MaxClients ~ = 18

Но помните: когда вы достигаете большего количества трафика, чем 18 одновременных запросов они будут поставлены в очередь, но ваша память и весь SysOp будут в безопасности ...

0
ответ дан 10 January 2014 в 05:19
#!/bin/sh
TOTAL=`cat /proc/meminfo | grep MemTotal: | awk '{print $2}'`
USEDMEM=`cat /proc/meminfo | grep Active: | awk '{print $2}'`
LOG=/var/log/apache-free.log
LIMIT=90
DATA=`date +%Y-%m-%d" "%H:%M:%S`

if [ "$USEDMEM" -gt 0 ]
 then
    USEDMEMPER=$(($USEDMEM * 100 / $TOTAL))
    USEDMEMPERLOG=$USEDMEMPER
    if [ $USEDMEMPER -lt $LIMIT ]; then
                echo "$DATA | Memory: $USEDMEMPER%, (limit: $LIMIT%) | Do not restart!"
    else
                echo "$DATA | Memory limit reached ($LIMIT%): $USEDMEMPERLOG% | Restarting apache..."
                # restart apache
                sudo service apache2 restart
                TOTAL=`cat /proc/meminfo | grep MemTotal: | awk '{print $2}'`
                USEDMEM=`cat /proc/meminfo | grep Active: | awk '{print $2}'`
                USEDMEMPER=$(($USEDMEM * 100 / $TOTAL))
                echo "$DATA | Memory limit reached ($LIMIT%): $USEDMEMPERLOG% | Memory after restart: $USEDMEMPER%" >> $LOG
                tail -1 $LOG
    fi
fi

Сохраните этот код как файл apache-free.sh и установите его в качестве исполняемого файла и добавьте разрешения

chmod +X apache-free.sh
chmod 755 apache-free.sh

добавьте расписание crontab, которое будет запускаться каждую 1 минуту (не стесняйтесь переопределять это время)

crontab -e

*/1 * * * * cd /dir/of/script && sh apache-free.sh

Этот сценарий сохраняет файл журнала в /var/log/apache-free.log с некоторой информацией о выполнении и сохранении памяти.

** Помните: это только бинты! Необходимо обнаружить реальную проблему с вашим сервером.

Надеюсь, это поможет вам!

0
ответ дан 10 January 2014 в 05:19

Это может быть глупо, но ... вы можете настроить задание cron, которое периодически запускает скрипт. Указанный скрипт может проверять использование памяти apache и при необходимости убивать / перезапускать его.

Этот вопрос имеет пример cron: https://stackoverflow.com/questions/5398014/cron-crontab-execute-a-script-every-minute-and-another-one-every-24-hours

0
ответ дан 10 January 2014 в 05:19

Другие вопросы по тегам:

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