Hallo Reiner!
ich tüftel gerade an etwas, was eine sehr kurze Antwortzeit des Servers erfordert. Ziel ist es, bei einer dynamischen Anwendung ähnliche Antwortzeiten wie bei stat. Contens hinzubekommen.
Das kannst Du wohl vergessen ;-)
Ich denke das effizienteste wäre Deine Anforderung in einem eigenen Server-Modul zu implementieren.
Dabei bin ich jetzt so weit, daß ich mir zunächst einmal angesehen habe, welche Antwortzeiten bzw. Latencen ich bei statischem Content habe. Ich komme bei einem Apache2 auf ziemlich genau 30 Requests/Sekunde. Das ist schonmal gut.
Naja... ich würde mir bei Deiner Anforderung ernsthaft überlegen, von Apache abzusehen. Ich selbst würde es auf jeden Fall mit lighttpd versuchen, der ist vor allem bei statischem Content dem Apachen um Längen überlegen. Weitere Vorteile sind eben die besonders einfache Einbindung von FastCGI (das ist beim Apachen wirklich deutlich komplizierter), und nicht zuletzt die einfachere API für eigene Module.
Zudem habe ich mal probehalber ein Script geschrieben, was Content einmal per perl und einmal per php ausliefert. Dabei wird eine Schleife durchlaufen, die rel. groß ist.
Ich bin mir sicher, daß das vielleicht nicht direkt vergleichbar ist, aber bei mir kam heraus, daß perl ca. 3mal schneller als php ist.
Beides CGI? Ist zwar ungewöhnlich in dem Ausmaß, aber solche synthetischen Benchmarks sagen ja auch nicht wirklich viel aus. Wäre mal interesant den jeweiligen Code zu sehen.
Nächster Flaschenhals (und darauf bezieht sich meine eigentliche Frage) wäre, daß das Script bei jedem Aufruf neu geladen wird, was sicher auch Zeit kostet.
Gut, bei mod_php und mod_perl hast Du ja wenigstens schonmal das Laden des Interpreters bei jedem Request gespart, bei PHP kannst Du das Laden des Scriptes mit Opcode-Caches wie eAccelerator, oder auch PECL::APC (letzteres installiert man gaz simpel per pear install APC
in der shell) cachen. Hierbei werden Scripte in Form von ausführbaren Opcodes im RAM gecached. Das bringt allerdings erst was, wenn Du viel Code und viele eingebundene Scripte hast.
Die Idee wäre also, den Kram einfach im Speicher zu halten.
Da ich damit noch nie beschäftigt habe, wollte ich gerne wissen, ob es irgendwo ein gutes Beispiel gibt, wo sowas mal erklärt wird:
Ein Script öffnet eine DB-Verbindung und spuckt die Daten auf Anforderung aus, d.h. das sollte mit FCGI funktionieren.
Mit einiger Sicherheit deutlich effizienter mit einem eigenen Server-Modul. Du kannst auch Datenstrukturen per memcached im RAM halten, falls es Dir was bringt.
Ich habe mir zwar schon einige Dinge angesehen, was man dazu alles braucht, aber ich habe nicht wirklich verstanden, was ich da beim Apache2 machen muß und wie das Script initiert wird. Durch den Start des Apache?
Vielleicht hilft Dir folgendes Howto: http://www.debianhowto.de/howtos/de/apache2-phpfcgi-sarge/, allerdings wird hier fcgi in den Scripten so verwendet wie cgi, außer dass die Prozesse halt bestehen bleiben. Aber wie gesagt, ich würde es so oder so eher mit lighttpd versuchen, da ist das deutlich einfacher. Da kannst Du entweder die Prozesse durch die Server-Config starten, oder durch ein externes Script, siehe oben verlinkte Doku.
Und nochwas: Muß ich bei einer persistenten Verbindung zu MySQL irgendwas beachten, damit die Verbindung möglichst gehalten wird (Stunden, Tage)??
ich wüßte nicht warum die Verbindung beendet werden soll, oder?
Vielleicht sowas beachten:
interactive_timeout
The number of seconds the server waits for activity on an interactive connection before closing it. An interactive client is defined as a client that uses the CLIENT_INTERACTIVE option to mysql_real_connect(). See also wait_timeout.
Habt Ihr Erfahrungen, was wirklich Geschwindigkeit bringt?
Lighttpd, ein Server-Modul, Caching :-)
Gibt es noch irgendwelche verborgenen Tricks bei Server, die man ausreizen könnte? Sind die 30 Requests/Sek. noch zu steigern?
Guck Dir die Benchmarks an: http://www.lighttpd.net/benchmark/
Ich habe einen P4 mit 3GHz und 2GB Speicher.
die dort verwendeten Systeme sind langsamer.
Keine Ahnung was Du bisher optimiert hast. Wenn es denn Apache sein muss, und Du kein Server-Modul verwendest, dann das Worker-MPM verwenden, alle Module raus die Du nicht brauchst, evtl. keep-alive nutzen wenn sinnvoll, vielleicht noch lingerd... aber es ist schwer zu sagen wenn man das exakte Szenario nicht kennt. Was ist mit HTTP-Caching? Vermutlich nicht möglich, oder? Entsprechend wohl auch kein Reverse-Proxy, oder? Naja, dann sollte man Webserver-Module statisch einbinden, gut optimierte compiler-flags verwenden... und was man halt noch so machen kann auf OS-Level.
siehe auch:
Grüße
Andreas