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 :)
Réponses:
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:
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
KeepAliveTimeout
une 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:
la source
Got rid of the wildcard used in VirtualHost entries
cela aide-t-il réellement de manière significative? J'avais l'impression que cela ne ferait aucune différence.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.
la source
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é.
la source
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.
la source
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
la source
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.
la source
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.
la source
Je n'ai pas d'expérience avec Solaris, mais la meilleure chose à faire est de ne pas utiliser Apache / mod_php.
la source