Benchmark between eZ Publish 4 and eZ Publish 3.10 with or without a PHP opcode cache

After 2 alphas and one beta release, eZ Publish 4 rc1 has been released last week. I'm trying to upgrade but I'm facing an encoding problem. In the meantime, I made a benchmark between eZ Publish 4rc1 with PHP 5.2.5 and eZ Publish 3.10.0 with PHP 4.4.7 on a Debian Etch system using the Dotdeb packages. I also tested the performances of APC, eAccelerator and XCache opcode cache modules in those configurations.

Protocol

I'm using the recommended configuration for Virtual Host setup of eZ Publish. I wrote this shell script to test performances of eZ Publish.

#! /bin/sh
 
REQUESTS=100
CONCURRENCY=2
TESTS=5
PAUSE_TESTS=90
URL='http://dev.pwet.fr/blog'
DATA_LOG_DIR=~/tests/results_php4_blog/
CONF_DIR=~/tests/conf
PAUSE_CONF=180
 
PHP_CONFD=/etc/php4/apache/conf.d/
 
[ ! -d $DATA_LOG_DIR ] && mkdir -p $DATA_LOG_DIR
 
for ini in $CONF_DIR/* ; do
    INI_BASE=`basename $ini`
    echo $INI_BASE
    DATA_LOG="$DATA_LOG_DIR/$INI_BASE.dat"
    [ -f $DATA_LOG ]  && rm -f $DATA_LOG
    touch $DATA_LOG
    # active extension
    ln -s $ini $PHP_CONFD/$INI_BASE
    /etc/init.d/apache restart > /dev/null  2>&1 
    sleep 2
 
    # initialize cache
    wget $URL -O /dev/null > /dev/null 2>&1
    sleep 2
 
    # tests
    for i in `seq 1 $TESTS` ; do
        echo "  Test $i"
        ab -c $CONCURRENCY -n $REQUESTS $URL | grep 'Requests per' | tr -s ' ' | cut -d ' ' -f 4 >> $DATA_LOG
        sleep $PAUSE_TESTS
    done
    sleep $PAUSE_CONF
 
    rm -f $PHP_CONFD/$INI_BASE
    /etc/init.d/apache restart
done

I've run this shell script with a PHP4 setup (eZ Publish 3.10) and then with a PHP5 setup (eZ Publish 4.0rc1) sharing the same database. The script uses 4 configurations of PHP (no opcode cache, apc, eaccelerator, xcache), for each it makes 5 series of 100 requests with a concurrency of 2 with ab (Apache Benchmark) and it logs the mean number of requests per second. There are pauses between tests. I've run those tests on two pages of this site on a dedicated test server, the first one is the /blog page with view cache et cache-block enabled and the second one is /man/linux but with no view cache and no cache-block at all in order to see how eZ Publish 4 and 3.10 performs on retrieving its cache or on building a page from scratch. The first one makes 6 SQL queries and uses 2 cache-block and its view cache. The second one, without content related caches, makes about 100 SQL queries an displays about 10 XML blocks and 3 dynamic lists.

Result with a cached page

Without an opcode cache on cached page, eZ Publish 4 is about 10% quicker than eZ Publish 3.10 but with an opcode cache system, the difference is about 50% ! It's interesting to note that with PHP4, eAccelerator seems to be the faster yet, about 10% more than APC or XCache but with PHP5 there's almost no difference (more or less 2%).

Result with a page without content related cache

In this test, without an opcode cache, eZ Publish 4 is 85% faster than eZ Publish 3.10. And with an opcode, eZ Publish 4 using PHP 5.2.5 is about 150% faster than eZ Publish 3.10 !

Conclusion

No doubt, eZ Publish 4 is really faster than eZ Publish 3.10 and even more with an opcode cache.

I think I'm going to test eZ Publish 4 and 3.10 with apache 1.3 and apache 2.2 and perhaps with different configuration of MySQL 5.0, stay tuned :)

Les titres de OuiFM en OSD

J'aime beaucoup écouter la radio parisienne OuiFM. Pour les provinciaux, il est possible de l'écouter directement sur le site via une animation flash qui affiche le titre en cours ou avec son lecteur préféré viale flux MP3 qui est probablement capable d'en faire de même, mais il n'est pas très pratique devoir remettre au premier plan le lecteur (et/ou de changer de bureau virtuel). Je trouve aussi pénible que le lecteur affiche systématiquement le titre comme le font certains, je préfère avoir le titre à la demande. J'ai donc écrit un petit script shell qui va récupèrer le titre sur le site de OuiFM comme le fait l'animation flash et l'affiche en OSD. Pour l'utiliser sous Ubuntu (et probablement Debian), il faut installer le paquet xosd-bin et php (4 ou 5) en mode ligne de commande avec la commande suivante :

$ sudo apt-get install xosd-bin php5-cli

Le paquet xosd-bin fournit le programme osd_cat qui permet de lire un fichier à la manière de cat en affichant le résultat en OSD selon différents paramètres (couleur, police, position, ...). J'ai associé l'exécution de ce script à la touche F9 dans Openbox, ainsi si un titre passe et je ne connais pas l'artiste, je peux connaître rapidement le titre en pressant cette touche.

#! /bin/sh
 
URL_DATA="http://www.ouirock.com/data1.php"
 
TMP_FILE="/tmp/ouifm_data"$$".txt"
DATA_OSD=""
 
OSD_FONT='-bitstream-dejavu sans-bold-r-*-*-17-*-*-*-*-*-*-*'
OSD_VER_POS="bottom"
OSD_HOR_POS="right"
OSD_COLOR="#95b9c8"
OSD_DELAY=30
OSD_LINE_FROM_BOTTOM=2
 
get_infos ()
{
    DATA_SHELL=`wget "$1" -q -O - | sed 's/&/ /g'`
    eval $DATA_SHELL
    DATA_OSD=`echo '<?php echo utf8_decode(urldecode("'$artiste' - '$titre'"))."\n"; ?>' | php`
}
 
display_infos ()
{
    get_infos $URL_DATA
    echo "$DATA_OSD" > $TMP_FILE
    osd_cat -l $OSD_LINE_FROM_BOTTOM  -f "$OSD_FONT" -p "$OSD_VER_POS" -A "$OSD_HOR_POS" -c "$OSD_COLOR" -d "$OSD_DELAY" $TMP_FILE
}
 
touch $TMP_FILE
display_infos $URL_DATA
rm -f $TMP_FILE

Le seul point particulier concerne la fonction get_infos qui récupère les données sur le site de OuiFM puis crée les variables avec eval et les décode avec un tout petit morceau de PHP passé directement à l'interprèteur.

Billet rédigé en écoutant entre autres "Hey Gravity - Risen (She Said)", "Rinocerose - Cubicle", "Green Day - Basket Case", ... :-)

Nettoyage des sessions dans eZ Publish (bug #10431)

J'ai remarqué que sur plusieurs sites que la table ezsession chargée de stocker les données de session dans eZ Publish n'est jamais nettoyée, les données de session expirée s'accumulent. Selon la fréquentation du site, on obtient à plus ou moins long terme une table avec des millions d'enregistrements ce qui provoque au choix des ralentissements, des vérifications (mysqlcheck ) interminables, des problèmes pour faire les backups (mysqldump de plusieurs gigas) voire carrément une corruption de la base de données. J'ai d'ailleurs rapporté ce bug il y a quelques temps en proposant un script de 8 lignes (dont 4 inutiles...:-) à lancer via le système de cronjobs d'eZ Publish . Je ne suis visiblement pas le seul à avoir rencontré ce problème. Dans un fil du forum sur le même sujet , Xavier Dutoit propose d'utiliser le script update/common/scripts/cleanup.php pour supprimer les sessions expirées. Markus Bader a créé l'extension Session Cleanup pour régler ce problème.

Mais quel est la vraie origine de ce problème ? Richard Bayet apporte la lumière sur ce problème en citant un commentaire de la documentation PHP officiel sur une spécificité de Debian . Pour résumer, eZ Publish intègre son propre gestionnaire de session pour stocker les données en base plutôt que dans des fichiers. Or, sous Debian et dérivés, le nettoyage (Garbage collector) des anciennes sessions est assurées par un script shell lancé régulièrement par cron plutôt que par la fonction gc définit avec session_set_save_handler pour plus de sécurité dans l'utilisation du gestionnaire par défaut qui travaille avec des fichiers. Évidemment ce script est incapable de supprimer les sessions en base... Le lancement d'un script spécifique de manière asynchrone est donc nécessaire pour Debian et dérivés. Tout s'explique donc.

Warning au lancement de scripts PHP4 en CLI

J'ai un warning pénible lors du lancement d'un script PHP4 en ligne de commande (CLI) sur ma Ubuntu Edgy Eft installée sur ma Dedibox. Rien de bien grave, mais à chaque lancement d'un script (au hasard un de ceux d'eZ Publish :-), j'ai le message suivant :

$ php4 update/common/scripts/cleanup.php -s plain_site_admin expired_session
PHP Warning:  mime_magic: type regex            BEGIN[[:space:]]*[{]    application/x-awk invalid in Unknown on line 0

Un moyen de supprimer ce message systématique trouvé sur Launchpad et sur l'outil de rapport de bug de Debian est d'aller commenter la ligne 273 du fichier /usr/share/file/magic.mime. Simple, un peu crade mais au moins ça marche et puis je ne pense pas que cette modification ait beaucoup d'impact sur le reste du système...

Faire une capture d'écran en GIF animé (un screencast)

En écrivant mon précédent billet sur le logiciel Apwal, j'ai vainement cherché un logiciel permettant de faire une capture d'écran "animée" que ce soit en vidéo, en flash ou en GIF animé. J'avais bien trouvé Xvidcap mais il n'est pas dans les dépôts Ubuntu et le paquet non-officiel pour Debian ne fonctionne pas correctement...

Je me suis donc rabbattu sur deux captures d'écran consécutives réalisées avec mon script de capture basé sur import (de la suite ImageMagick) montées en GIF animé avec The GIMP... Mais depuis, au détour d'un commentaired'un journal trollogène sur LinuxFr, j'ai découvert que plusieurs logiciels font cela et qu'ils portent tous le nom d'une ville turque :

J'ai retenu byzanz car il produit des GIF animés ce qui est quand même le plus pratique pour publier sur le web et en plus il est disponible dans les dépôts Universe d'Ubuntu ce qui simplifie grandement son installation avec la ligne de commande suivante (ou en cherchant dans synaptic ou équivalent) :

> tigrou@Lorien[192.168.0.243]:~$ sudo apt-get install byzanz

Une fois installé, ce logiciel se manipule soit via une applet dans un panneau GNOME soit via la ligne de commande en lui passant quelques paramètres détaillés dans sa courte page du manuel, comme je n'utilise pas GNOME, la ligne de commande ressemble à la suivante :

> tigrou@Lorien[192.168.0.243]:~$ byzanz-record -l -d 15 -x 249 -y 196 -w 460 -h 300 -c --delay=2 edition_dans_ez_publish.gif

Cette ligne va enregistrer deux secondes après son lancement un GIF animé nommé edition_dans_ez_publish.gif tournant en boucle de 460x300 pixels dont le point d'origine est 249x196 d'une durée de 15 secondes en incluant le curseur X11, ce qui donne l'animation suivante :

Comme c'est du GIF ça ne peut contenir que 256 couleurs mais c'est très léger (64Ko pour 15 secondes dans cet exemple) et donc tout à fait publiable sur le web ou envoyable par mail et peut permettre de facilement montrer une fonctionnalité voire de rapporter un bug difficile à expliquer.

Tags : GNOME, X11, Truc, Ubuntu, Blog, Debian

Flux RSS des billets

Flux RSS des billets

Rechercher sur pwet.fr

À retenir

Derniers commentaires

Archives

Nuage de tags

Bioutifoul photos

Quelques liens

Licence d'utilisation

Contenu sous Licence Creative Commons By-Sa

Sauf mentions spécifiques, les billets et les photos publiés sur ce site sont placés sous la licence Creative Commons by-sa.

Pour toute utilisation dépassant le cadre de cette licence, merci de me contacter par e-mail.