IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Apache Discussion :

Différence de performance entre PHP et cgi en C


Sujet :

Apache

  1. #1
    Membre habitué
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2010
    Messages
    80
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2010
    Messages : 80
    Points : 169
    Points
    169
    Par défaut 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 : 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 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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    real    0m0.149s
    user    0m0.036s
    sys     0m0.104s
    pour le CGI :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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.
    Fichiers attachés Fichiers attachés

  2. #2
    Membre habitué
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2010
    Messages
    80
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2010
    Messages : 80
    Points : 169
    Points
    169
    Par défaut
    re-bonjour,

    je suis arrivé à une solution acceptable et performante en passant par l'utilisation de fastCGI (fcgid) et l'api fournie par fastcgi.

    dans la configuration Apache, j'ai ajouté la directive suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SetHandler fcgid-script
    Dans le code source du programme C de test, j'ai ajouté une boucle de traitement _après_ la connexion à la base de données, ce qui fait que le CGI n'établit plus qu'une seule connexion pour toute la durée de vie du CGI (qui du coup est paramétrée pour ne pas se finir).

    Le nouveau source du programme C est attaché à ce post.

    Les gains en performance sont drastiques pour le coup et ab2 me donne un gain de performance d'à peu près 42% pour le même traitement en PHP et en C (CGI), en faveur du CGI.
    Fichiers attachés Fichiers attachés
    • Type de fichier : c test.c (1,0 Ko, 97 affichages)

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 1
    Dernier message: 28/03/2014, 15h15
  2. [PC portable] Différence de performance entre processeur 2 Ghz et 2,5 GHz
    Par debdev dans le forum Ordinateurs
    Réponses: 5
    Dernier message: 02/11/2009, 13h41
  3. Différence de performance entre localhost et serveur
    Par Borowsky dans le forum Décisions SGBD
    Réponses: 5
    Dernier message: 10/09/2009, 01h56
  4. Réponses: 14
    Dernier message: 12/04/2009, 21h47
  5. Différence de performance entre JOIN et Subselect ?
    Par guidav dans le forum Requêtes
    Réponses: 1
    Dernier message: 20/07/2007, 11h01

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo