Optimisation de l'utilisation de la mémoire Apache

11

Apache utilise trop de mémoire de mon serveur, ce qui provoque son plantage. J'ai 4 Go de RAM sur le serveur.

J'essaie d'affiner les paramètres d'Apache afin d'améliorer ses performances, mais je suis assez nouveau dans ce domaine.

J'essayais de suivre les conseils de cet article mais je ne sais pas comment calculer les choses et il semble que j'aggrave.

Mon haut se lit comme suit:

11697 apache    15   0  322m  37m 4048 S  0.0  0.9   0:00.52 httpd
13602 apache    15   0  323m  37m 3944 S  0.0  0.9   0:00.50 httpd
11786 apache    15   0  322m  36m 4052 S  0.0  0.9   0:00.50 httpd
12525 apache    15   0  322m  36m 4040 S  0.0  0.9   0:00.63 httpd
11806 apache    15   0  322m  36m 3952 S  0.0  0.9   0:00.42 httpd
11731 apache    15   0  322m  36m 4036 S  0.0  0.9   0:00.46 httpd
11717 apache    16   0  322m  36m 3956 S  0.0  0.9   0:00.54 httpd
11659 apache    15   0  322m  36m 3980 S  0.0  0.9   0:00.49 httpd

Donc, ce serait

MaxClients = 3000/ (322-37) = 10

Est-ce correct? En outre, quelles devraient être les valeurs des autres paramètres tels que MinSpareServers, MaxSpareServers, MaxRequestsPerChild, StartServers, MinSpareThreads, MaxSpareThreads, ThreadsPerChild, MaxRequestsPerChild?

Quelqu'un pourrait-il m'aider?

Mettre à jour

J'ai essayé ce que vous avez suggéré. Cela fonctionne, mais juste pendant un certain temps. Après un certain temps après le démarrage du serveur, l'utilisation de la mémoire continue d'augmenter et ne diminue jamais.

Je veux dire, après avoir démarré le serveur, supposons qu'il y a 500 utilisateurs en ligne. Le serveur consommera X RAM. 2 heures après cela, avec les mêmes 500 utilisateurs en ligne, le serveur consommera 10X RAM.

Existe-t-il un moyen d'éviter cela ou je devrai continuer à surveiller le serveur et à le redémarrer de temps en temps?

Souljacker
la source
1
lors de l'ajout de mises à jour à votre question, veuillez modifier l'original plutôt que de publier une réponse. Cela a également l'avantage supplémentaire de renvoyer la question en haut de la page d'accueil.
Ben Pilbrow

Réponses:

14

Le paramètre principal pour ajuster l'utilisation de la mémoire d'Apache sera MaxClients. Une valeur trop faible et vous manquerez d'emplacements disponibles pour répondre aux demandes des clients. Trop et vous utiliserez toute votre RAM et commencerez à utiliser l'espace de swap qui tuera les performances (cela peut sembler être un crash du serveur).

Une façon de régler MaxClientsest d'observer l'utilisation de la mémoire du système et d'ajuster la configuration en fonction des besoins. Si le serveur commence à échanger, modifiez-le. Si le serveur a de la mémoire disponible, installez-le.

Vous pouvez également estimer la valeur maximale en examinant l'utilisation de la mémoire d'Apache. Démarrez topet appuyez sur Mpour trier les processus par mémoire. Vous devriez voir quelque chose comme:

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
18698 apache    17   0  141m  59m  41m S  0.0  1.6   4:57.46 httpd
18591 apache    17   0  141m  59m  41m S  0.0  1.5   4:54.79 httpd
22917 apache    16   0  141m  57m  39m S  0.0  1.5   4:57.44 httpd
18595 apache    16   0  142m  57m  38m S  0.0  1.5   5:23.43 httpd
18697 apache    16   0  139m  56m  41m S  0.0  1.5   5:09.29 httpd
18735 apache    25   0  141m  56m  38m S  0.0  1.5   5:05.32 httpd

Soustrayez les colonnes RES et SHR pour obtenir l'utilisation approximative de la mémoire par instance Apache. Dans ce cas, il est d'environ 16 Mo. Si j'ai 4 Go de RAM et souhaite que 3 Go soient utilisés pour Apache, mon paramètre MaxClients sera d'environ:

MaxClients = 3000/16 = 188

Donc, dans ce cas, je pourrais commencer avec une valeur de 150-200 mais je surveillerais l'utilisation de la mémoire et si cela commençait à se rapprocher de l'utilisation du swap, je diminuerais MaxClients de 10 à 20%. Notez également que la valeur de 3 Go n'est qu'un exemple aléatoire. Sur les serveurs exécutant uniquement Apache, je pourrais peut-être utiliser la quasi-totalité des 4 Go. Dans d'autres cas, je ne voudrais que 1 ou 2 Go pour Apache, sauf le reste pour d'autres applications, le système ou le cache.

Modifier: répondre à des questions supplémentaires

Il n'y a généralement aucune valeur magique de MaxClients ou des autres paramètres de configuration Apache qui rendra votre serveur soudainement deux fois plus rapide. Certains serveurs sembleront fonctionner très bien, que MaxClients soit 10 ou 1000. Il existe deux cas principaux où le paramètre MaxClients est "mauvais":

  • Trop bas : lorsque MaxClients est trop bas, vous atteindrez une situation où tous les clients Apache sont utilisés et de nouvelles connexions vont dans une file d'attente en attendant que le prochain client soit disponible. Si vous activez le mod_status d'Apache, vous pouvez obtenir une vue en temps réel du nombre de clients occupés à un moment donné. Cet état est relativement facile à diagnostiquer car le site deviendra lent pendant les périodes de fort trafic et tous les clients peuvent être observés comme étant en cours d'utilisation.
  • Trop élevé : lorsque MaxClients est trop élevé, vous entrerez dans le cas de l'épuisement de toute la RAM et commencerez à utiliser le swap. Lorsque cela se produit, les performances de votre site chuteront à pratiquement zéro (considérez la différence de vitesse entre la RAM et le disque). Cet état peut être beaucoup plus difficile à observer et à diagnostiquer car un serveur fonctionnera très bien avec un MaxClients élevé jusqu'à ce qu'il subisse une pointe de trafic. Par exemple, sur un site qui reçoit quelques visites par heure, je peux définir MaxClients à 1000, bien plus que ce qui est supportable par la RAM, mais je n'ai jamais vu de problème car Apache n'a besoin d'utiliser qu'un ou deux clients à la fois. Je ne repérerai le problème que lorsque j'aurai un pic de trafic, augmentant le nombre de clients utilisés simultanément, jusqu'à ce que la RAM soit épuisée et que l'espace de swap soit nécessaire.

Bien que je ne connaisse pas les détails de votre serveur, application ou trafic, je peux suggérer les valeurs de configuration suivantes comme point de départ. Essayez-les, surveillez la charge et l'utilisation du serveur et modifiez les paramètres selon vos besoins.

  • mod_status : activez cette option pour voir l'utilisation d'Apache. Pour des statistiques plus avancées, installez une application de surveillance comme Zabbix / Nagios afin de pouvoir suivre l'utilisation du serveur et les modèles de trafic.
  • MaxClients : définissez une valeur de 100-200. Je commencerais avec une valeur inférieure en cas de doute et surveiller l'utilisation de la mémoire / CPU / Apache. Ce sera le paramètre principal à modifier.
  • MaxRequestsPerChild : cela spécifie quand un client / enfant Apache sera redémarré. Il n'y a pas de mauvaise valeur (bien que de très petites valeurs puissent être inefficaces) et cela dépendra du contenu de votre portion. Pour le contenu dynamique, une grande valeur non nulle (disons 1000) empêchera vos processus httpd de devenir éventuellement trop volumineux.
  • Autres paramètres : Bien que je n'aie pas effectué d'analyse comparative approfondie des paramètres restants, ils devraient avoir un effet relativement mineur, sauf si vous les définissez sur des valeurs très faibles ou très élevées. L'utilisation des valeurs par défaut devrait convenir à la majorité des sites. Voir la documentation du module Apache Prefork ou Worker pour une description complète des paramètres et qui est utilisé dans chaque module (il est inutile d'essayer de régler un paramètre que vous n'utilisez pas).
  • Analyse comparative : lorsque vous ajustez les paramètres, je recommanderais d'utiliser un outil d'analyse comparative comme ab (ApacheBench) ou siège pour obtenir un nombre quantitatif sur les capacités de votre serveur. Se fier uniquement à la sensation ou pire, voir s'il se bloque ou non, n'est pas une bonne méthode pour régler les paramètres d'un serveur Web.
uesp
la source
MaxClients a été renommé MaxRequestWorkers à partir d'Apache 2.4.
jastram