Моя ситуация следующая: мы запускаем Magento Professional на 15-гигабайтном экземпляре оперативной памяти, в стойке.
При запуске htop мы могли видеть, что «запуск apache2 -k» порождает все больше дочерних процессов, некоторые из них потребляют ~ 900 МБ памяти.
Когда память почти полностью израсходована, время ожидания всех сайтов истекло или они стали очень медленными. Когда память полностью израсходована, кажется, что некоторые из этих процессов были убиты, чтобы освободить память.
Затем происходят те же процедуры.
Мой вопрос: можем ли мы настроить Ubuntu / Apache для уничтожения дочерних процессов и освобождения памяти, когда использование памяти достигает 85-90%?
Это не совсем то, что вы просили, но вы можете использовать этот метод:
Вы должны знать два параметра: среднее использование памяти на процесс apache, объем оперативной памяти, который вы хотите выделить для apache (например, полная память - 2 ГБ)
Затем вы устанавливаете директиву MaxClients на
MaxClients = объем ОЗУ, который вы хотите выделить для Apache (например, полная ОЗУ - 2 ГБ) / среднее использование памяти на apache process
Итак, если я считаю вашу ситуацию корректной: 14 ГБ (15-1 для системы) / 800 => MaxClients ~ = 18
Но помните: когда вы достигаете большего количества трафика, чем 18 одновременных запросов они будут поставлены в очередь, но ваша память и весь SysOp будут в безопасности ...
#!/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
с некоторой информацией о выполнении и сохранении памяти.
** Помните: это только бинты! Необходимо обнаружить реальную проблему с вашим сервером.
Надеюсь, это поможет вам!
Это может быть глупо, но ... вы можете настроить задание cron, которое периодически запускает скрипт. Указанный скрипт может проверять использование памяти apache и при необходимости убивать / перезапускать его.
Этот вопрос имеет пример cron: https://stackoverflow.com/questions/5398014/cron-crontab-execute-a-script-every-minute-and-another-one-every-24-hours