Squid url_rewrite Performance

Hier ein Tipp für Sysadmins, die url_rewrite in Squid nutzen: schaut euch genau an, wie performant eure Scripte sind und benchmarkt diese unbedingt!
Ich hatte die Tage ein Problem mit einem Squid, der ungewöhnlich hohe Load verursachte – es lag an ineffizienter Programmierung des Rewriters. Für eine Hand voll URLs sollte er Umleitungen vornehmen, etwa von ^http://domain/formular auf https://domain/formular.
Das ursprüngliche Script war in BASH programmiert – es verwendete externe Programme wie grep, sed – und war für geringe Bandbreiten (5MBit/s) performant genug. Die Bandbreite stieg jedoch bald auf 20MBit/s, was die Last schon sehr deutlich erhöhte, und es werden voraussichtlich bald ~200MBit/s sein.
Das Script wurde daraufhin in Perl reimplementiert und läuft laut Benchmark um den Faktor 180 (!) schneller. Als Benchmark empfiehlt sich:
[code language="shell"]time tail /var/log/squid/access_combined.log -n 100000 | awk '{print $7}' | /pfad/zum/url_rewriter.pl > /dev/null[/code]
Wenn dort (z.B. bei einem komplizierterem Script) Werte von mehr als 5 Sekunden stehen, sollte man sein Script für hohe Bandbreiten ggfs. überarbeiten und/oder in einer performanteren Sprache reimplementieren, z.B. in C oder für Extremfälle in Assembler.



JP Mens
Wer eine Komponente wie ein Squid URL rewriter in shell schreibt hat absolut keine Ahnung dessen was er/sie macht! Unix ist fuer Erwachsene!
Stefan
Hurra, Stammtischniveau!
matthias
Ist das Umschreiben der URL denn so kompliziert, dass man dafür ein externes Script benötigt? Wenn dahinter ein Apache liegt, wäre doch auch mod_rewrite möglich.
Stefan
Matthias: nein, kompliziert ist es nicht, man muss nur etwas Strings umschreiben. Squid bring dafür von haus aus nichts mit (interessant wäre sicherlich, sowas wie mod_rewrite anzubinden).
Oftmals macht es Sinn, die Rewrites im Squid zu pflegen, so hat man eine zentrale Stelle an der diese liegen, außerdem lassen sich nicht alle Sachen im Backend machen, z.B. wenn man die HTTPS-Terminierung im Squid vornimmt, die Backends nur HTTP können und man Unterseiten von HTTP auf HTTPS umleiten möchte. Das Backend hat bei einer Anfrage vom Squid per HTTP ja keine Möglichkeit zu entscheiden, ob der Request nun ursprünglich HTTP oder HTTPS war und somit eine Umleitung erforderlich ist. Man könnte das zwar umgehen indem man Header hinzufügt oder ähnliches, aber so schön finde ich das nicht.
Das Problem der Rewrites ist, das für größere Installationen performant hinzubekommen.