zurück zur Startseite
  


Zurück XHTMLforum > Webentwicklung (außer XHTML und CSS) > Serveradministration und serverseitige Scripte
Seite neu laden mod_rewrite Performance bei vielen Regeln

Antwort
 
LinkBack Themen-Optionen Ansicht
  #1 (permalink)  
Alt 24.09.2008, 15:49
Benutzerbild von fox
fox fox ist offline
Erfahrener Benutzer
XHTMLforum-Kenner
Thread-Ersteller
 
Registriert seit: 11.09.2006
Beiträge: 1.011
fox sorgt für eine eindrucksvolle Atmosphärefox sorgt für eine eindrucksvolle Atmosphäre
Standard mod_rewrite Performance bei vielen Regeln (Erledigt/mit Benchmark)

Hallo Leute,

Dass mod_rewrite einen kleinen Overhead erzeugt ist ja bekannt, natürlich und logisch.
Aber wie sieht das bei sehr großen Seiten aus, bei vielen Regeln und vielen Zugriffen? Kann da der Server in die Knie gehen, wenn es z.B. für eine Webseite mit 100 Unterseiten ca. 50 Regeln gibt?

Ich bin gerade am Überlegen, wie ich das realisieren soll:

Struktur vom Benutzer aus gesehen:
Code:
/dir/
     -static.html   --> /cache/dir_static.html
     -dynamic.html  --> /index.php?page=dynamic
Mit anderen Worten: Eine statische Seite soll ohne Umweg über PHP aufgerufen werden, ohne dass allerdings das aufgerufene Verzeichnis existiert: die statischen Seiten sollen in einer Datenbank verwaltet und später einmalig in einem bestimmten Verzeichnis gecacht werden, um die Performance zu verbessern.

Nun komm ich allerdings nicht weiter: Soll ich lieber für jede Seite eine Rewrite-Regel anlegen oder doch lieber den Umweg über PHP gehen? Ersteres wäre mir wesentlich lieber, aber wie sieht es da mit der Performance aus? Sind mehrere Regeln (ab 50) ein Problem oder läuft das genauso flott?

Ich hoffe ich hab mein Problem einigermaßen rübergebracht... in meinem Kopf herrscht nämlich grad ziemliches wirrwarr...

lg

Geändert von fox (24.09.2008 um 19:42 Uhr)
Mit Zitat antworten
Sponsored Links
  #2 (permalink)  
Alt 24.09.2008, 19:42
Benutzerbild von fox
fox fox ist offline
Erfahrener Benutzer
XHTMLforum-Kenner
Thread-Ersteller
 
Registriert seit: 11.09.2006
Beiträge: 1.011
fox sorgt für eine eindrucksvolle Atmosphärefox sorgt für eine eindrucksvolle Atmosphäre
Standard

Hab mir mal die Arbeit gemacht und ein paar Benchmarks laufen lassen:

Code:
ab -kc 10 -t 60 http://example.com/testcase/dir/datei-0.txt
Referenz: Normale HTML-Datei ohne mod_rewrite und PHP:
Code:
	Document Path:          /found.html
	Document Length:        16 bytes

	Concurrency Level:      10
	Time taken for tests:   60.10580 seconds
	Complete requests:      46805
	Requests per second:    779.95 [#/sec] (mean)
	Time per request:       12.821 [ms] (mean)
	Time per request:       1.282 [ms] (mean, across all concurrent requests)

Mit mod_rewrite, 100 Einträge via .htaccess:
Code:
	Document Path:          /testcase/dir/datei-0.txt
	Document Length:        16 bytes

	Concurrency Level:      10
	Time taken for tests:   60.1905 seconds
	Complete requests:      15584
	Requests per second:    259.73 [#/sec] (mean)
	Time per request:       38.502 [ms] (mean)
	Time per request:       3.850 [ms] (mean, across all concurrent requests)

Mit mod_rewrite, 100 Einträge via httpd.conf:
Code:
	Document Path:          /testcase/dir/datei-0.txt
	Document Length:        16 bytes

	Concurrency Level:      10
	Time taken for tests:   60.977 seconds
	Complete requests:      15949
	Requests per second:    265.81 [#/sec] (mean)
	Time per request:       37.621 [ms] (mean)
	Time per request:       3.762 [ms] (mean, across all concurrent requests)

Mit mod_rewrite, 1000 Einträge via .htaccess (Auf keinen Fall eine Alternative):
Code:
	Document Path:          /testcase/dir/datei-0.txt
	Document Length:        16 bytes

	Concurrency Level:      10
	Time taken for tests:   60.8222 seconds
	Complete requests:      2968
	Requests per second:    49.46 [#/sec] (mean)
	Time per request:       202.184 [ms] (mean)
	Time per request:       20.218 [ms] (mean, across all concurrent requests)

Mit mod_rewrite, 1000 Einträge via httpd.conf:
Code:
	Document Path:          /testcase/dir/datei-1.txt
	Document Length:        16 bytes

	Concurrency Level:      10
	Time taken for tests:   60.3325 seconds
	Complete requests:      7443
	Requests per second:    124.04 [#/sec] (mean)
	Time per request:       80.617 [ms] (mean)
	Time per request:       8.062 [ms] (mean, across all concurrent requests)
Verwendete Konfiguration: (Nur eine Datei wurde erstellt + darauf zugegriffen)
Code:
# .htaccess

RewriteEngine on

RewriteRule ^dir/datei-1\.html\$ cache/datei-1.html
RewriteRule ^dir/datei-2\.html\$ cache/datei-2.html
# ...
RewriteRule ^dir/datei-100\.html\$ cache/datei-100.html


Mit PHP und mod_rewrite:
Code:
	Document Path:          /testcase/dir/datei-0.txt
	Document Length:        16 bytes

	Concurrency Level:      10
	Time taken for tests:   60.1508 seconds
	Complete requests:      18542
	Failed requests:        0
	Write errors:           0
	Keep-Alive requests:    18363
	Total transferred:      3793065 bytes
	HTML transferred:       296672 bytes
	Requests per second:    309.03 [#/sec] (mean)
	Time per request:       32.360 [ms] (mean)
	Time per request:       3.236 [ms] (mean, across all concurrent requests)
Verwendeter Code:
Code:
# .htaccess
RewriteEngine on

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule .+ create.php?file=%{REQUEST_URI} [L]
PHP-Code:
<?php
// create.php

header("Content-Type: text/plain");

if (!
file_exists ('cache/' basename ($_GET['file']))) {
    
file_put_contents ('cache/' basename ($_GET['file']), 'Datei existiert.');
}

readfile ('cache/' basename ($_GET['file']));
Vielleicht ist das Ergebnis ja für den ein oder anderen interessant.
Ich werde mich wohl für PHP entscheiden und eine Cache-Kontrolle realisieren müssen (genau das wollte ich mir ersparen). Aber gerade bei vielen Dateien ist PHP dann viel performanter (schreibt man das so?) als .htaccess-Einträge.

Geändert von fox (24.09.2008 um 23:38 Uhr)
Mit Zitat antworten
Sponsored Links
  #3 (permalink)  
Alt 24.09.2008, 19:43
Benutzerbild von Curtains
(Schlafen||Programmieren)
XHTMLforum-Mitglied
 
Registriert seit: 27.08.2008
Beiträge: 206
Curtains befindet sich auf einem aufstrebenden Ast
Standard

Hallo Fox,

ich bin kein Experte auf diesem Gebiet. Aber wenn es nach der Dokumentation geht, dann ist die Performance sehr schnell, wenn die Regeln direkt in die Konfigurationsdatei (httpd.conf) von Apache geschrieben werden ("per-server context").
Das Problem an .htaccess liegt darin, dass der Server zur Laufzeit den Ordner und alle Unterordner scannen muss. Dadurch kann die Verarbeitung sehr langsam werden.
Falls du also keinen Zugriff auf das Apache Config hast, dann empfehle dir, die .htaccess Datei in einen leeren Webordner (ohne Unterordner) zu legen. Und ein zentrales PHP-Script würde dann die Steuerlogik übernehmen.

Nachtrag: Ich habe deine Benchmarks noch nicht gesehen, da wir beinahe zeitgleich gepostet haben.
Mit Zitat antworten
  #4 (permalink)  
Alt 24.09.2008, 20:00
Benutzerbild von fox
fox fox ist offline
Erfahrener Benutzer
XHTMLforum-Kenner
Thread-Ersteller
 
Registriert seit: 11.09.2006
Beiträge: 1.011
fox sorgt für eine eindrucksvolle Atmosphärefox sorgt für eine eindrucksvolle Atmosphäre
Standard

Zitat:
Zitat von Curtains Beitrag anzeigen
Hallo Fox,

ich bin kein Experte auf diesem Gebiet. Aber wenn es nach der Dokumentation geht, dann ist die Performance sehr schnell, wenn die Regeln direkt in die Konfigurationsdatei (httpd.conf) von Apache geschrieben werden ("per-server context").
Das Problem an .htaccess liegt darin, dass der Server zur Laufzeit den Ordner und alle Unterordner scannen muss. Dadurch kann die Verarbeitung sehr langsam werden.
Falls du also keinen Zugriff auf das Apache Config hast, dann empfehle dir, die .htaccess Datei in einen leeren Webordner (ohne Unterordner) zu legen. Und ein zentrales PHP-Script würde dann die Steuerlogik übernehmen
Genau das dachte ich auch. Also entweder ist mein Server nicht normal, oder ich hab beim Konfigurieren was falsch gemacht...
Mit Zitat antworten
  #5 (permalink)  
Alt 24.09.2008, 21:24
Benutzerbild von Gumbo
XHTMLforum-Kenner
 
Registriert seit: 22.08.2004
Ort: Trier
Beiträge: 2.737
Gumbo ist jedem bekanntGumbo ist jedem bekanntGumbo ist jedem bekanntGumbo ist jedem bekanntGumbo ist jedem bekanntGumbo ist jedem bekannt
Standard

Du musst den Server auch so konfigurieren, dass er nicht nach „.htaccess“-Dateien sucht:
Code:
<Directory />
    AllowOverride none
</Directory>
__________________
Markus Wulftange
Mit Zitat antworten
  #6 (permalink)  
Alt 24.09.2008, 23:40
Benutzerbild von fox
fox fox ist offline
Erfahrener Benutzer
XHTMLforum-Kenner
Thread-Ersteller
 
Registriert seit: 11.09.2006
Beiträge: 1.011
fox sorgt für eine eindrucksvolle Atmosphärefox sorgt für eine eindrucksvolle Atmosphäre
Standard

Zitat:
Zitat von Gumbo Beitrag anzeigen
Du musst den Server auch so konfigurieren, dass er nicht nach „.htaccess“-Dateien sucht:
Code:
<Directory />
    AllowOverride none
</Directory>
Stimmt, das hatte ich vergessen. Habe nun noch einen Benchmark für 1000 Regeln in der httpd.conf hinzugefügt, da ist der Apache wesentlich schneller als per .htaccess. Ironischerweise wird er nur kaum schneller, wenn ich dann 900 Regeln rausnehme und nur 100 stehen lasse? So schafft er kaum 10.000 requests? Irgendetwas stimmt da nicht... und ich habe weder Zeit noch Lust, dem auf den Grund zu gehen, da diese Methode für mich nicht (mehr) in Frage kommt.
Mit Zitat antworten
  #7 (permalink)  
Alt 24.09.2008, 23:49
Benutzerbild von Gumbo
XHTMLforum-Kenner
 
Registriert seit: 22.08.2004
Ort: Trier
Beiträge: 2.737
Gumbo ist jedem bekanntGumbo ist jedem bekanntGumbo ist jedem bekanntGumbo ist jedem bekanntGumbo ist jedem bekanntGumbo ist jedem bekannt
Standard

Du solltest zusätzlich das „L“-Flag einsetzen, um bei eindeutigen Suchmustern bei der ersten Übereinstimmung den Durchlauf zu beenden.
__________________
Markus Wulftange
Mit Zitat antworten
  #8 (permalink)  
Alt 25.09.2008, 03:02
Benutzerbild von netspy
Erfahrener Benutzer
XHTMLforum-Kenner
 
Registriert seit: 13.08.2004
Ort: Leipzig
Beiträge: 1.956
netspy sorgt für eine eindrucksvolle Atmosphärenetspy sorgt für eine eindrucksvolle Atmosphäre
Standard

Hmm, also ich hab bei unserer meistbesuchten Seite etwas über 100 Regeln in der .htaccess. Bei durchschnittlich 800.000 Pageimpressions und über 2 Mio Hits am Tag haben wir damit noch keine echten Performance-Probleme. Die PIs gehen alle über PHP und bei jedem Zugriff gibt es verschiedene Datenbankzugriffe (MySQL auf dem selben Server).

Mit einem halbwegs leistungsstarkem Server mit ordentlich RAM muss man sich noch nicht so wahnsinnig Gedanken über ein paar Rewrite-Regeln machen. Ein vergessener Index bei einer häufig genutzten Datenbanktabelle kostet meist wesentlich mehr Zeit.

Ob man die Regeln direkt in die httpd.conf oder in eine .htaccess packt, hängt auch ein wenig vom Einsatzzweck ab. Bei statischen Seiten mit vielen Verzeichnissen macht die httpd.conf schon Sinn, da Apache nicht so viele Verzeichnisse durchsuchen muss. Bei einer dynamischen Lösung bringt es vermutlich nicht so viel, da ja meist sowieso nur eine zentrale index.php aufgerufen wird. Warum in deinem Test bei 1000 Regeln so ein großer Unterschied ist, verstehe ich auch nicht. Irgendwas muss da schief laufen oder Apache hat ab einer bestimmten Anzahl wirklich ein größeres Problem mit der .htaccess.

Mario
__________________
AppDev Blog · AppDev Forum
Mit Zitat antworten
Antwort

Themen-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus


Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Separierung browserspezifischer Regeln für spätere Wartung? AndreasB CSS 10 08.10.2010 14:46
Regeln des Browserstylesheets in Firebug anzeigen? AndreasB CSS 2 30.09.2010 21:42
CSS Regeln nicht anwenden dows CSS 19 01.10.2008 01:49
[mysql-DB] Performance bei Struktur-Änderungen von großen Tabellen mantiz Serveradministration und serverseitige Scripte 7 26.02.2008 14:02
Verschiedene Regeln für verschiedene Links Philippp CSS 2 16.10.2004 03:00


Alle Zeitangaben in WEZ +2. Es ist jetzt 18:08 Uhr.