Passer au contenu

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 ?

Lecture de 6 minute(s)
0

Mon serveur Web Apache qui s’exécute sur une instance Linux Amazon Elastic Compute Cloud (Amazon EC2) ne répond pas par intermittence. Je reçois des messages « out of memory » (mémoire insuffisante), « oom » (mém. ins.), « oom-killer » (mise à mort sur mémoire saturée), « failure to fork process » (échec du processus fork) ou d’autres messages de mémoire insuffisants dans le journal système de l’instance.

Brève description

Par défaut, Apache accepte 256 connexions en même temps. Utilisez le paramètre ServerLimit de la configuration Apache pour configurer le quota.

Les types d'instances de petite taille, tels que t2.small, ne disposent que de 2 gigaoctets (Go) de mémoire et ne peuvent pas gérer 256 connexions Apache simultanées. Par conséquent, l'une des erreurs suivantes peut s'afficher lorsque le serveur reçoit un trafic important :

  • « Out of memory » (Mémoire insuffisante)
  • « Oom » (Mém. ins.)
  • « Oom-killer » (Mise à mort sur mémoire saturée)
  • « Failure to fork process » (Échec du processus de transfert)
  • Remarque concernant l'insuffisance de mémoire dans les journaux système

Pour analyser les journaux du système de votre instance, consultez les fichiers journaux suivants en fonction de la distribution de votre système d'exploitation :

  • Pour Debian et Ubuntu, consultez /var/log/syslog.
  • Pour Amazon Linux, CentOS et Red Hat Enterprise Linux (RHEL), consultez /var/log/messages.

Résolution

Pour éviter les erreurs de mémoire sur votre instance, définissez un quota sur le nombre de connexions Apache et httpd simultanées acceptées par le serveur. Utilisez le paramètre MaxRequestWorkers (Apache 2.4) dans la configuration Apache pour définir le quota. Pour les serveurs Prefork non threadés, MaxRequestWorkers représente le nombre maximum de processus enfants qu'Apache lance sur les requêtes du serveur.

La résolution suivante concerne le modèle de module multitraitement (MPM) Prefork Apache par défaut utilisé par les serveurs Web. Pour vérifier votre MPM, exécutez la commande suivante :

# apachectl -V | grep "MPM"

Pour calculer la valeur approximative à définir pour MaxRequestWorkers, déterminez dans quelle mesure votre charge de travail utilise les paramètres suivants :

  • La mémoire vive physique de votre serveur
  • La mémoire qui reste après l'utilisation de la mémoire par d'autres services
  • Votre processus Apache qui utilise le plus de mémoire

Remarque : Il est recommandé d'utiliser une plage de 90 à 100 % de la RAM RESTANTE pour MaxRequestWorkers afin d'équilibrer les performances et la stabilité du serveur. Cependant, votre charge de travail peut avoir des besoins différents.

Calculer la RAM physique de votre serveur

Pour calculer la mémoire vive, exécutez la commande suivante :

# free -m | grep Mem: | awk '{print $2}'

Calculer la mémoire qui reste après l'utilisation de la mémoire par d'autres services

Tout d'abord, calculez l'utilisation de la mémoire de tous les principaux services qui ne sont pas Apache. Exécutez la commande suivante pour chaque service :

# usage_mbytes=0; for usage_by_pids in `ps -C $proc_cmd -o rss | grep -v RSS`; do usage_mbytes=$(($usage_mbytes + $usage_by_pids)); done; echo $(($usage_mbytes/1024)) MB;

Remarque : Dans la commande précédente, remplacez $proc_cmd par le nom du service ou la commande. Par exemple, utilisez mysqld pour calculer l'utilisation de la mémoire à partir du service mysqld.

Après avoir calculé l'utilisation de la mémoire de chaque service, additionnez les valeurs pour obtenir la somme totale de l'utilisation de la mémoire par tous les autres services principaux.

Utilisez ensuite la formule suivante pour soustraire l'utilisation de la mémoire par tous les autres services principaux de la mémoire vive physique de votre serveur en mégaoctets (Mo) :

Mémoire restante = (RAM physique de votre serveur) - (Utilisation de la mémoire par tous les autres services principaux)

Identifier le processus Apache qui utilise le plus de mémoire

Pour identifier le processus qui utilise le plus de mémoire, exécutez la commande suivante :

# sudo bash -c 'high_mem=0; for pid in $(ps aux | grep -E "httpd|apache2" | grep -v ^root | awk "{print \$2}"); do memory=$(pmap -d $pid | grep "writeable/private" | awk "{print \$4}" | sed "s/[^0-9]//g"); if [[ $memory -gt $high_mem ]]; then high_mem=$memory; fi; done; echo $((high_mem/1024)) MB'

Notez la quantité de mémoire utilisée par le processus.

Calculer MaxRequestWorkers

Utilisez la formule suivante pour calculer MaxRequestWorkers :

MaxRequestWorkers = (Mémoire restante * 90/100)/(Mémoire consommée par le processus Apache le plus grand)

Remarque : Remplacez la mémoire restante par la mémoire qui demeure après l'utilisation de la mémoire par d'autres services et la mémoire consommée par le plus grand processus Apache par la mémoire utilisée par le plus grand processus.

Le calcul précédent est le même pour les systèmes basés sur Ubuntu, Debian et RHEL. Cependant, le chemin de configuration et les noms de fichiers d'Apache dépendent du type de système d'exploitation. Définissez MaxRequestWorkers en fonction de votre système d'exploitation.

Remarque : Les exemples suivants utilisent une version 2.4 ou ultérieure d'Apache.

Debian et Ubuntu

Procédez comme suit :

  1. Connexion à votre instance Linux.

  2. Pour ouvrir le fichier /etc/apache2/mods-available/mpm_prefork.conf en mode éditeur, exécutez la commande suivante :

    # vi /etc/apache2/mods-available/mpm_prefork.conf
  3. Remplacez le paramètre MaxRequestWorkers par la valeur que vous avez calculée.
    Exemple :

    <IfModule mpm_prefork_module>      StartServers            5  
        MinSpareServers         5  
        MaxSpareServers        10  
        MaxRequestWorkers    your_value  
        MaxConnectionsPerChild  0  
    </IfModule>

    Remarque : Remplacez your_value par la valeur de MaxRequestWorkers calculée. Configurez également les autres paramètres en fonction de vos besoins.

  4. Enregistrez le fichier, puis quittez-le.

  5. Exécutez la commande suivante pour effectuer une vérification de syntaxe Apache :

    # apachectl configtest
  6. Si le résultat Syntaxe correcte s’affiche, exécutez la commande suivante pour redémarrer Apache :

    # systemctl restart apache2

Amazon Linux, CentOS et RHEL

Procédez comme suit :

  1. Connectez-vous à l’instance à l’aide du serveur.

  2. Créez un fichier avec le chemin /etc/httpd/conf.d/mpm_prefork.conf, puis ajoutez le bloc de commande suivant :

    <IfModule mpm_prefork_module>      StartServers            5  
        MinSpareServers         5  
        MaxSpareServers        10  
        MaxRequestWorkers    your_value
        MaxConnectionsPerChild  0  
    </IfModule>

    Remarque : Remplacez your_value par la valeur de MaxRequestWorkers calculée. Configurez également les autres paramètres en fonction de vos besoins.

  3. Enregistrez le fichier, puis quittez-le.

  4. Exécutez la commande suivante pour vérifier la syntaxe de configuration d'Apache :

    # httpd -t
  5. Si le résultat Syntaxe correcte s’affiche, exécutez la commande suivante pour redémarrer Apache :

    # systemctl restart httpd

Informations connexes

Tutoriel : Installer un serveur LAMP sur Amazon Linux 2

Tutoriel : Installer un serveur LAMP sur Amazon Linux 2023

AWS OFFICIELA mis à jour il y a 10 mois