5 votes

Les scripts PHP se chargent soudainement très lentement sur Apache.

Je teste pourquoi parfois mes scripts PHP prennent du temps pour se charger sur le réseau (>30sec) sur mon serveur Apache 2.4 Ubuntu avec PHP-FPM 7.4 en utilisant mpm_event. Le serveur fonctionnait normalement ces derniers mois, cela a commencé à se produire il y a quelques jours et je n'ai rien changé. J'ai redémarré, mais cela n'a pas aidé.

J'ai créé un simple test.php. Parfois il se charge normalement (<100ms), mais parfois cela prend 1 minute pour se charger :

entrer la description de l'image ici

  • Le CPU, la RAM et l'IO du serveur sont normaux (vérifié avec htop).
  • Les fichiers HTML statiques se chargent sans aucun délai.
  • L'exécution du script en local via la console SSH est très rapide.
  • Les logs d'erreurs Apache ne montrent rien d'inhabituel.
  • J'ai vérifié s'il y avait une attaque DDOS en vérifiant le nombre d'IPs connectées du même sous-réseau /16 et je n'ai rien trouvé de bizarre (par exemple >100 connexions).

Comment puis-je déboguer cela davantage pour comprendre pourquoi cela se produit?


Quelques sorties de débogage qui pourraient aider :

sudo service php7.4-fpm status

entrer la description de l'image ici

0 votes

Puis-je savoir quel outil est utilisé pour obtenir la vitesse de chargement de test.php?

5voto

c0dehunter Points 273

Je pense avoir trouvé une solution, mais si vous avez des suggestions, veuillez me le faire savoir ou poster une autre réponse.

J'ai vérifié /var/log/php7.4-fpm.log et j'ai vu de nombreuses entrées comme celle-ci :

[30-Sep-2021 03:36:46] AVERTISSEMENT: [pool www] le serveur a atteint le réglage pm.max_children (5), envisagez de l'augmenter

entrez ici une description de l'image

Donc j'ai augmenté le paramètre max_children à 15 et cela semble aider.

4voto

AlexAvardo Points 101

Il peut y avoir plusieurs raisons à ce comportement :

  1. Si ce serveur web traite des requêtes provenant du réseau externe, alors avec l'augmentation du trafic, la charge pourrait augmenter, ce qui a conduit à une augmentation du temps de réponse du serveur.
  2. Si vos scripts utilisent des appels à des ressources externes, alors dans ce cas, le temps de réponse de votre serveur peut augmenter en raison de la faible vitesse de réponse de la ressource externe.

Message de journal :

[30-Sep-2021 03:36:46] AVERTISSEMENT : [pool www] le serveur a atteint le réglage pm.max_children (5), envisagez de l'augmenter

n'est qu'une preuve de l'augmentation de la charge.

Dans les deux cas, vous devriez déterminer les raisons de la charge en analysant le nombre de requêtes vers les scripts, et s'il y a des appels à des ressources externes, assurez-vous qu'ils fonctionnent correctement.

2voto

TCooper Points 111

Comme vous pouvez le constater dans votre sortie de statut entrer la description de l'image ici vous avez une tâche en attente de démarrage (5 actives, 0 inactives, 6 tâches). Comme vous l'avez mentionné dans votre propre réponse (et je suis content que cela ait fonctionné) augmenter le nombre d'enfants autorisés peut être une bonne solution - mais il y a beaucoup de paramètres à prendre en compte pour optimiser php-fpm, et certainement plus de réflexion doit être accordée à l'ensemble du système avant d'apporter ces modifications de configuration.

Un guide solide se trouve ici.

Mais quoi qu'il en soit, vous devez savoir lorsque vous utilisez des valeurs statiques:
si (utilisation mémoire du processus * max_children > RAM)
{ [plantage d'apache] }

si (exigences de traitement * start_servers > CPU)
{ [plantage d'apache] }

Et toujours connaître votre matériel avant de régler ces paramètres, surtout en dynamique/sur demande (à mon avis, plus facile de faire des erreurs).

Si vous faites cela pour un serveur web d'entreprise critique, je vous conseille d'arrondir les estimations puis de les doubler. Par exemple, si le plus gros processus qui peut être appelé utilise 178 Mo, alors 200 Mo, et votre VM actuelle chez [fournisseur d'hébergement/chez vous-même] a seulement 1 Go de RAM - je fixerais max_children à 2 -- puis lorsque vous mettez à niveau votre VM (que faites-vous avec 1 Go en 2021 ??) et que vous disposez de 8 Go de RAM sur votre serveur, vous pouvez utiliser max_children = 18 Remarquez dans les deux exemples que l'arrondi favorise des ressources supplémentaires, et après avoir doublé à des fins de fpm, laisse derrière lui une partie de la mémoire pour que le système d'exploitation et d'autres processus en arrière-plan puissent l'utiliser.

Ajuster ces paramètres peut être extrêmement utile, et toute personne utilisant apache devrait savoir comment - juste assurez-vous que votre matériel peut gérer la configuration logicielle que vous avez mise en place.

0 votes

Le fait que cela prenne une minute entière me fait penser que les autres tâches sont plutôt lentes.

0voto

tjim Points 121

Nous avons eu presque exactement le même problème l'année dernière.

Augmenter le nombre maximum d'enfants ne fera que repousser le problème à une date ultérieure.

Il s'est avéré que c'était une base de données MySQL lente hébergée sur un serveur dédié sur notre réseau pour un blog.

Notre PHP était configuré pour essayer de se connecter pendant 30 secondes et chaque fois que cette base de données décidait de poser problème, elle consommait 100 enfants PHP.

Nous l'avons réduit à 1 seconde et le problème a disparu. Je ne me rappelle pas si le problème de la base de données était lié au réseau ou si nous avons dû optimiser la base de données elle-même.

Vous devriez vérifier votre journal d'accès Apache pour cette période de 2h30 à 3h30 et déterminer s'il s'agit de pages qui se connectent à une base de données. Vérifiez le journal pour les erreurs 500 qui précèdent l'effondrement du serveur.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X