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 :

Performance désastreuse de mod_rewrite


Sujet :

Apache

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    décembre 2004
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : décembre 2004
    Messages : 23
    Points : 24
    Points
    24
    Par défaut Performance désastreuse de mod_rewrite
    Bonjour à tou(te)s,

    J'ai quelques problèmes de performance avec le mod_rewrite d'Apache, aussi je me demandais s'il s'agissait d'un problème de mon côté ou s'il était simplement très lent.

    Ma config: WinXP Pro, Apache 2.0.55, PHP 5.1.2 (sans opcode cache ou accélérateur).

    Pour l'expérience j'ai créé un fichier bar.html accessible via http://dev.apache.lan/bar.html
    Ensuite j'ai créé un .htaccess pour accéder à la page via http://dev.apache.lan/foo
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    RewriteEngine  on
    RewriteOptions MaxRedirects=1
    RewriteRule    "^foo$"           bar.html   [NS,L]
    Tout fonctionne correctement, quand je vais à http://dev.apache.lan/foo c'est bien le contenu de bar.html qui est affiché. Pour mesurer l'impact de mod_rewrite j'ai ensuite utilisé Apache Bench (ab pour les intimes) et là j'ai été surpris de voir que /foo était 20 fois plus lent que /bar.html! 50 pages/s contre plus de 1000 pages/s. Pour avoir un autre point de comparaison j'ai créé un fichier PHP foo.php
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <?php readfile('bar.html'); ?>
    Résultat: l'affichage par PHP génère un peu moins de 500 pages par secondes, donc je ne comprends pas pourquoi mod_rewrite est si lent.

    Quelqu'un aurait-il une idée ou un lien intéressant ?

    Pour info, voici le résultat d'ab.exe, je n'ai laissé que les informations pertinentes pour des raisons de lisibilité. La page PHP génère autant d'HTML mais ne génère pas certains en-têtes tels que ETag ou Last-modified. (rajouter ces headers ne ralentit que marginalement son traitement donc ça n'explique pas non plus les différences entre mod_rewrite et PHP)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    C:\Program Files\EasyDev\Apache2\bin>ab -k -c 20 -n 500 http://dev.apache.lan/foo
     
    Time taken for tests:   9.353450 seconds
    Complete requests:      500
    Failed requests:        0
    Write errors:           0
    Keep-Alive requests:    500
    Total transferred:      152520 bytes
    HTML transferred:       19000 bytes
    Requests per second:    53.46 [#/sec] (mean)
    Time per request:       374.138 [ms] (mean)
    Time per request:       18.707 [ms] (mean, across all concurrent requests)
    Transfer rate:          15.82 [Kbytes/sec] received
     
    C:\Program Files\EasyDev\Apache2\bin>ab -k -c 20 -n 500 http://dev.apache.lan/bar.html
     
    Time taken for tests:   0.380547 seconds
    Complete requests:      500
    Failed requests:        0
    Write errors:           0
    Keep-Alive requests:    500
    Total transferred:      152520 bytes
    HTML transferred:       19000 bytes
    Requests per second:    1313.90 [#/sec] (mean)
    Time per request:       15.222 [ms] (mean)
    Time per request:       0.761 [ms] (mean, across all concurrent requests)
    Transfer rate:          388.91 [Kbytes/sec] received
     
    C:\Program Files\EasyDev\Apache2\bin>ab -k -c 20 -n 500 http://dev.apache.lan/foo.php
     
    Time taken for tests:   1.31483 seconds
    Complete requests:      500
    Failed requests:        0
    Write errors:           0
    Keep-Alive requests:    500
    Total transferred:      105520 bytes
    HTML transferred:       19000 bytes
    Requests per second:    484.74 [#/sec] (mean)
    Time per request:       41.259 [ms] (mean)
    Time per request:       2.063 [ms] (mean, across all concurrent requests)
    Transfer rate:          99.86 [Kbytes/sec] received
    D'avance merci !

  2. #2
    Membre à l'essai
    Profil pro
    Inscrit en
    décembre 2004
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : décembre 2004
    Messages : 23
    Points : 24
    Points
    24
    Par défaut
    J'ai failli oublier de poster le contenu du log de mod_rewrite:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    [rid#10dc328/initial] (3) [per-dir D:/dev/] strip per-dir prefix: D:/dev/foo -> foo
    [rid#10dc328/initial] (3) [per-dir D:/dev/] applying pattern '^foo$' to uri 'foo'
    [rid#10dc328/initial] (2) [per-dir D:/dev/] rewrite foo -> bar.html
    [rid#10dc328/initial] (3) [per-dir D:/dev/] add per-dir prefix: bar.html -> D:/dev/bar.html
    [rid#10dc328/initial] (2) [per-dir D:/dev/] strip document_root prefix: D:/dev/bar.html -> /bar.html
    [rid#10dc328/initial] (1) [per-dir D:/dev/] internal redirect with /bar.html [INTERNAL REDIRECT]
    [rid#10e2cd0/initial/redir#1] (3) [per-dir D:/dev/] strip per-dir prefix: D:/dev/bar.html -> bar.html
    [rid#10e2cd0/initial/redir#1] (3) [per-dir D:/dev/] applying pattern '^foo$' to uri 'bar.html'
    [rid#10e2cd0/initial/redir#1] (1) [per-dir D:/dev/] pass through D:/dev/bar.html

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    décembre 2004
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : décembre 2004
    Messages : 23
    Points : 24
    Points
    24
    Par défaut
    Très intéressant, en retirant le .htaccess, ajoutant son contenu au VirtualHost (sans oublier d'ajouter le slash / en début d'URL) et en utilisant un chemin d'accès absolu ("D:/dev/" au lieu de "/") les performances redeviennent tout à fait satisfaisantes:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    <VirtualHost dev.apache.lan>
       # ...config...
       RewriteEngine  on
       RewriteOptions MaxRedirects=1
       RewriteRule "^/foo$" "D:/dev/bar.html"   [NS,L]
    </VirtualHost>
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    C:\Program Files\EasyDev\Apache2\bin>ab -k -c 20 -n 500 http://dev.apache.lan/foo
     
    Time taken for tests:   0.480692 seconds
    Complete requests:      500
    Failed requests:        0
    Write errors:           0
    Keep-Alive requests:    500
    Total transferred:      152520 bytes
    HTML transferred:       19000 bytes
    Requests per second:    1040.17 [#/sec] (mean)
    Time per request:       19.228 [ms] (mean)
    Time per request:       0.961 [ms] (mean, across all concurrent requests)
    Transfer rate:          307.89 [Kbytes/sec] received
    mod_rewrite.log
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    [rid#10ee658/initial] (2) init rewrite engine with requested uri /foo
    [rid#10ee658/initial] (3) applying pattern '^/foo$' to uri '/foo'
    [rid#10ee658/initial] (2) rewrite /foo -> D:/dev/bar.html
    [rid#10ee658/initial] (2) local path result: D:/dev/bar.html
    [rid#10ee658/initial] (1) go-ahead with D:/dev/bar.html [OK]
    Maintenant le challenge est réussir à obtenir des performances similaires avec .htaccess... Pour info, j'ai effectué le même test avec LightTPD 1.4.11:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Time taken for tests:   0.180259 seconds
    Complete requests:      500
    Failed requests:        0
    Write errors:           0
    Keep-Alive requests:    472
    Total transferred:      137860 bytes
    HTML transferred:       19000 bytes
    Requests per second:    2773.79 [#/sec] (mean)
    Time per request:       7.210 [ms] (mean)
    Time per request:       0.361 [ms] (mean, across all concurrent requests)
    Transfer rate:          743.37 [Kbytes/sec] received

Discussions similaires

  1. [Entity Framework] Performances désastreuses sur la pagination
    Par kedare dans le forum Développement
    Réponses: 30
    Dernier message: 25/01/2011, 17h44
  2. Réponses: 5
    Dernier message: 22/05/2007, 14h27
  3. [ POSTGRESQL ] Problème de performance
    Par Djouls64 dans le forum PostgreSQL
    Réponses: 6
    Dernier message: 26/05/2003, 16h18
  4. [JDBC][connexion persistante] performances avec JDBC
    Par nawac dans le forum Connexion aux bases de données
    Réponses: 6
    Dernier message: 06/05/2003, 10h37
  5. performance entre 3DS, ase, asc ...
    Par amaury pouly dans le forum OpenGL
    Réponses: 3
    Dernier message: 24/03/2003, 11h41

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