web-dev-qa-db-fra.com

Comment réduire l'utilisation de la mémoire sur un serveur Web Unix

J'utilise actuellement un accélérateur Joyent pour héberger mes applications Web, et cela fonctionne bien, mais je dois réduire les coûts, donc je rétrograde mon plan actuel et cela impose de nouvelles limites de mémoire (256M rss, 512M swap). Je n'étais pas trop loin hier, mais après avoir redémarré Apache plusieurs fois aujourd'hui, je suis maintenant 411M rss, 721M swap (prstat -Z -s cpu).

La recherche dans Server Fault ne me donne que de nombreuses façons et des outils spécifiques pour surveiller le serveur, mais aucun conseil sur la façon de réduire/optimiser son utilisation de la mémoire. J'ai également vu cette question , mais je ne pense pas que ce soit bon pour cette situation particulière (ou puis-je dire générique?).

Le serveur exécute Solaris sur un processeur partagé et j'utilise une pile Apache + MySQL + PHP stack.

Je souhaite connaître les étapes à suivre pour résoudre ce problème et résoudre les problèmes. Cependant, je manque également de temps pour réduire mon empreinte mémoire et rétrograder le plan avant la fin actuelle, donc tout ce qui peut faire de la magie et sauver la journée est également le bienvenu :)

36
lima

Merci à tous pour vos réponses ! Suite à vos suggestions, j'ai pu réduire mon utilisation de la mémoire à 195M SWAP et 108M RSS, sans toucher à mon code (je vais certainement l'optimiser bientôt, mais cela était censé être une solution pour me sortir rapidement des ennuis).

Voici la liste des choses que j'ai faites:

Je me suis débarrassé du caractère générique utilisé dans les entrées VirtualHost. Au lieu de *: 80 et *: 443, j'ai utilisé la véritable IP de mon serveur.

Modification du MPM préfork d'Apache. Ce sont les valeurs que j'ai fini par utiliser:

 StartServers 1 
 MinSpareServers 1 
 MaxSpareServers 5 
 ServerLimit 16 
 MaxClients 16 
 MaxRequestsPerChild 0 
 ListenBacklog 100 

Ce ne sont en aucun cas des nombres magiques. J'ai passé du temps à essayer différentes valeurs et combinaisons, puis à les tester par rapport à l'utilisation réelle de mon serveur et tout le monde devrait faire de même dans leur environnement. Pour mémoire, mon serveur reçoit près de 2M de vidéos/mois, servant à la fois des pages dynamiques et des actifs à un rythme régulier - pas d'effet digg. L'intention, encore une fois, était de réduire l'empreinte mémoire, et non d'améliorer les performances ou la haute disponibilité.

Référence:

Réduit KeepAlive d'Apache. En définissant KeepAliveTimeout sur une valeur inférieure (2 dans mon cas), je peux m'attendre à moins de processus serveur en attente connexions avec des clients inactifs qui ne peuvent plus demander de contenu.

Référence: http://httpd.Apache.org/docs/2.0/mod/core.html#keepalivetimeout

Suppression du module inutilisé de MySQL. J'ai ajouté skip-innodb au my.cnf de MySQL. Réduction massive de la consommation de mémoire.


Il y a aussi quelques bonnes suggestions remarquables que je n'ai pas pu faire personnellement:

  • Supprimer PHP modules dont vous n'avez pas besoin. Le PHP sur mon serveur a la plupart des mods déjà compilés, je vais probablement essayer mon propre minimum PHP sur d'autres VPS.
  • Basculez vers nginx avec php-fastcgi. C'est un autre bon conseil que j'essaierai bientôt, mais pour l'instant je ne peux pas risquer le temps d'arrêt.
23
lima

J'ai trouvé cet article sur les configurations à faible mémoire pour Apache et MySQL

Pour être très utile dans la présentation des changements de configuration nécessaires pour les configurations à faible mémoire. Je les ai modifiés pour ma propre situation, mais ils devraient vous donner les outils nécessaires pour trouver le meilleur ajustement pour votre environnement

6
Kevin Kuphal

Vous devrez limiter le nombre de processus de serveur Apache en cours d'exécution, et étant aussi proche de la limite que vous, vous ne pourrez pas gérer un trafic très fréquent. Avoir un serveur Web qui est optimisé dans des conditions normales d'utilisation est généralement une mauvaise idée (tm), car le trafic Web est agréable et faible pour la plupart jusqu'à ce que vous soyez pointillé ou creusé ou pétardé ou autre.

Les principaux problèmes sont le nombre de processus Apache qui s'exécutent à un moment donné - en supposant ici la préfork, car je n'ai déployé que des applications PHP et PHP n'est pas threadsafe. Je n'ai pas d'expérience de dimensionnement du MPM de travail. Il y a des éléments qui sont dans la mémoire partagée et certains éléments qui sont dans la mémoire de chaque processus.

Vous pouvez réduire l'empreinte mémoire totale en omettant les modules partagés dont vous n'avez pas besoin. Fondamentalement, Apache est configuré par la plupart des hôtes pour faire à peu près tout sous le soleil. Si vous n'utilisez pas mod_userdir, commentez-le dans votre configuration Apache. Faites juste attention à ce que vous supprimez, car certaines choses dont vous pourriez avoir besoin ou leurs dépendances ne sont pas intuitives! Tous les modules doivent être documentés sur le site Web Apache.org. L'empreinte par processus est plus difficile à réduire; la plupart des configurations Apache de nos jours ne sont livrées qu'avec les quatre modules essentiels compilés. Au-delà de ces quatre modules, la majeure partie de l'utilisation de la mémoire provient soit de fuites, soit de l'application RAM qui n'est pas récupéré efficacement, c'est pourquoi vous souhaiterez peut-être définir le nombre de demandes traitées par chaque processus faible.

Vous vraiment voulez conserver votre utilisation de la mémoire dans RAM elle-même et ne pas passer en swap. Swap signifie E/S. Les E/S sont lentes et conduiront votre utilisation du CPU à travers le toit alors que les processus se bloquent en attendant que quelque chose soit mélangé.

4
Karl Katzke

Puisque vous avez déjà atteint votre objectif, voici quelques extras:

Puisque vous avez supprimé tous les modules php inutiles, vous pouvez faire de même pour Apache. Par défaut (selon l'installation), Apache charge pas mal de modules supplémentaires et la plupart d'entre eux ne sont pas vraiment nécessaires pour une utilisation quotidienne normale. Par exemple, il existe un tas de modules d'authentification qui sont toujours chargés. le dégonflage n'est généralement pas nécessaire, sauf si vous essayez de limiter votre utilisation de la bande passante. L'indexation automatique et le statut sont également discutables.

Et un autre est que vous pouvez limiter la quantité de mémoire disponible pour php dans php.ini: memory_limit = xxxM

2
rasjani

Pour Apache, supprimez les modules que vous n'utilisez pas, car ils utilisent simplement de la mémoire supplémentaire. Pour MySQL, supprimez innodb/bbdb si vous ne les utilisez pas et supprimez les modules PHP dont vous n'avez pas besoin.

Ensuite, vous devez configurer Apache MaxClients en fonction de la taille d'un processus et de la quantité de mémoire que vous souhaitez donner à Apache. Il en va de même pour les connexions maximales sur MySQL (je recommande l'excellent MySQL Tuning Primer Script.

Si vous avez le contrôle sur votre application PHP, assurez-vous qu'elle n'utilise pas trop de mémoire (par exemple dans les variables, en particulier les variables statiques).

Si vous voulez aller plus loin, vous pouvez remplacer Apache + mod_php par la configuration nginx + fcgi, ce qui entraînera probablement une réduction supplémentaire de la mémoire.

Une dernière chose - vous ne voulez vraiment pas échanger sur un serveur Web. Juste un peu, pour supprimer les trucs inutiles, mais l'échange régulier sur un serveur Web se traduira par un site Web non réactif.

2
yhager

Le serveur exécute Solaris sur un processeur partagé et j'utilise une pile Apache + MySQL + PHP stack.

Je n'ai pas d'expérience avec Solaris, mais la meilleure chose que vous puissiez faire est de ne pas utiliser Apache/mod_php.

  • Passez à nginx avec php-fastcgi.
  • Recompilez php pour utiliser le minimum de plugins.
  • Débarrassez-vous des processus inutiles comme ntpd (utilisez ntpdate), ftp (utilisez scp) etc ...
0
Unknown

Vous pouvez bien sûr limiter le nombre de processus qu'Apache peut bifurquer, mais cela ne fonctionnerait que comme une limite Sudo-hard sur votre utilisation de la mémoire. D'un point de vue de niveau inférieur, vous pouvez utiliser plimit pour restreindre les ressources disponibles pour un processus. Appliquez cela aux processus parent et enfant hérités je crois.

Cependant, du point de vue de la configuration du serveur Web, cela peut se résumer à la façon dont votre code fonctionne vraiment! Mais gardez à l'esprit que de petites choses comme l'utilisation des fichiers .htaccess utilisent plus de ressources que l'utilisation des fichiers de configuration Apache centraux (car ils sont lus à chaque fois qu'une demande arrive, ce qui entraîne une surcharge), ce qui est significatif dans les grands sites Web.

0
Coops

Une chose qui pourrait aider la croissance de la mémoire au fil du temps est de réduire la valeur de httpd keepalive, mais je le testerais soigneusement au cas où votre application aurait besoin de processus plus longs.

0
D.F.