Problèmes de memory Apache

Je suis certain que cela a probablement été demandé auparavant, mais je veux m'assurer que je reçois les bonnes informations.

Je lance une boîte 360 ​​Linode avec Debian 5 et Apache 2.2. J'ai compilé tout moi-même (pas d'apt-get). De time à autre (une fois toutes les quelques semaines?), Mon server allait «crash» au hasard: il pourrait prendre jusqu'à 100% de processeur (vraiment 400%, mais vous savez ce que je veux dire) et remettre la boîte. Vous ne pourriez pas entrer SSH pour voir quel était le problème et le server lui-même a cessé d'accepter les connections. La seule façon de le réparer était de redémarrer la boîte.

Récemment, il a commencé à se produire avec une fréquence relative: 24 heures, 12 heures, 10 heures, 8, 6, 4. Enfin, j'ai réussi à avoir un aperçu juste avant de l'enfermer il y a environ deux jours. J'ai remarqué que le disque IO était élevé et qu'il restait à peine de RAM! En outre, il y avait une charge de chargement de process httpd fonctionnant à 3-4% de RAM. Et par bateau, je veux dire quand j'ai fait un ps -ef, ils ont pris l'écran entier. Si vous avez roulé, ils ont pris l'intégralité du tampon pour mon client SSH.

J'ai donc fait quelques ajustements à mon code en pensant que quelque chose ne se ferme pas correctement. J'ai réparé des problèmes de memory dans mon PHP, j'ai activé un logging d'erreurs plus granulé et j'ai réparé un tas d'erreurs, et cela semblait être utile dans une certaine mesure. Les accidents se sont retrouvés toutes les 24 heures.

Je suis convaincu que cela est causé car il y a trop peu de memory, et le volume de hits que je reçois est de donner un coup de pied à mon server dans le swap. Comme il y a tellement de requests qui frappent le swap, le disque IO tire à travers le toit, ce qui provoque l'utilisation de mon processeur dans le toit, ce qui fait que mon server se verrouille.

Voici ce que j'ai fait pour essayer de le résoudre: j'ai fait des searchs et j'ai constaté que je devrais probablement utiliser prefork. J'ai regardé dans ma configuration et je n'ai pas trouvé de ServerLimit ou MaxClients ou quelque chose de semblable, alors j'ai ajouté des valeurs "par défaut" et mon server a refusé d'accepter / les connections / entrantes. Effectivement, les valeurs Prefork ont ​​bloqué tout trafic HTTP entrant en étouffant la connection (peut-être parce que mon server n'est pas capable de gérer prefork? Idk).

La façon dont je le vois, ce que mon server «faisait autrefois» était bien, sauf que tous ces process d'apache étaient suspendus et que la memory perdue. Existe-t-il un moyen de définir un timeout d'attente sur les process Apache ou de limiter le nombre d'entre eux? Il semble assez stupide que la meilleure solution soit d'utiliser la pré-fourchette; Je dois imaginer qu'il y ait une meilleure façon.

Merci les gars

4 Solutions collect form web for “Problèmes de memory Apache”

Il semble que vous apprendrez la manière la plus difficile que PHP est un porc memory et pas particulièrement évolutif.

Quelques suggestions, sans ordre particulier:

Si vous soupçonnez toujours une fuite de memory, définissez MaxRequestsPerChild à une valeur vraiment faible.

Envisagez d'acheter plus de memory, 360 méga n'est vraiment pas beaucoup de nos jours.

Essayez de find une taille moyenne du process httpd en exécutant ps ou en haut, puis en définissant MaxClients afin que tout soit toujours en memory. L'échange est une spirale de la mort, plus vous essayez de traiter les requests en raison de cela, plus les process apache doivent être en fourche, en utilisant encore plus de memory.

Si vous laod php en tant que module dans apache, il est chargé pour chaque request, qu'il s'agisse d'un script ou d'un file statique (une image ou css ou .js ou quoi). Envisager de servir du contenu statique à partir d'un server distinct ou d'utiliser fastcgi ou un proxy inverse comme nginx pour que Apache ne serve que PHP pour limiter le nombre d'instances php riches que vous devez garder en memory.

Je suppose que votre machine bat l'appareil avec une faible memory. Dans mon expérience, tous les process apache qui fonctionnent ont le potentiel de prendre beaucoup de memory. Si vous disposez de PHP en tant que module dans apache, regardez dans votre php.ini quelle est la valeur de memory_limit = . J'avais 128M ce qui est beaucoup quand vous n'avez que 10 process apache en cours d'exécution. Ils peuvent ne pas prendre ce montant dès le début, mais si votre application PHP cache la memory ou avez vraiment besoin de 128M, vous pouvez limiter les servers de manière assez simple.

Ma recommandation est: Physical Ram divisé par memory_limit égal à max_procs

Si votre memory est très faible, vous pouvez essayer d'exécuter quelque chose comme lighttpd ou nginx avec php en tant que process fastcgi, je n'ai pas utilisé nginx, mais j'utilise Lighttpd allot et il a un très faible niveau de memory / CPU.

Lighttpd et php via le tutoriel fastcgi

Avez-vous un backend de database auquel vous vous connectez? Souvent, ce qui se passera, c'est que si certaines requêtes commencent à ralentir, les process apache commenceront à sauvegarder et count tenu de la faible quantité de RAM sur votre linode, il sera de la boule de neige et tombera en causant la CPU et la charge pour tirer.

Une autre chose, vous avez mentionné que vous utilisez le model de travailleur. C'est bien si vous êtes 100% sûr que tous les modules que vous utilisez en PHP sont threadsafe. Le manuel d'installation actuel de php recommand de ne pas l'utiliser ( manuel php ) … Indépendamment de votre model, vous devez vous assurer de les régler correctement. Un bon sharepoint départ est les systèmes Tuning LAMP . Si MaxClients n'est pas réglé correctement, Apache pourrait finir par provoquer une panne de votre système car il prend toute la memory lors d'une explosion de trafic vers votre site.

  • Quelles sont les configurations MPM prefork proposées pour les servers 256M et 512M RAM?
  • Apache préfork optimization - Choisir la bonne valeur `MaxRequestsPerChild`
  • Utilisation du MPM Word Apache2 avec Moodle
  • Comment déterminer la quantité de RAM requirejse par chaque thread Prefork pour une performance maximale de Wordpress sur une petite instance EC2
  • Pourquoi mes process httpd mpm_prefork sont-ils récoltés si rapidement?
  • Prefork et doc apache. Qu'est-ce que l'on veut dire sur request?
  • La performance d'Apache se dégrade considérablement au-dessus de ~ 256 requests simultanées
  • Quand / comment Apache tue-t-il un process enfant que tu générez en PHP?
  • Tuning Apache Pour le site de taille moyenne
  • WINNT Apache MPM "ThreadsPerChild" configuration sur Windows Server 2008 R2
  • Tuning Apache2 Prefork MaxClients ServerLimit
  • Les astuces du serveur de linux et windows, tels que ubuntu, centos, apache, nginx, debian et des sujets de rĂ©seau.