Comment régler l'allocation de mémoire du serveur Web Apache pour éviter les erreurs de mémoire insuffisante dans une instance Linux EC2 ?

Dernière mise à jour : 16/09/2021

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 contient 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. Choisissez Actions, Monitor and troubleshoot (Contrôler et dépanner), Get system log (Obtenir le journal système).

Remarque : si vous n'utilisez pas la nouvelle console Amazon EC2, sélectionnez Actions, Instance Settings (Paramètres d'instance), Get System Log (Obtenir le journal système).

Si vous établissez une séance de terminal sur l'instance, vous pourrez voir des traces de pile à l'endroit approprié pour la distribution de votre instance Linux.

Debian et Ubuntu : /var/log/syslog

Amazon Linux, CentOS, and 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 valeur de limite, calculez l'utilisation type 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 séance de terminal sur l'instance. Si vous ne pouvez 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 MaxRequestsPerChild par 4500.

Pour définir la variable de configuration, créez un 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

Affectez à la variable MaxRequestSperChild la valeur, comme indiqué dans l'exemple de l'étape 6.

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

Si votre instance a plus de 4 Go de RAM, divisez la valeur %MEM moyenne des processus Apache par 90 %. Par exemple, avec une valeur %MEM moyenne de 0,8 %, divisez 90 % (0,9) par 0,8 % (0,008) pour obtenir 112,5 et arrondissez au nombre entier le plus proche, 112 dans ce cas.

Si votre instance EC2 a 4 Go ou moins de RAM, divisez la valeur %MEM moyenne des processus Apache par 80 %. Par exemple, avec une valeur moyenne%MEM de 0,8 %, divisez 80 % (0,8) par 0,8 % (0,008) pour obtenir 100.

Remarque : ces valeur sont calculées en supposant que 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.    Mettez à jour les variables de configuration MaxRequestWorkers et ServerLimit dans le fichier prefork.conf et enregistrez vos modifications.

Par exemple :

IfModule mpm_prefork_module
    StartServers          10
    MinSpareServers       20
    MaxSpareServers       40
    MaxRequestWorkers     112
    ServerLimit           112
    MaxRequestsPerChild   4500
/IfModule

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

sudo service httpd restart

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

1.    Lancez une séance 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 1000 au lieu de 4000.

Ce changement résout en partie le problème pendant que vous identifiez et corrigez la source de la fuite de mémoire. Si vous pensez qu'il existe une fuite de mémoire, mettez à jour le fichier httpd.conf sur l’instance avec le nouvelle valeur de configuration, 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 votre instance a plus de 4 Go de RAM, divisez la valeur %MEM moyenne des processus Apache par 90 %. Par exemple, avec une valeur %MEM moyenne de 0,8 %, divisez 90 % (0,9) par 0,8 % (0,008) pour obtenir 112,5 et arrondissez au nombre entier le plus proche, 112 dans ce cas.

Si votre 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% (0,8) par 0,8% (.008) pour un résultat de 100.

Remarque : ces valeur sont calculées en supposant que 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 ?