4 pièce(s) jointe(s)
Différence de performance entre PHP et cgi en C
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 :
Code:
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 PHP utilisé est en pièce jointe à ce post.
Le fichier C pour généré le CGI est lui aussi en pièce jointe et est compilé via :
Code:
gcc -O2 -o tables.cgi $(mysql_config --cflags) tables.c $(mysql_config --libs)
J'ai alors réalisé deux tests :
Le premier test, est réalisé via la commande time et donne les résultats suivants :
pour le php :
Code:
1 2 3 4
|
real 0m0.149s
user 0m0.036s
sys 0m0.104s |
pour le CGI :
Code:
1 2 3 4
|
real 0m0.089s
user 0m0.032s
sys 0m0.040s |
Il semble, à l'issue de ce premier test, que le CGI offrirait un gain de 40% par rapport à son homologue PHP.
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.