bonjour,
suite à un besoin de performances sur un site à fort trafic, l'hypothèse de remplacer certaines pages PHP par un CGI développé en C a été évoquée.
l'environnement de test pour valider cette hypothèse est une machine virtuelle sous OpenSuSE 11.3 avec :
Apache 2.2.15
PHP 5.3.3 (module apache mod_php)
MySQL 5.1.46
Pour tester les différences de performance qui pourraient découler, j'ai fait un test consistant à interroger une table mysql avec le schéma suivant :
Le fichier PHP utilisé est en pièce jointe à ce post.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 +-------------+--------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +-------------+--------------+------+-----+---------+----------------+ | id | int(11) | NO | PRI | NULL | auto_increment | | lb | varchar(256) | YES | | NULL | | | description | varchar(512) | YES | | NULL | | +-------------+--------------+------+-----+---------+----------------+
Le fichier C pour généré le CGI est lui aussi en pièce jointe et est compilé via :
J'ai alors réalisé deux tests :
Code : Sélectionner tout - Visualiser dans une fenêtre à part gcc -O2 -o tables.cgi $(mysql_config --cflags) tables.c $(mysql_config --libs)
Le premier test, est réalisé via la commande time et donne les résultats suivants :
pour le php :
pour le CGI :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4real 0m0.149s user 0m0.036s sys 0m0.104s
Il semble, à l'issue de ce premier test, que le CGI offrirait un gain de 40% par rapport à son homologue PHP.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4real 0m0.089s user 0m0.032s sys 0m0.040s
Le second test a été réalisé via ab2 sur 2000 requêtes avec 10 accès concurrents.
Les résultats sont alors tout autre, et la version PHP écrase littéralement la version CGI avec 7ms de temps de traitement par requête dans le cas de PHP contre 29ms pour la version CGI.
sauriez vous d'où peut venir cette différence et si Apache joue un rôle dans cette dégradation de performance ? Si oui, comment puis-je faire en sorte que le gain constaté en ligne de commande soit aussi présent au travers d'Apache (utilisation de fast_cgi, etc.) ?
Merci pour vos réponses.
Partager