Blog de Geeek, le blog geek par excellence par Ludovic Toinel ...

Balise - performance

Fil des billets - Fil des commentaires

mercredi 16 janvier 2008

Top Blogs High-Tech : Respect des normes W3C et Performances

Je me suis amusé à faire un re-classement des 10 top blogs High-Tech sur Wikio du mois de janvier en fonction de différents critères techniques.

Mes critères

Environnement des tests

  • Firefox 2.0.0.11
  • ADSL Free en mode Patate
  • CTRL+F5 avant chaque mesure pour purger le cache du navigateur
  • Les mesures prennent compte des composants externes embarqués sur le blog (pub, javascript de tracking ... ).

Classement Wikio

  1. TechCrunch
  2. Presse-citron
  3. FredCavazza
  4. Kelblog
  5. Mashable
  6. Loïc le Meur
  7. Transnets
  8. GuiM
  9. 2803 by Henri Labarre
  10. AccessOWeb 2.0

Classement "Performance"

  1. FredCavazza (4,46 sec.)
  2. Presse-citron (5,81 sec.)
  3. 2803 by Henri Labarre (6,4 sec.)
  4. AccessOWeb 2.0 (8,2 sec.)
  5. Transnets (7,49 sec.)
  6. Kelblog (12,71sec.)
  7. TechCrunch (15,5 sec.)
  8. Mashable (13,64 sec.)
  9. Loïc le Meur (18,74 sec.)
  10. GuiM (34,07 sec.)

Classement "Qualité du XHTML"

  1. 2803 by Henri Labarre (11 erreurs / 0 avertissements)
  2. FredCavazza (13 erreurs / 0 avertissements)
  3. Presse-citron (15 erreurs / 1 avertissement)
  4. Kelblog (30 erreurs / 0 avertissements)
  5. AccessOWeb 2.0 (37 erreurs / 5 avertissements)
  6. Loïc le Meur (90 erreurs / 16 avertissements)
  7. Transnets (92 erreurs / 2 avertissements)
  8. TechCrunch (101 erreurs / 14 avertissements)
  9. Mashable (104 erreurs / 4 avertissements)
  10. GuiM (127 erreurs / 6 avertissements)


Bravo à Fredcavazza, Presse-citron et 2803 ! ;-)

Des commentaires sur ce classement ?

Et votre blog ? Quelle position a-t'il sur ces mêmes critères ?

lundi 17 décembre 2007

Plugin Dotclear2 : Performance

dotclear

Voici un nouveau plugin qui affiche à vos visiteurs le temps de génération de la page par Dotclear2. Pour voir le résultat de ce plugin, lisez la dernière ligne de cette page Web.

Comment ça marche ?

C'est simple, un chrono est lancé dès la réception de la requête HTTP par Dotclear. Ensuite un tag permet d'afficher en bas de page le temps total de la génération de la page demandée.

Installer le plugin

Après avoir installé ce plugin, éditez le fichier "index.php" qui se trouve à la racine de votre blog, et ajouter la ligne suivante :

$time_start = microtime();

Juste en dessus de :

if (isset($_SERVER['DC_BLOG_ID'])) {

Ensuite, éditez le fichier "_footer.html" de votre thème et placez la ligne suivante :

<p>{{tpl:lang Powered by}} <a href="http://www.dotclear.net/">DotClear 2</a> en <b>{{tpl:performance}}</b> sec.</p>

Télécharger le plugin

Liste des mises à jour :

v0.1 :

  • Première release.

dimanche 18 novembre 2007

Optimisation de Dotclear 2 Beta 7 : La face cachée de la base de données

dotclear2,sql,performance

Après mon précédent article concernant quelques pistes d'optimisations de Dotclear 2, voici un nouvel article qui liste quelques pistes d'optimisations pour la base de données de Dotclear2 beta 7.

Remarque : Je tiens à mettre l'accent sur le "beta 7" car ces optimisations ne seront pas forcément applicables à la beta 8 ...

1) Tracker les requêtes SQL les plus lentes

Dotclear2 étant développé très proprement (merci à l'équipe de développement de Dotclear2), toutes les requêtes SQL passent par un composant qui se nomme "dblayer", qui est une couche d'abstraction à l'accès de la base de données.

inc/clearbricks/dblayer/

Cette couche permet à Dotclear2 de communiquer proprement avec sa base de données, celle-ci est composée d'une classe php "dblayer.php" et de plusieurs autres classes spécifiques aux bases de données que Dotclear 2 supporte.

Après une étude rapide du fichier dblayer.php, on se rend très vite compte que les requêtes de consultation "select" passent par la méthode "select()" de la classe dbLayer présent dans le fichier.

Pour connaitre la liste des requêtes SQL les plus longue, il suffit donc de tracer les requêtes depuis cette méthode ;-)

Voici la méthode "select()" avant patch:

public function select($sql)
        {
                $result = $this->db_query($this->__link,$sql);

                $this->__last_result =& $result;

                $info = array();
                $info['con'] =& $this;
                $info['cols'] = $this->db_num_fields($result);
                $info['rows'] = $this->db_num_rows($result);
                $info['info'] = array();

                for ($i=0; $i<$info['cols']; $i++) {
                        $info['info']['name'][] = $this->db_field_name($result,$i);
                        $info['info']['type'][] = $this->db_field_type($result,$i);
                }

                return new record($result,$info);
        }

Et la voici après patch :

public function select($sql)
        {
                $starttime = microtime();
                $result = $this->db_query($this->__link,$sql);
                $endtime = microtime();

                $tracesql = false;
                $totaltime = $endtime - $starttime;

                // Si la requête est plus longue que 0.5 secondes
                if ($totaltime > 0.5 ){
                        $tracesql = true;
                }

                // On trace la requête SQL
                if ($tracesql){

                        $fp = fopen("/tmp/db.log", "a");

                        $data = $totaltime . ";" . $sql . "\n";

                        // Write the data to the file
                        fwrite($fp, $data);

                        // Close the file
                        fclose($fp);
                }

                $this->__last_result =& $result;

                $info = array();
                $info['con'] =& $this;
                $info['cols'] = $this->db_num_fields($result);
                $info['rows'] = $this->db_num_rows($result);
                $info['info'] = array();

                for ($i=0; $i<$info['cols']; $i++) {
                        $info['info']['name'][] = $this->db_field_name($result,$i);
                        $info['info']['type'][] = $this->db_field_type($result,$i);
                }

                return new record($result,$info);
        }

Cette modification devrait nous permettre de tracer les requêtes select qui répondent en plus de 0.5 secondes dans un fichier qui se nomme "db.log" et qui sera créé dans le répertoire temporaire "/tmp".

2) Analyse de requêtes SQL

Après un peu de trafic le blog, vous devriez obtenir des requêtes SQL dans le fichier "/tmp/db.log". Si ce n'est pas le cas, soit votre blog ne contient pas beaucoup d'articles, soit vous avez un serveur avec pas mal de CPU ;-)

Note: Le premier chiffre qui se trouve devant la requête est le temps d'exécution de celle-ci.

Voici les trois requêtes SQL les plus redondantes qui ont été tracées sur mon blog. Les requêtes tracées dépendent énormément de la configuration de votre blog, de la quantité d'articles que contient votre blog, et de la qualité de votre hébergement Web :

SELECT meta_id, meta_type, COUNT(M.post_id) AS count FROM dc_meta M LEFT JOIN dc_post P ON M.post_id = P.post_id WHERE P.blog_id = 'default'  AND meta_type = 'tag' AND ((post_status = 1 AND post_password IS NULL ) ) GROUP BY meta_id,meta_type,P.blog_id ORDER BY count DESC LIMIT 50

SELECT P.post_id, P.blog_id, P.user_id, P.cat_id, post_dt, post_tz, post_creadt, post_upddt, post_format, post_password, post_url, post_lang, post_title, post_excerpt, post_excerpt_xhtml, post_content, post_content_xhtml, post_notes, post_type, post_meta, post_status, post_selected, post_open_comment, post_open_tb, nb_comment, nb_trackback, U.user_name, U.user_firstname, U.user_displayname, U.user_email, U.user_url, C.cat_title, C.cat_url FROM dc_post P INNER JOIN dc_user U ON U.user_id = P.user_id LEFT OUTER JOIN dc_category C ON P.cat_id = C.cat_id WHERE P.blog_id = 'default' AND ((post_status = 1 AND post_password IS NULL ) ) AND post_type = 'post' AND (       (post_dt = '2006-03-29 22:49:37' AND P.post_id < 315)        OR post_dt < '2006-03-29 22:49:37' )  ORDER BY post_dt DESC, P.post_id DESC  LIMIT 1

SELECT C.comment_id, comment_dt, comment_tz, comment_upddt, comment_author, comment_email, comment_site, comment_content,  comment_trackback, comment_status, comment_spam_status, comment_spam_filter, comment_ip, P.post_title, P.post_url, P.post_id, P.post_password, P.post_dt, P.user_id, U.user_email, U.user_url FROM dc_comment C INNER JOIN dc_post P ON C.post_id = P.post_id INNER JOIN dc_user U ON P.user_id = U.user_id WHERE P.blog_id = 'default' AND ((comment_status = 1 AND P.post_status = 1 AND post_password IS NULL ) ) ORDER BY comment_dt DESC  LIMIT 10

La première chose à vérifier est que les éléments présents après le "WHERE" des requêtes possèdent bien un index en base :

  • Sur la première requête, il manque des index sur meta_type, post_status et post_password.
  • Sur la deuxième requête, il manque un index sur post_type.
  • Sur la dernière requête, il manque un index sur comment_status et comment_dt

Voici les requêtes SQL pour créer ces index en base :

ALTER TABLE `dc_post` ADD INDEX ( `post_status` , `post_password` )  ;
ALTER TABLE `dc_post` ADD INDEX ( `post_type` )  ;

ALTER TABLE `dc_meta` ADD INDEX ( `meta_type` )  ;

ALTER TABLE `dc_comment` ADD INDEX ( `comment_status` )  ;
ALTER TABLE `dc_comment` ADD INDEX ( `comment_dt` )  ;

Après ces modifications, les requêtes que vous trouverez dans votre fichier db.log devraient être moins nombreuses. J'ai ouvert un post sur le forum de Dotclear2, mais je n'ai pas encore de réponse quand à mes optimisations.

Je souhaite remercier l'équipe Dotclear2 pour leur travail et les féliciter de cet merveilleux outil qu'est Dotclear2 !

mardi 4 septembre 2007

Le Web 2.0 et MySQL

mysql,webminaire

Un webminaire est organisé par MySQL le 12 septembre prochain à 10h00.

Le thème de ce Webminaire est :

Comment améliorer la performance, la montée en charge et la disponibilité d’une architecture Web 2.0 avec MySQL et MySQL Cluster.

Un sujet qui devrait intéresser beaucoup de lecteurs de ce blog je pense. L'inscription à ce webminaire se fait sur le site de MySQL via cette URL :

http://www.mysql.com/news-and-events/web-seminars/display-47.html

Pour assister à ce Webminaire, vous avez juste besoin d'un PC et d'une connexion Internet.

lundi 16 avril 2007

Temps de chargement de votre Blog ..

webwait.jpg

En réponse au ticket de Nicolargo

webwait.png

Bon c'est bon ... d'accord, j'avoue j'ai triché .. Mon blog est hébergé chez moi ... De chez vous cela donne quoi le temps de chargement de mon blog ?