Comment ajuster l'allocation de mémoire d'un serveur Web Apache qui exécute une instance Amazon EC2 Linux ?

Dernière mise à jour : 13/11/2020

Le serveur Web Apache s'exécutant sur mon instance Linux Amazon Elastic Compute Cloud (Amazon EC2) ne répond pas par intermittence. Le journal système de cette instance affiche les messages « oom-killer » ou « failure to fork process », ou d'autres messages indiquant que la mémoire est insuffisante. Comment puis-je résoudre ce problème ?

Brève description

Pour afficher le journal système afin de vérifier les messages d'erreur :

  1. Ouvrez la console Amazon EC2, puis sélectionnez Instances.
  2. Cochez la case correspondant à l'instance.
  3. Sélectionnez Actions, Surveiller et dépanner, Obtenir le journal système.

Remarque : si vous n'utilisez pas la nouvelle console EC2 Experience, sélectionnez Actions, Paramètres de l'instance, Obtenir le journal système.

Si vous établissez une session de terminal sur l'instance, vous pouvez consulter le suivi de pile à l'emplacement approprié pour la distribution de votre instance Linux.

Debian et Ubuntu : /var/log/syslog

CentOS et RHEL : /var/log/messages

Systèmes utilisant systemd : journalctl

Résolution

Des arrêts intermittents et des messages d'erreur de mémoire insuffisante peuvent indiquer que la mémoire de l'instance est épuisée.

Vous pouvez limiter le nombre de connexions acceptées par le serveur, ainsi que le nombre de processus qu'il démarre. Pour définir cette limite, calculez l'utilisation moyenne de la mémoire d'un processus Apache et divisez la mémoire totale que vous souhaitez allouer à Apache par cette moyenne.

Si vous exécutez Apache 2.4, procédez comme suit :

1.    Lancez une session de terminal sur l'instance. Si vous ne parvenez pas à vous connecter, essayez de redémarrer l'instance.

2.    À partir de la session de terminal, exécutez la commande top pour afficher une liste des processus associés à la mémoire dans cette instance.
Triez les processus de cette liste par ordre décroissant en fonction du pourcentage de mémoire utilisé. Pour effectuer le tri sur une instance RPM, appuyez sur les touches Maj+O, puis sur n.
Sur les autres distributions Linux, sélectionnez l'option correspondante pour trier les processus en fonction de l'utilisation de la mémoire.

3.    Analysez la colonne de valeurs %MEM renvoyées pour les processus Apache, puis déterminez la valeur moyenne.

4.    Vérifiez si la valeur %MEM d'un ou de plusieurs processus Apache est anormalement élevée par rapport à la valeur %MEM des autres processus Apache. Une valeur %MEM élevée peut être la cause d'une fuite de mémoire dans une application Web exécutée sur le serveur. Pour limiter l'impact d'une fuite de mémoire potentielle, remplacez la valeur par défaut de la variable de configuration MaxRequestsPerChild par 1 000 au lieu de 4 000.

Pour modifier la variable de configuration :
Créez un nouveau fichier dans le répertoire /etc/httpd/config.d. Dans l'exemple de commande suivant, le nouveau fichier est prefork.conf.

$ sudo vim /etc/httpd/config.d/prefork.conf

Définissez la variable MaxRequestWorkers sur la nouvelle valeur.

5.    Pour calculer la valeur des variables de configuration ServerLimit et MaxClients, procédez comme suit :

Si l'instance EC2 a plus de 4 Go de RAM, divisez la valeur %MEM moyenne des processus Apache dans 90 %. Par exemple, si la valeur moyenne %MEM s'élève à 0,8 %, divisez 90 % (0,9) par 0,8 % (0,008) ; vous obtenez un résultat de 112,5 et arrondissez au nombre entier le plus proche, 112 dans ce cas.

Si l'instance EC2 a 4 Go ou moins de RAM, divisez la valeur %MEM moyenne des processus Apache dans 80 %. Par exemple, si la valeur %MEM moyenne s'élève à 0,8 %, divisez 80 % par 8 %. Le résultat est 0.8.

Remarque : le calcul de ces valeurs se base sur l'hypothèse selon laquelle l'instance est un serveur Web dédié. Si vous hébergez d'autres applications sur le serveur, soustrayez le pourcentage total de mémoire utilisée par ces dernières de 90 % ou 80 % avant de procéder au calcul. Les performances peuvent se dégrader si vous exécutez d'autres applications en plus d'Apache sur une instance dont la RAM est supérieure ou égale à 4 Go.

6.    Remplacez les variables de configuration MaxClients et ServerLimit dans le fichier httpd.conf de l'instance par la nouvelle valeur, puis enregistrez les modifications.

Par exemple :

MaxClients = 112
ServerLimit = 112

7.    Pour redémarrer le serveur Web, exécutez la commande suivante à partir d'une session de terminal :

apachectl graceful

Si vous exécutez Apache 2.2, procédez comme suit :

1.    Lancez une session de terminal sur l'instance. Si vous ne parvenez pas à vous connecter, essayez de redémarrer l'instance.

2.    À partir de la session de terminal, exécutez la commande top pour afficher une liste des processus associés à la mémoire dans cette instance.
Triez les processus de cette liste par ordre décroissant en fonction du pourcentage de mémoire utilisé.
Pour effectuer le tri sur une instance RPM, appuyez sur les touches Maj+O, puis sur n. Sur les autres distributions Linux, sélectionnez l'option correspondante pour trier les processus en fonction de l'utilisation de la mémoire.

3.    Analysez la colonne de valeurs %MEM renvoyées pour les processus Apache, puis déterminez la valeur moyenne.

4.    Vérifiez si la valeur %MEM d'un ou de plusieurs processus Apache est anormalement élevée par rapport à la valeur %MEM des autres processus Apache. Une valeur %MEM élevée peut être la cause d'une fuite de mémoire dans une application Web exécutée sur le serveur. Pour limiter l'impact d'une fuite de mémoire potentielle, remplacez la valeur par défaut de la variable de configuration MaxRequestsPerChild par 1 000 au lieu de 4 000.

Cette modification fournit un certain soulagement du problème lorsque vous identifiez et corrigez la source de la fuite de mémoire. Si vous pensez qu'une fuite de mémoire est la cause du problème, indiquez la nouvelle valeur de configuration dans le fichier httpd.conf, enregistrez les modifications, puis passez à l'étape 7.

5.    Pour calculer la valeur des variables de configuration ServerLimit et MaxClients, procédez comme suit :

Si l'instance EC2 a plus de 4 Go de RAM, divisez la valeur %MEM moyenne des processus Apache dans 90 %. Par exemple, si la valeur moyenne %MEM s'élève à 0,8 %, divisez 90 % (0,9) par 0,8 % (0,008) ; vous obtenez un résultat de 112,5 et arrondissez au nombre entier le plus proche, 112 dans ce cas.

Si l'instance EC2 a 4 Go ou moins de RAM, divisez la valeur %MEM moyenne des processus Apache dans 80 %. Par exemple, si la valeur %MEM moyenne s'élève à 0,8 %, divisez 80 % par 8 %. Le résultat est 0.8.

Remarque : le calcul de ces valeurs se base sur l'hypothèse selon laquelle l'instance est un serveur Web dédié. Si vous hébergez d'autres applications sur le serveur, soustrayez le pourcentage total de mémoire utilisée par ces dernières de 90 % ou 80 % avant de procéder au calcul. Les performances peuvent se dégrader si vous exécutez d'autres applications en plus d'Apache sur une instance dont la RAM est supérieure ou égale à 4 Go.

6.    Remplacez les variables de configuration MaxClients et ServerLimit dans le fichier httpd.conf de l'instance par la nouvelle valeur, puis enregistrez les modifications.

Par exemple :

MaxClients = 112
ServerLimit = 112

7.    Pour redémarrer le serveur Web, exécutez la commande suivante à partir d'une session de terminal :

apachectl graceful

Cet article vous a-t-il été utile ?


Besoin d'aide pour une question technique ou de facturation ?