Elimine processos do apache quando o uso de memória atinge 90%

1

Minha situação é a seguinte: Nós rodamos o Magento Professional em uma instância de ram de 15Gb, rackspace.

Ao executar o htop, podemos ver que 'apache2 -k start' continua gerando mais processos filhos, alguns deles consomem ~ 900Mb de memória.

Quando a memória está quase esgotada, todos os sites expiram ou ficam muito lentos. Quando a memória está esgotada, parece que alguns desses processos foram mortos para liberar memória.

Então os mesmos procedimentos acontecem.

Minha pergunta é, poderíamos configurar o ubuntu / apache para eliminar processos filhos e liberar memória quando o uso da memória atingir 85-90%?

    
por ALAN VO 10.01.2014 / 02:19

3 respostas

2

Não é exatamente o que você pediu, mas você pode usar este método:

Você precisa conhecer dois parâmetros: uso médio de memória por processo do apache, quantidade de RAM que deseja alocar para o apache (por exemplo, RAM total - 2 GB)

Você define a diretiva MaxClients para

MaxClients = quantidade de RAM que você deseja alocar para o apache (por exemplo, RAM total - 2 GB) / uso médio de memória por processo do apache

Então, se eu contar sua situação correta: 14GB (15-1 para o sistema) / 800 = > MaxClients ~ = 18

Mas lembre-se: quando você atingir mais tráfego do que 18 solicitações simultâneas, elas serão enfileiradas, mas sua memória e o SysOp inteiro estarão seguros ...

    
por pl_ 16.01.2014 / 23:16
2
#!/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

Salve este código como arquivo apache-free.sh e defina como executável e adicione permissões

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

adicione um cronograma crontab, para executar a cada 1 minuto (sinta-se livre para redefinir este tempo)

crontab -e

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

Este script salva um arquivo de log em /var/log/apache-free.log com algumas informações sobre a execução e a economia de memória.

** Lembre-se: é apenas um bandaid! É necessário detectar o problema real com o seu servidor.

Espero que ajude você!

    
por Thiago Alves Cavalcante 09.10.2014 / 13:39
0

Isso pode ser kludgy, mas ... você pode configurar um cron job que execute periodicamente um script. Esse script pode verificar o uso de memória do apache e matá-lo / reiniciá-lo, se necessário.

Esta questão tem um exemplo de cron: link

    
por superdesk 10.01.2014 / 02:35