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

36

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

La recherche dans Server Fault ne me donne que de nombreux moyens et outils spécifiques pour surveiller le serveur, mais ne fournit aucun conseil sur la façon de réduire / optimiser son utilisation de la mémoire. J'ai aussi 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.

J'aimerais savoir quelles sont 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 du processus, de sorte que tout ce qui peut créer de la magie et sauver la journée est également le bienvenu :)

Lima
la source
1
Je voulais juste dire que même si j'avais appris ces paramètres par google, il m'est apparu que je changeais les paramètres dans un fichier, mais qu'un fichier de configuration différent chargé plus tard était en train de remplacer silencieusement mes paramètres! Une fois que j’ai découvert cela, la définition des paramètres MPM de Prefork et quelques autres opérations ont permis de maîtriser au mieux le nombre de processus et l’utilisation de la mémoire, en permutant au minimum. J'espère que cette information aide les autres, en particulier ceux qui utilisent Gentoo sur leurs serveurs.
Pistos

Réponses:

23

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

Voici la liste des choses que j'ai faites:

Supprimez le caractère générique utilisé dans les entrées VirtualHost. Au lieu de *: 80 et *: 443, j'ai utilisé l'adresse IP réelle de mon serveur.

Changement du MPM prefork d'Apache. Ce sont les valeurs que j'ai finalement utilisées:

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 son environnement. Pour rappel, mon serveur reçoit près de 2 millions de pv / mois, servant à la fois les pages dynamiques et les fichiers à un taux régulier - aucun effet de digg. Encore une fois, l’intention était de réduire l’empreinte mémoire, et non d’améliorer les performances ou la haute disponibilité.

Référence:

KeepAlive d'Apache réglé. En définissant KeepAliveTimeoutune valeur inférieure (2 dans mon cas), je peux espérer moins de processus serveur en attente de 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à my.cnf de MySQL. Réduction massive de la consommation de mémoire.


Il y a aussi quelques suggestions remarquables que je ne pourrais personnellement pas faire:

  • Supprimez les modules PHP dont vous n'avez pas besoin. La plupart des mods sont déjà compilés sur PHP sur mon serveur, je vais probablement essayer mon propre PHP minimal sur d’autres VPS.
  • Passez à nginx avec php-fastcgi. C'est un autre bon conseil que j'essaierai bientôt, mais pour le moment, je ne peux pas risquer de perdre du temps.
Lima
la source
Je suis sous nginx et php-fastcgi (LEMP) et je rencontre des problèmes de mémoire similaires ... sur un serveur de 256 Mo, je trouve que php-fastcgi fonctionne bien avec PHP_FCGI_CHILDREN = 5 et PHP_FCGI_MAX_REQUESTS = 333 ... ces valeurs sont un bon début point!
farinspace le
Got rid of the wildcard used in VirtualHost entriescela aide-t-il réellement de manière significative? J'avais l'impression que cela ne ferait aucune différence.
Mahn
@Mahn - cela n'aide pas avec la mémoire, mais cela améliore l'utilisation du processeur, ce qui est une bonne chose dans un environnement à faible mémoire
jsnfwlr
"Basculer vers nginx avec php-fastcgi" --- Une option moins drastique mais efficace si vous souhaitez conserver Apache2 serait: Apache2 + mod_proxy_fcgi + mod_mpm_event. mpm_event est similaire à nginx. Utilisez-le pour vous connecter à php-fpm. Voir dracony.org/stop-using-php-fpm-to-argue-using-nginx-vs-apache
James Johnston
6

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

Pour être très utile lors de la mise en place des modifications de configuration nécessaires pour les configurations à faible mémoire. Je les ai adaptés à ma situation, mais ils devraient vous donner les outils nécessaires pour trouver la solution la mieux adaptée à votre environnement.

Kevin Kuphal
la source
le lien est mort
utilisateur2682863
4

Vous allez avoir besoin de limiter le nombre de processus de serveur Apache en cours d'exécution. Si vous êtes aussi près de la limite que vous l'êtes, vous ne pourrez pas gérer un trafic très intense. Avoir un serveur Web saturé dans des conditions normales d'utilisation est généralement une mauvaise idée (tm), car le trafic Web est beau et faible pour la plupart, jusqu'à ce que vous obteniez une barre oblique, une fouille ou une attaque au feu, etc.

Les principaux problèmes sont le nombre de processus apache qui s'exécutent à un moment donné - à supposer que cela soit préfork ici, puisque je n'ai déployé que des applications PHP et que PHP n'est pas threadsafe. Je n'ai pas d'expérience dans le dimensionnement du MPM travailleur. Certains éléments se trouvent dans la mémoire partagée et d'autres dans la mémoire de chaque processus.

Vous pouvez réduire l'encombrement total de la mémoire en omettant les modules partagés dont vous n'avez pas besoin. En gros, 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, alors commentez-le dans votre configuration apache. Faites juste attention à la quantité que vous retirez, 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; De nos jours, la plupart des configurations Apache sont uniquement fournies avec les quatre modules essentiels compilés. Outre ces quatre modules, la mémoire est principalement utilisée par des fuites ou par une RAM d'application mal gérée, ce qui vous permet de définir le nombre de requêtes. traité par chaque processus faible.

Vous voulez vraiment conserver votre utilisation de la mémoire dans la RAM et ne pas entrer en échange. Swap signifie I / O. Les E / S sont lentes et entraîneront une utilisation excessive de votre processeur alors que les processus se bloquent en attendant que quelque chose soit échangé.

Karl Katzke
la source
1
Merci pour le conseil Karl! Existe-t-il un moyen d'empêcher le serveur d'utiliser le swap? Après avoir réduit l'utilisation de la mémoire, je n'ai plus assez de RAM, mais la mémoire SWAP est toujours utilisée.
lima
@fandelost Peu importe que le swap soit utilisé, c'est mauvais lorsque les données sont échangées dans et en dehors du swap. Votre système d'exploitation peut échanger des instructions ou des données à partir de processus qui ne s'exécutent pas très souvent lorsque le temps le permet, car il pense (et a souvent raison) que ces instructions et données y sont meilleures.
Patrick James McDougle
2

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 max sur MySQL (je recommande l'excellent script MySQL Tuning Primer Script.

Si vous avez le contrôle de 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 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 éléments inutiles, mais en permutant régulièrement sur un serveur Web, vous obtiendrez un site Web non réactif.

Yhager
la source
Merci pour votre conseil, yhager, j'essaie tuning-primer.sh mais le message d'erreur suivant s'affiche: "Erreur de syntaxe à la ligne 94:` cnf_socket = $ 'inattendu ". Des idées?
lima
Pourrait être lié à la coquille. Comme ce script est probablement lié à Linux, essayez de changer la première ligne pour qu'elle pointe vers bash, au lieu de / bin / sh. J'espère que vous pourrez installer bash sur Solaris, mais je ne peux pas m'en empêcher ...
yhager
2

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

Depuis que vous avez supprimé tous les modules inutiles de PHP, vous pouvez faire la même chose pour Apache. Par défaut (en fonction de votre installation), Apache charge un grand nombre de modules supplémentaires et la plupart d'entre eux ne sont pas vraiment nécessaires pour une utilisation quotidienne normale. Par exemple, de nombreux modules d’authentification sont toujours chargés. Le dégonflement n'est généralement pas nécessaire, sauf si vous essayez de limiter votre utilisation de la bande passante. L'auto-indexage 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

rasjani
la source
0

Vous pouvez bien sûr limiter le nombre de processus apache, mais cela ne fonctionnerait que comme une limite soudaine à l'utilisation de votre mémoire. D'un point de vue 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, la manière dont votre code fonctionne vraiment peut être réduite! Cependant, gardez à l'esprit que de petites choses telles que l'utilisation de fichiers .htaccess utilisent plus de ressources que l'utilisation de fichiers de configuration centraux d'apache (car ils sont lus à chaque fois qu'une requête arrive, ce qui entraîne une surcharge), ce qui est important pour les grands sites Web.

Coops
la source
0

Une chose qui pourrait contribuer à la croissance de la mémoire au fil du temps est de définir une valeur inférieure sur la valeur maintenue de httpd, mais je le vérifierais avec soin au cas où votre application aurait besoin de processus plus longs.

DF
la source
0

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

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

  • Passez à nginx avec php-fastcgi.
  • Recompiler php pour utiliser le minimum de plugins.
  • Débarrassez-vous des processus inutiles tels que ntpd (utiliser ntpdate), ftp (utiliser scp), etc.
Inconnu
la source