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%?
#!/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é ...
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 =