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.

  • Comment apache gère-t-il les connections et les requests en utilisant les modules mpm de travail et préfork?
  • Pourquoi les requests de réponses de process racine Apache?
  • Installation d'apache2 avec apt-get, apache2-mpm-prefork?
  • Pourquoi Apache a-t-il MaxClients et ServerLimit?
  • MPM Prefork, trop de processus apache2?
  • Apache produisant des travailleurs même s'il n'y a pratiquement pas d'access
  • Processus suspendus dans Apache?
  • Optimisation Apache - préfork MPM
  • MPM Prefork, trop de process apache2?
  • Comment appliquer la configuration prefork pour Apache dans Puppet?
  • Apache atteint MaxClients et verrouille le server
  • Les astuces du serveur de linux et windows, tels que ubuntu, centos, apache, nginx, debian et des sujets de rĂ©seau.