Rapport des tests en vue de l'Etude pour l'optimisation de Wikini
Ressources pour l'optimisation
Afin d'évaluer les gains : système de statistiques
Je suis sur le fait qu'il faut établir un système pour mesurer les temps d'exécution. Je propose même d'aller plus loin en développant un système qui créé des statistiques sur les temps d'exécutions. Cela coutera un peu mais ça permettra de mieux se rendre compte.
--
PatrickPaul
Il nous faut un moyen d'évaluer les gains. Que valent les informations de débogage mise en place par l'auteur ? Je crois me rappeler pour les avoir vues, qu'elles ne concernent que les requêtes SQL. --
CharlesNepote
Avant que
PatrickPaul ne lance son éditeur plus vite que son nombre ;-), je propose les idées suivantes.
Par expérience, tous les systèmes de statistiques qui sont codés dans une applications sont voués à l'échec et à de permanentes transformations : il y a toujours un utilisateur qui veut une chose que l'on a pas réalisé... "et pourquoi pas le ratio des "referrers" par mois et par pays" (je suis persuadé qu'il y a un gus qui va avoir ce besoin...).
Il y a donc une solution simplissime à ce problème : fournir des informations brutes au format CSV. De cette manière, l'utilisateur à tout loisir à traiter ces données comme il le souhaite, a posteriori, à l'aide de son outil statistique favori :
OpenOffice, Excell,
CristalReport?, etc. La richesse des traitements est donc déplacée dans les outils spécialisés et non dans l'application dont ce n'est pas le "coeur de métier". Ca n'empêchera d'ailleurs pas certains utilisateurs de créer des "actions" allant puiser dans ces données brutes.
Par ailleurs, les statistiques peuvent servir à autre chose qu'à évaluer les performances : il faut prendre le problème globalement.
Il nous faut donc déterminer maintenant (je vous laisse compléter) :
- les données que nous allons enregistrer
- date de la requête du client http
- heure-minute-seconde de la requête
- temps de traitement de la requête ?
- referrer de la requête
- adresse IP ou nom pleinement qualifié du client
- ...
- comment nous allons les enregistrer
- (L'enregistrement des ces données est optionnel (test d'un drapeau dans wakka.config.php))
- dans une table MySQL avec une ligne par enregistrement (au format CSV) ?
- dans une table MySQL avec un champ par donnée ?
- dans un fichier à plat avec une ligne par enregistrement (au format CSV) ?
- comment nous allons les restituer
--
CharlesNepote
Mesure du temps de traitement
Avant les importants changements opérés par l'internationalisation et autres, je suggère d'améliorer la mesure du temps de traitement en démarrant le "chronométrage" en
tout début de traitement (soit au début de wakka.php) et en le terminant en
toute fin de traitement (c'est-à-dire à la fin de footer.php). Cela nous permettra de mesurer les écarts après la modification des divers éléments. En local chez moi, j'ai personnalisé
WakkaFr afin d'obtenir une mesure du temps global de traitement de chaque page affichée.
Pour cela, j'ai :
- modifié /wakka.php en ajoutant au tout début du fichier :
- list($g_usec, $g_sec) = explode(" ",microtime());
- define ("t_start", (float)$g_usec + (float)$g_sec);
- modifié /actions/footer.php en ajoutant en toute fin de fichier :
- list($g2_usec, $g2_sec) = explode(" ",microtime());
- define ("t_end", (float)$g2_usec + (float)$g2_sec);
- print "<span class=\"debug\">".round (t_end-t_start, 4)."</span>\n";
J'obtiens ainsi un résultat arrondit à la quatrième décimale (par exemple : 0.1532). Au passage j'observe chez moi en local des résultats oscillant entre 0.1 et 0.7 sur une machine pas trop chargée avec 256 Mo et un pentium III à 660 Mhz. Le code ci-dessus peut peut-être être amélioré...
Je propose que cette mesure soit systématiquement présente dans le source html à destination du client qui a demandé une page :
- soit affiché
- soit avec l'attribut CSS display: none qui l'empeche de s'afficher mais le laisse présent dans le source de la page.
Il est cependant probable que la présence systématique de cette mesure empêche l'utilisation du cache (je ne comprend toujours pas bien comment fonctionne le cache). Aussi il serait peut-être plus intéressant de proposer cette mesure comme une option (configurable à travers le fichier de configuration).
Qu'en pensez-vous ?
--
CharlesNepote
une case à cocher de plus dans les préférences ? ou simplement par un bouton qualque part avec un cookie pour afficher le temp d'execution (comme ça par defaut c'est désactivé, et cela ne risque pas d'affecter le travail sur le cache) --
Err404?
- dans la version en cours de développement il suffit d'activer le mode "debug" dans le fichier de configuration -- LordFarquaad
A mon avis, on peut d'ores et déjà mettre en place la mesure proposée par
CharlesNepote. Pourquoi ne pas ajouter l'affichage, pour l'instant, dans le paragraphe debug existant de footer.php ?
--
DavidDelon
D'accord avec Patrick et David. Reste deux questions en suspend :
- Comment afficher le temps total d'exécution que j'ai proposé :
- dans le groupe de mots (<span>) de style intra paragraphe "debug" existant, affiché en fonction du paramètre "debug"
- dans un groupe de mots (<span>) de style intra paragraphe "debug" à part, affiché en fonction du paramètre "debug"
- dans un groupe de mots (<span>) de style intra paragraphe "debug" à part, affiché en fonction du paramètre "print_time"
- dans un paragraphe (<div>) de style "p_debug", affiché en fonction du paramètre "debug" (Pour : on peut placer le paragraphe n'importe où (par exemple en haut à gauche) uniquement en modifiant la feuille de style)
- dans un paragraphe (<div>) de style "p_debug", affiché en fonction du paramètre "print_time"
- Quels sont les fonctions proposées par le système de statistiques évoqué par Patrick ? (je vous laisse remplir un peu ;-)
Pour la question 1 je penche plutôt pour la solution 5 car je pense qu'il y a des administrateurs techniques ou fonctionnels qui seraient désireux de voir systématiquement le temps d'exécution de la page sans avoir toutes les informations de débogage (par exemple ici sur
WakkaFr où il me paraît intéressant d'avoir systématiquement cette information (pour cause d'observation du comportement des nouvelles versions) sans avoir néanmoins les informations de débogage). --
CharlesNepote OK --
DavidDelon
Bon j'ai choisi finalement l'option 1. On verra ensuite pour la 5...
J'ai ajouté en plus : l'arrondi à la 4ème décimale de toutes les mesures ; le temps total des requêtes SQL ; le % de requêtes SQL sur le temps total (au passage, chez moi j'obtien entre 15 et 30 % max). On verra le code ci-dessous de /actions/footer.php. Mais je ne peux plus rien publier sur le CVS !...
Est-ce que vous voyez d'autres données statistiques que l'on pourrait intégrer facilement ?
--
CharlesNepote
<?php
if ($this->GetConfigValue("debug"))
{
print "<span class=\"debug\"><b>Query log :</b><br />\n";
foreach ($this->queryLog as $query)
{
print $query["query"]." (".round($query["time"], 4)." s)<br />\n";
$t_SQL = $t_SQL + $query["time"];
}
print "</span>\n";
print "<span class=\"debug\">".round($t_SQL, 4)." s (total SQL time)</span><br />\n";
list($g2_usec, $g2_sec) = explode(" ",microtime());
define ("t_end", (float)$g2_usec + (float)$g2_sec);
print "<span class=\"debug\"><b>".round(t_end-t_start, 4)." s (total time)</b></span><br />\n";
print "<span class=\"debug\">SQL time represent : ".round((($t_SQL/(t_end-t_start))*100),2)."% of total time</span>\n";
}
?>
En cherchant du côté des profiler pour php j'ai trouvé ceci :
dbg qui est un debugger + profiler. Très facile à installer, on peut s'en servir juste pour la mesure des temps d'execution en suivant l'exemple
Sample of using dbg/profiler API in PHP à télécharger sur le site de dbg (partie download).
Pour avoir une idée de ce que ça donne, voici quelques lignes de résultat (voir ci-après) . Yapluka analyser tout ça ...
Et ca donne ceci (je n'ai gardé que les 10 fonctions les plus consommatrices de temps), sur une page
standard, sans appel d'action, du type page principale.
- wakka.php, wiki:loadpage, 7,291ms, 16 appels
- wakka.php, wiki::href, 8,074ms, 20 appels
- actions.footer,php, ::main, 8,155ms, 18 appels
- wakka.php, wiki::loadall, 10,361ms, 16 appels
- wakka.php, ::main, 10,426ms, 1 appels
- wakka.php, wiki::link, 12,500ms, 15 appels
- wakka.php, wiki::getmicrotime, 30,067ms, 37 appels
- formatters/wakka.php, wakka2callback, 76,977ms, 24 appels
- wakka.php, wiki::query, 105,612ms, 18 appels
- wakka.php, wiki::includebuffered, 184,813ms, 7 appels
Total (toutes fonctions) :615,705
Pour une page de test compléte voir :
http://stephane.aulery.free.fr/wikini/wikini_test_de_performance1.htm
Sans surprise, les query consomment beaucoup, mais, surprise, les includebuffered également (c'est juste
le "include" qui est comptabilisé; ce temps d'inclusion n'étant pas constant, je suppose qu'il est fonction de la taille du
fichier inclus ...
Certes la structure de l'application est trés modulaire mais ça se paie donc quelque part ...
A noter au passage : le temps consommé par getmicrotime !
Une petite erreur d'analyse : j'ai fait ces tests sur un wakka sans la lecture du fichier interwiki. avec la lecture de interwiki
on peut rajouter en moyenne 50 ms. Je propose de supprimer ce fichier de l'application, son interêt ne me parait pas franchement évident.
--
DavidDelon
Bravo David pour cette analyse. Mes questions/réflexions un peu dans le désordre.
- Pourquoi IncludeBuffered? est-il appelé 7 fois ça me paraît beaucoup ?... N'y a-t-il pas des choses qu'on peut réintégrer dans wakka.php (décisions à ne pas prendre à la légère) ? ;
- Pour les Query : cf. ma proposition de les regrouper : je ne sais si c'est possible. J'ai tout de même noté que nombre d'entre eux ont une structure très proche.
- Si le drapeau "debug" n'est pas positionné, getmicrotime est donc appelé ((query*2) + 1) fois pour rien !... pourquoi au moins ne pas faire un test dans getmicrotime ou dans query : if ($this->GetConfigValue?("debug")) ? Si je calcule bien, on peu gagner environ 4-5% de performance (30 ms sur 615 ms).
- Ce serait intéressant de réutiliser l'ancien Wakka pour voir s'il y a des différences.
- Imaginons qu'on puisse gagner :
- peut-être 30 ms pour le getmicrotime
- peut-être 50 ms pour les query (soyons très optimistes)
- peut-être 70 ms pour les include
- soit, en tout 150 ms sur 615 ms (soit environ 25%), c'est de la pisse de rat en comparaison des délais réseau sur free... (cf. mes chiffres plus bas)
- On gagnera éventuellement un peu en intranet ou sur d'autres serveurs que free, sur des pages très complexes.
Les problèmes de performances que nous avons ne sont donc pas côté applicatif. On peut donc, par exemple, se demander si on a bien gagné d'externaliser la feuille de style : en théorie oui parce qu'on utilise le cache du navigateur, mais en pratique, il faut une requête réseau supplémentaire pour être sûr que la page n'a pas changé. Ce qu'il faut donc voir c'est étudier si l'on peut
.
--
CharlesNepote
WakkaFr ça rame le soir et le week-end (sur free en tous cas)
Alors voila, moi mon Wakka fonctionne sur Free, comme ton site David, et y'a des heures où ça rame à mort... et ça vient des la base de données
MySQL. Je veux proposer une projet "
WakkaFr=>HTML" qui permettrait de créer de façon automatique une version html de toutes le pages, pour que les visiteurs puissent tout le temps bénéficier d'une bonne vitesse d'accès au site au moins en lecture.
Qu'en dites-vous ? Personnellement je pense pas que ça soit trop difficile à mettre en oeuvre. --
PatrickPaul
C'est vrai que ça rame, si ça devient trop pénible il y a peut etre moyen de transferer tout ça vers une autre machine ... D'un autre côté, ça nous "oblige" à faire du performant !
Sinon pour ton idée : c'est bien de "cache" dont tu veux parler ? Pas de problème, d'ailleurs l'auteur de wakka en parle dans son site, à mon avis c'est pas si simple, il faut bien
veiller par exemple à regenerer une page cachée faisant référence a une page en attente de création (une wantedpage) lors de la création de cette page.
--
DavidDelon
- Question au passage : comment savez-vous que les lenteurs viennent du SQL et pas du traitement PHP ou des deux ?...
- -- CharlesNepote
- Réponse : Eh bien j'ai eu des messages direct d'erreur sql comme quoi la base de données n'était pas acessible. Deuxièmement, j'ai un autre site qui n'utilise pas de bases de données et qui marche toujours très rapidement sur free.... Je vous laisses conclure...
- -- PatrickPaul
- On va pouvoir réellement être fixés avec le % de traitement SQL sur le temps total que je propose -- CharlesNepote.
- Bilan des courses : des mesures effectuées samedi 30/11/2002 à 15:00, classée dans l'ordre de délai croissant de fin d'affichage dans Mozilla (je précise qu'aucun autre processus gourmand ne tourne sur ma machine en dehors du navigateur).
- Exemple 1 :
- 0.1457 s (total SQL time)
- 0.2333 s (total time)
- SQL time represent : 62.47% of total time
- Document: Done 1.051 s
- Exemple 2 :
- 0.275 s (total SQL time)
- 1.3404 s (total time)
- SQL time represent : 20.52% of total time
- Document: Done 2.433 s
- Exemple 3 :
- 0.0141 s (total SQL time)
- 0.0597 s (total time)
- SQL time represent : 23.7% of total time
- Document: Done 11.066
- Exemple 4 :
- 0.0132 s (total SQL time)
- 0.1443 s (total time)
- SQL time represent : 9.16% of total time
- Document: Done 25.917 s
- 1ère conclusion : le délai d'affichage des pages n'est pas proportionnel au temps de traitement SQL.
- 2ème conclusion : le délai d'affichage des pages n'est pas proportionnel au temps de traitement total.
- 3ème conclusion : le temps de traitement total dépasse très rarement la seconde.
- 4ème et dernière conclusion : on aurra beau faire une application hyper optimisée (cache, optimisation SQL, etc.) ça ramera toujours autant sur free.
- Ce que je voudrais bien savoir, c'est où le bât blesse sur free : réseau ? bande passante ? etc.
(Oui : le temps de resolution DNS, la latence (temps de reaction materiel reseau), le debit disponible, la charge de la machine serveur (la prise en charge de la requête par le serveur ne sera pas immédiate) ... --
DavidDelon )
- Charles, mon avis est tout à fait différent du tient. Je ne pense pas du tout que ça ramera toujours sur Free. Au contraire, j'espère arriver à rendre le moteur très rapide même sur Free. STP ne t'emballes pas avec tous les trucs de cache dont tu as parlé. A mon avis tu pourras faire tout ce que tu voudras de ce côté là ça ramera toujours. Au fait je sais pas si David t'en a parlé mais on aimerai bien un nouveau look pour le site.
- -- PatrickPaul
Patrick, avant toute modification importante de wakka pour mettre en place les caches, j'aimerais que toi non plus tu ne t'emballes pas
avec une solution qui risque de bouleverser totalement la structure de l'application, aussi je te demande de ne pas modifier le CVS pour tout
ce qui est cache mais de nous montrer ce que ca donne sur ton site sur free avant, comme
CharlesNepote et moi-même l'avont fait pour l'internationalisation ou sur d'autres sujets.
--
DavidDelon
- D'accord avec David. Pour répondre à Patrick : je conçois bien que ton avis soit différent. Peux-tu argumenter ?
- -- CharlesNepote
- 1. Je ne m'emballe pas.
- 2. Je ne compte pas du tout changer la structure de l'application. Au contraire je ne vais pas toucher aux fichiers existant je pense.
- 3. Je vous montrerai ce que ça donne avant, pas de problème.
- 4. Pour répondre à Charles, j'adore argumenter mais je suis plutôt un orateur :-P J'essyerai cependant de faire des efforts.
- -- PatrickPaul
- 1. J'ai un copain qui a monté récemment un wiki en ASP et qui l'a publié sur internet. Il utilise les méthodes de caches clients que je suggère dans GererLesCachesAuNiveauApplicatif. Je vous suggère d'aller voir son site http://www27.brinkster.com/bleuciel/ et de faire le test suivant : cliquez sur WikiEnAsp?, puis sur Wiki2HTML? (la page est un peu longue à charger), puis cliquez sur Accueil et refaire le chemin WikiEnAsp?, puis Wiki2HTML? : vous verrez que les pages WikiEnAsp? et Wiki2HTML? ne sont pas redemandées au serveur mais prise dans le cache du navigateur. Si l'une de ces deux pages est modifiée, elle sera alors redemandée au serveur. La plupart des navigateurs devraient gérer cela correctement. Cette méthode requiert trois bouts de code (je publierai les exemples plus tard ; mes tests en local sont concluants pour wakkafr). Cette solution ne résoud pas tous les problèmes mais elle est particulièrement simple à mettre en oeuvre et offre des gains de performance immédiats. -- CharlesNepote ;Je viens de jeter un coup d'oeil, c'est clairement quelque chose à mettre en place immédiatemment -- DavidDelon
- 2. Pourquoi je pense que les caches de page réalisés en php seront peu efficaces ? Car je pense que, sur free, c'est le réseau qui bouffe du temps, pas les traitements. Je n'ai pas encore fait le test (d'où je suis je ne peux pas), mais je vais ce soir enregistrer une page de wakkafr au format HTML, l'inclure dans un php qui fera juste <?php include xxx.html ?> et mesurer le délai donné par Mozilla (délai calculé depuis le clic jusqu'à l'affichage total de la page). Je pense que je vais obtenir très peu de différence entre la page générée par wakkafr et la page générée par l'include. Rendez-vous ce soir.
- 3. Les systèmes de cache peuvent avoir une utilité en intranet, sur de petits serveurs, avec des pages très complèxes. Et je pense qu'on peut quand même les étudier.
- 4. (Moi j'aime bien la diversité et on est pas tous obligé d'avoir les mêmes idées, les mêmes angles d'approches d'un problème, les mêmes qualités et défauts. L'important c'est de pouvoir parler.)
- -- CharlesNepote
- 1. Super idée le cache en local.
- 2. Pour ce qui est des pages sur Free, personnellement j'ai un site html et un site avec WakkaFr installé et il n'y a pas photo : le site en html s'affiche quasi instantannément alors que Wiki, même si ça peut être rapide à certaine heures, est bien plus lent. De toute façon il serait bon d'éviter tous ces appels à la base de données je pense.
- 3. Moi aussi j'aime bien la diversité et j'encourage même à ce qu'on développe plusieurs solutions et, pourquoi pas, au final en choisir une ou bien un mélange de plusieurs solutions.
- 4. A ce soir donc. Je serais sur le chat de 20h à 21h environ.
- - PatrickPaul
- 1. Me too
- 2. J'ai aussi des sites en html sous free et ca rame parfois autant que wakka. Mais je suis d'accord pour qu'on etudie un système de cache.
- 3. On peut imaginer un CVS avec trois branches : stable , test et prospective.
- 4. J'essairai d'être là.
- - DavidDelon
- J'ai donc effectué mes tests ce soir comme je l'avais proposé tout à l'heure. Résultat des courses, vous allez pouvoir comparer vous-même :
- http://charles.nepote.free.fr/wakkafr/wakka.php?wiki=BacASable : la page générée par le moteur wakkafr
- http://charles.nepote.free.fr/wakkafr/index2.php : la page générée par le code suivant :
- <?php
- list($g_usec, $g_sec) = explode(" ",microtime());
- define ("t_start", (float)$g_usec + (float)$g_sec);
- include "index2.html";
- list($g2_usec, $g2_sec) = explode(" ",microtime());
- define ("t_end", (float)$g2_usec + (float)$g2_sec);
- print "\n\n<br /><br /><b>".round(t_end-t_start, 4)." s (total time)</b></span><br />\n";
- ?>
- (sachant que index2.html est un enregistrement de la page générée par le moteur wakkafr.
- Bilan des courses à 21 h 20 :
- de 3.5 à 11 s avec une moyenne pifométrique de 5-6 sur une douzaine d'essais pour 1 (avec un pic à 35 s. que je ne compte pas)
- de 1.7 à 3.8 s avec une moyenne pifométrique de 3 sur une douzaine d'essais pour 2 (avec un pic à 12 s. que je ne compte pas)
- Les 2-3 secondes de différences s'expliquent en grande partie par le temps de traitement. Mais, il faut bien voir que la page est particulièrement lourde et qu'un délai de d'affichage de 3 s. pour une telle page où on trouve seulement 1 include, n'est pas normal.
- Conclusion provisoire :
- oui, un cache php côté serveur peut améliorer les délais sur des pages complexes ;
- non, il ne faut pas s'attendre à avoir des résultats miracles sur free.fr ; il vaut donc mieux exploiter aussi au mieux les caches des navigateurs.
- -- CharlesNepote