web-dev-qa-db-fra.com

Éliminez les processus Apache lorsque l'utilisation de la mémoire atteint 90%

Ma situation est la suivante: nous exécutons Magento Professional sur une instance de 15 Go de RAM, rackspace.

Lors de l'exécution de htop, nous avons pu constater que 'Apache2-k start' créait toujours plus de processus enfants, dont certains consommaient environ 900 Mo de mémoire.

Lorsque la mémoire est presque épuisée, tous les sites expirent ou deviennent très lents. Lorsque toute la mémoire est utilisée, il semble que certains de ces processus ont été tués pour libérer de la mémoire.

Ensuite, les mêmes procédures se produisent.

Ma question est la suivante: pourrions-nous configurer ubuntu/Apache pour éliminer les processus enfants et libérer de la mémoire lorsque l'utilisation de la mémoire atteint 85 à 90%?

1
ALAN VO
#!/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

Enregistrez ce code en tant que fichier Apache-free.sh et définissez-le en tant qu'exécutable et ajoutez des autorisations.

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

ajoutez un programme crontab à exécuter toutes les minutes (n'hésitez pas à redéfinir cette heure)

crontab -e

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

Ce script enregistre un fichier journal dans /var/log/Apache-free.log avec des informations sur l'exécution et les sauvegardes en mémoire.

** Rappelez-vous: ce n'est qu'un pansement! Il est nécessaire de détecter le vrai problème avec votre serveur.

J'espère vous aider!

Ce n'est pas exactement ce que vous avez demandé, mais vous pouvez utiliser cette méthode:

Vous devez connaître deux paramètres: utilisation moyenne de la mémoire par processus Apache, RAM montant que vous souhaitez allouer à Apache (par exemple complet RAM - 2 Go)

Ensuite, vous définissez la directive MaxClients sur

MaxClients = RAM montant que vous souhaitez affecter à Apache (par exemple, RAM - 2 Go)/utilisation moyenne de la mémoire par processus Apache

Donc, si je considère votre situation comme correcte: 14 Go (15-1 pour le système)/800 => MaxClients ~ = 18

Mais rappelez-vous: lorsque vous atteignez plus de 18 requêtes simultanées, elles seront mises en file d'attente, mais votre mémoire et l'ensemble de SysOp seront en sécurité ...

2
pl_

Cela peut être compliqué, mais ... vous pouvez configurer un travail cron qui exécute périodiquement un script. Ce script pourrait vérifier l’utilisation de la mémoire par Apache et le tuer/le redémarrer si nécessaire.

Cette question a un exemple cron: https://stackoverflow.com/questions/5398014/cron-crontab-execute-a-script-every-minute-and-another-one-every-24-hours =

0
superdesk