Aller au contenu

Vitesse de génération d'une page php


cyberlaura

Sujets conseillés

Bonsoir à tous,

j'ai eu l'idée cet après-midi de chronométrer l'ensemble des pages de mon site et d'extraire les pages les plus lentes dans un fichier texte pour voir...

Ce sont des pages qui pour la plupart sont quasiment en pur HTML avec quelques codes secondaires en PHP, sans accès SQL.

Donc après avoir découvert un (très) fort ralentissement dû à la création d'un fichier de statistiques - ou plutôt à l'appel de la fonction gethostbyaddr - fonction que j'ai naturellement supprimée, je me retrouve encore avec des pages très lentes.

Je ne récupère que les pages que PHP met plus de 4 secondes à me générer, et j'en ait environ 1 toutes les 2 minutes, pour une durée allant de 4 à 27 secondes.

Je précise que le serveur est très peu utilisé, par exemple en ce moment load average à 0.1 et malgré tout j'ai encore des pages lentes.

Donc au final, je voudrais vous mettre en garde contre gethostbyaddr, mais aussi vous demander si vous connaissez une explication à ce délai anormal et irrégulier de génération de page...

Et sur ce, bonne nuit à tous :)

Lien vers le commentaire
Partager sur d’autres sites

merci de vos réponses, j'avais effectivement bien compris que gethostbyaddr me prenait un temps fou, et je l'ai donc totalement supprimé. Pour autant, j'ai toujours des temps de réponse délirants que je ne m'explique pas, mais beaucoup moins cependant. J'ai aussi effectué une trace des pages avec un temps "normal", et j'ai une moyenne correcte ? de 300ms (de 13 ms à 500ms pour la majorité ).

Donc pour l'instant, je sèche sur la raison de ces lenteurs..

Sauf que la majorité des ip concernées par cette lenteur viennent de l'étranger... Peut-être me reste t-il un gethostby.... dans un coin, je vérifie.... Ou bien existe t'il d'autres ordres php de ce style ?

Lien vers le commentaire
Partager sur d’autres sites

J'utilise PHP 5.2 et Apache 2.2 sur des machines tres lentes (par exemple, la magorite des mes sites tournent sur une vielle SparcStation 20 datant du dernier millenaire) et ca fonctionne pas mal : Les latences que je notes sont principalement due a ma connexion ADSL et non au serveur lui-meme, meme lorsque les stats tournent en tache de font.

Voici quelques pistes que tu peux explorer :

  • Appel reverse DNS par apache pour generer les logs (verifier que la config contient HostnameLookups Off). Dans le cas contraire, il y aura un appel DNS pour chaque client.
  • Memoire : meme s'il n'y a pas de process swapper, l'OS a parfois besoin de reorganiser sa memoire avant de creer un nouveau process. C'est surtout vrais si tu as des pages ou des applies en taches de font qui consomment beaucoup de memoire.
  • PHP en mode CGI
  • nombre de process apache trop reduit : dans ce cas, si la page contient beaucoup de "sous elements" comme des images, il est possible que le client doivent attendre que tout ces elements soient disponnibles avant de generer la page. La solution est alors d'augmenter le nombre de process Apache, mais aussi de specifier la taille de toutes les images des pages : ainsi les pages seront affichees complements meme si toutes les images ne sont pas encore transferer. Visuellement c'est mieux meme si ca ne change pas grand chose techniquement.

Voila ce qui me vient a l'esprit, il y a sans doute d'autres trucs ...

Bye

Lolo

Lien vers le commentaire
Partager sur d’autres sites

Merci pour toutes ces pistes Lolo. ça m'aide bien à avancer

En fait, les durées ne dépendent pas de la connexion elle-même, car je mesure directement le temps que met le code à s'exécuter sur le serveur.

Pour cela, j'ai initialisé auto_prepend_file et auto_append_file et j'initialise un chrono dans le fichier auto_prepend_file, et j'écris le temps passé dans le fichier auto_append_file. La durée ne dépend donc que du serveur lui-même, pas de mon ADSL ou de la taille des images.

Pour tes pistes :

- j'ai bien HostnameLookups à off, c'est vrai que ça ressemblait bien à ça pourtant.

- mon serveur a swappé dernièrement, ce qui est rare et peut effectivement dégrader les performances. Je le rebooterais bientôt pour voir si cela change quelque chose.

- PHP n'est pas en mode CGI

- MinSpareServers est à 5, mais j'ai fait un essai hier soir vers minuit et il y avait très très peu de monde qui naviguait.

Actuellement, j'ai 22 pages par heure qui mettent plus de 4 secondes, et en vérifiant les IP qui posent problème, elles sont effectivement surtout de l'étranger. Hostnamelooksup est à off dans mon httpd.conf, c'est bien là qu'il faut regarder ?

Lien vers le commentaire
Partager sur d’autres sites

- MinSpareServers est à 5, mais j'ai fait un essai hier soir vers minuit et il y avait très très peu de monde qui naviguait.

Je pensais plutot au directive MAX???? qui limitent le nombre de clients (monter trop haut ne sert a rien non plus, risque de swap sinon)

Hostnamelooksup est à off dans mon httpd.conf, c'est bien là qu'il faut regarder ?

Ben, c'est simple : ton log ne doit contenir que des adresses IP et non des noms.

Autres pistes :

  • si tu proteges des pages, il ne faut pas que ce soit en utilisant des noms de domaines (y compris pour les domaines locaux) : il ne faut utiliser que des IP sinon ... lookup sur le DNS.
  • Tu utilises du https ? Si oui, c'est plus lent. De plus, suivant la config que tu utilises, il se peux que SSL verifie le client -> a nouveau lookup.

Si ca persiste, je te conseille d'utiliser un sniffer de trames IP pour t'assurer qu'il ne reste plus de requette DNS. Dans ce cas, le probleme sera a chercher ailleurs ...

Modifié par destroyedlolo
Lien vers le commentaire
Partager sur d’autres sites

Il n'y a bien que des IP dans mes logs.

Je n'utilise pas Https

je ne protège pas de page

Et j'arrive à reproduire le problème en utilisant un lointain proxy ( du canada ), ce qui me laisse supposer qu'il s'agit bien d'un problème de DNS.

Juste une dernière question, je t'ai suffisamment fait perdre de temps pour aujourd'hui et je t'en remercie encore, mais si j'ai une directive du type

sshd: .sivit.org
httpd: ALL

dans mon hosts.allow, cela implique un lookup DNS systèmatique ?

NOTA : je viens d'effectuer une trace de mon passage avec ou sans proxy, et systématiquement avec ce proxy la page met 1500 ms à se générer, et 350 ms sans proxy ( 221.11.27.110 est le proxy, 81.56.000.000 est mon IP )

2009-02-23  18:48:30 :  221.11.27.110 www.xxxxxxx.com/consulter-annonces.php : 1463 ms
2009-02-23 18:49:43 : 221.11.27.110 www.xxxxxxx.com/consulter-annonces.php : 1460 ms
2009-02-23 18:50:14 : 81.56.000.000 www.xxxxxxx.com/consulter-annonces.php : 339 ms
2009-02-23 18:50:34 : 221.11.27.110 www.xxxxxxx.com/consulter-annonces.php : 1470 ms
2009-02-23 18:50:47 : 81.56.000.000 www.xxxxxxx.com/consulter-annonces.php : 374 ms

Modifié par cyberlaura
Lien vers le commentaire
Partager sur d’autres sites

Et bien, en réalité, il s'agissait d'un faux problème. Je m'explique : je croyais - bêtement - que la page était générée, puis envoyée d'un bloc au "client". Donc je pensais que mon chronométrage ne concernait que PHP.

Or, après plusieurs tests, je viens de me rendre compte que les données sont envoyées au fur et à mesure - tous les 16 Ko pour moi - et que apache attend donc que ce soit fini avant de continuer la création de la page, d'où des durées de création de la page dépendant de la vitesse de connexion de l'internaute.

Du moins je crois qu'il s'agit bien de cela...

Donc merci à tous et particulièrement à destroyedlolo pour votre aide

Lien vers le commentaire
Partager sur d’autres sites

Bonsoir,

si c'est bien ça le problème, je t'invite à activer la compression des pages de PHP : soit modifier directement zlib.output_compression dans le php.ini ou bien ajoutant ini_set('zlib.output_compression', true); en début de script.

Lien vers le commentaire
Partager sur d’autres sites

Et bien, cette idée me semble excellente en effet. D'abord parce qu'ainsi, le temps de génération des pages est réel et je peux donc optimiser à bon escient, et ensuite parce que j'ai réellement un gain d'environ 15 à 20 % pour que la page s'affiche.

Merci beaucoup pour me l'avoir soumise, je vais laisser cette compression quelques temps pour voir comment le serveur réagit, car je suppose qu'il a un peu plus de boulot pour compresser et que cela risque - peut-être - de nuire à ses performances.

Quelle bonne journée, j'ai appris plein de trucs, encore merci à tous :thumbsup:

Lien vers le commentaire
Partager sur d’autres sites

Veuillez vous connecter pour commenter

Vous pourrez laisser un commentaire après vous êtes connecté.



Connectez-vous maintenant
×
×
  • Créer...