Performance-Steigerung durch Auslagern von Bildern?

mgutt

New Member
Hallo!

Ich verwalte einige größere Projekte und bin schon öfter über die Tatsache gestolpert, dass viele Seitenbetreiber ihre Bilder vollständig auslagern (gemeint sind auch Navigationselemente, Icons, etc.).

Beispielsweise lagert Youtube alle Bilder auf ytimg.com aus.

Die Frage ist nun, was könnte ich mir von so einer Änderung versprechen? Steigert es die Ausgabezeit einer Website? Oder kommt der Performance-Gewinn nur dadurch, dass man statt einem nun zwei Server im Einsatz hat und es daher eigentlich nur eine Augenwischerei ist?

Gruß
Marc
 
Du erhältst mit Sicherheit einen Perfomancegewinn, aber auch nur deshalb, weil zwei Server für die selbe Ausgabe arbeiten.
Es werden einfach nicht mehr so viele Requests gleichzeitig an einen Server gestellt. Diese werden ja auf zwei aufgeteilt. So braucht eine Anfrage für eine Website wesentlich weniger Performance.

Das Problem ist jedoch, dass wenn du eine Seite mit Beispielsweise einer HTML-Ausgabe hast und vier JavaScripts, und dann kommen da noch 20 Grafiken dazu, dann wäre eher die Frage, ob man die Grafiken auf zwei Server aufteilt, wenn man wirklich eine Performanceverbesserung erreichen möchte. Denn die größere Last sind die 20 Grafiken.

Die Frage die ich mir eher stellen würde ist, ob man vielleicht noch was mit Mysql und Apache Tuning erreichen könnte.
 
Hallo!
Es gibt einige, die einen alternativen Webserver wie beispielsweise nginx oder lighttp auf die Auslieferung von statischen Objekten tunen. Oftmals gibt es dann die Verkettung von Loadbalancer, Caching Webproxies und Serverfarmen auf denen der eigentliche Content liegt.

Das Ganze kann man dann soweit treiben, dass es verschiedene Serverfarmen pro Kontinent oder Region gibt (Stichwort CDN).

mfG
Thorsten
 
@ Mordor
Mein Cache Verzeichnis ist mit einigen tausend Dateien gefüllt. So viel zum Thema MySQL-Tuning ;)

Ich bin sogar so krank, dass ich Views auf Topics nur per Zufall hochzähle, um immerhin 66% der UPDATEs einzusparen :P

Es werden einfach nicht mehr so viele Requests gleichzeitig an einen Server gestellt. Diese werden ja auf zwei aufgeteilt. So braucht eine Anfrage für eine Website wesentlich weniger Performance.
Das meinte ich mit Augenwischerei. Zwei Server kann ich mir immer hinstellen. z.B. DB auf einen zweiten Server auslagern.

@ Thorsten
Also Du glaubst, dass die Server auf das jeweilige Objekt (Bilder, HTML-Seiten, etc.) hin speziell getuned wurden und dadurch der Performance-Gewinn kommt?

Demnach würden zwei identische Server mit absolut identischen Einstellungen also nichts bringen, man müsste sie schon auf ihren Einsatz-Zweck hin optimieren...
 
Hallo!
Es werden verschiedene Maßnahmen ergriffen um die Auslieferung der Objekte an den Client zu beschleunigen. Einfach einen zweiten Server aufstellen ist ja nur die halbe Miete. Hinzu kommen Dinge wie Lastverteilung und Geografische Optimierung. Und ganz sicher optimiert Google / YouTube die einzelnen Webserver auf den jeweiligen Einsatzzweck.

Siehe auch:
Google Server Names List
Google platform - Wikipedia, the free encyclopedia

mfG
Thorsten
 
Die Frage ist nun, was könnte ich mir von so einer Änderung versprechen? Steigert es die Ausgabezeit einer Website? Oder kommt der Performance-Gewinn nur dadurch, dass man statt einem nun zwei Server im Einsatz hat und es daher eigentlich nur eine Augenwischerei ist?
http://developer.yahoo.com/performance/rules.html
http://www.codinghorror.com/blog/archives/000932.html

Lies beide Artikel und bilde dir eine eigene Meinung. Es sind auf jeden Fall einige gute Anregungen dabei.
 
Im ersten Artikel steht z.B. das:
Reducing the number of unique hostnames has the potential to reduce the amount of parallel downloading that takes place in the page. Avoiding DNS lookups cuts response times, but reducing parallel downloads may increase response times. My guideline is to split these components across at least two but no more than four hostnames. This results in a good compromise between reducing DNS lookups and allowing a high degree of parallel downloads.

Also hat ein externer Bilderserver den Vorteil, dass statt 2 Elementen (z.B. eine css-Datei und ein Bild) nun 4 Elemente (eine css-Datei, eine js-Datei und zwei Bilder) parallel geladen werden können. Gleichzeitig hat man den Nachteil, dass der Nutzer die zweite Domain erst auflösen muss.

Das Problem bekommt man simpel in den Griff, in dem man statt einer Domain, einfach direkt die IP des Servers verlinkt.

When the browser makes a request for a static image and sends cookies together with the request, the server doesn't have any use for those cookies. So they only create network traffic for no good reason. You should make sure static components are requested with cookie-free requests. Create a subdomain and host all your static components there.

If your domain is Example Web Page, you can host your static components on static.example.org. However, if you've already set cookies on the top-level domain example.org as opposed to Example Web Page, then all the requests to static.example.org will include those cookies. In this case, you can buy a whole new domain, host your static components there, and keep this domain cookie-free. Yahoo! uses yimg.com, YouTube uses ytimg.com, Amazon uses images-amazon.com and so on.
Ein weiterer Vorteil von einem Bilder-Server ist also, dass der Nutzer nicht ständig Cookies mitsendet, wenn er Bilder lädt.

Minification is the practice of removing unnecessary characters from code to reduce its size thereby improving load times. When code is minified all comments are removed, as well as unneeded white space characters (space, newline, and tab). In the case of JavaScript, this improves response time performance because the size of the downloaded file is reduced. Two popular tools for minifying JavaScript code are JSMin and YUI Compressor. The YUI compressor can also minify CSS.
Meine Template-Klasse komprimiert noch gar nicht (also schmeißt space, newline und tab nicht raus). Das werde ich noch umsetzen.

Zusätzlich habe ich gerade herausgefunden, dass ich trotz "ob_start('ob_gzhandler');" keine Komprimierung hatte. Daher habe ich folgendes der htaccess hinzugefügt:
Code:
<FilesMatch "\.(js|css|php)$">
    SetOutputFilter DEFLATE
</FilesMatch>

Wobei ich mir im Moment nicht sicher bin, ob das in der http.conf nicht besser wäre:
Code:
<Location />
  SetOutputFilter DEFLATE
  BrowserMatch ^Mozilla/4 gzip-only-text/html
  BrowserMatch ^Mozilla/4\\.0[678] no-gzip
  BrowserMatch \\bMSI[E] !no-gzip !gzip-only-text/html
  SetEnvIfNoCase Request_URI \\
    \\.(?:gif|jpe?g|png)$ no-gzip dont-vary
  Header append Vary User-Agent env=!dont-vary
</Location>

Nur da irritiert mich die Tatsache, dass nur drei Bildtypen von der Komprimierung ausgenommen werden. Wenn ich so überlege welche Dateitypen bei mir so erlaubt sind, dann frage ich mich, ob es nicht wie beim htaccess Code mehr Sinn mach zu erlauben, statt zu verbieten (wenn ich wüsste wie das geht :P).

Gruß
 
Das Problem bekommt man simpel in den Griff, in dem man statt einer Domain, einfach direkt die IP des Servers verlinkt.
Nein, das will man nicht. Die Lookups sind auch weniger ein Problem für den Betreiber, weil die DNS-Infrastruktur sehr gut in Sachen Verteilung und Caching ist.
 
Ja, z.B. bei einem Server Umzug oder Ausfall. Ein DNS-Eintrag ist leichter umgeschrieben als der Code wo überall die IP drin steht. Und das Ergebnis wird vom Client eh zwischengespeichert.

Du hast oben viele Dinge genannt, die zwar Bytes einsparen auf dem Weg Server->Client. Aber immer zu Lasten des Servers. D.h. Du erhöhst die Server-Last um einen evtl. gegebenen Flaschenhals "Netzwerk" zu entlasten.
Vor solchen Maßnahmen solltest Du erstmal prüfen, ob der Flaschenhals wirklich existiert.

Des weitere schau Dir mal mod_expire an. Damit kannst Du die Lebzeiten von Grafiken/CSS/JS-Dateien im Proxy-/Client-Cache erhöhen. So können recht schnell einige HEAD oder GET weniger anfallen.

Weiter Optimierungen wären z.B. den Apache und MySQL besser einzustellen oder evtl. Lighttpd ein zusetzten.

Vor solchen Überlegungen/Optimierungen sollte man grundsätzlich erstmal prüfen, wo der Mangel wirklich ist. Dazu gehört eine ausführliche Logfile- und Auslastungs-Analyse. Ein blindes Drauflos kann die Sache nämlich auch verschlimmern.

huschi.
 
Man muss aber beachten, dass dann das eigene Projekt im Jahresmittel theoretisch doppelt so hoch ausfallen kann.

Angenommen bei einer theoretischen Serververfügbarkeit von 99,9 % im Jahresmitel:
365 Tage * 24h = 8760 Stunden * 0,01 = 8,7 Stunden
Da man ja nun 2 Server hat, wo die Wahrscheinlichkeit immer gegeben ist, dass da mal was an der Hardware kaputt geht, muss man diese Stundenzahl x 2 nehmen. Macht theoretisch 17,4 Stunden.
 
Ja, z.B. bei einem Server Umzug oder Ausfall. Ein DNS-Eintrag ist leichter umgeschrieben als der Code wo überall die IP drin steht. Und das Ergebnis wird vom Client eh zwischengespeichert.
Das kommt ganz drauf an, wie man den Code aufbaut. Ich würde in dem Fall bei der Generierung des Template-Caches die IMAGE-Urls replacen. Noch irgendwelche Gegenargumente :P

Du hast oben viele Dinge genannt, die zwar Bytes einsparen auf dem Weg Server->Client. Aber immer zu Lasten des Servers. D.h. Du erhöhst die Server-Last um einen evtl. gegebenen Flaschenhals "Netzwerk" zu entlasten.
Vor solchen Maßnahmen solltest Du erstmal prüfen, ob der Flaschenhals wirklich existiert.
Dafür brauche ich nicht großartig recherchieren. Nach Aktivierung der Komprimierung, wurde der Seitenaufbau um 20-30% (subjektiv) beschleunigt. Ich verstehe Deinen Einwand, aber 50% weniger Netzwerkauslastung müssen sich doch irgendwo wieder positiv auswirken. Die Frage ist, ob Apache eigentlich die komprimierten Seiten cached oder wirft der die immer nur on-the-fly aus?

Des weitere schau Dir mal mod_expire an. Damit kannst Du die Lebzeiten von Grafiken/CSS/JS-Dateien im Proxy-/Client-Cache erhöhen. So können recht schnell einige HEAD oder GET weniger anfallen.
Das habe ich in den Optimierungshinweisen auch gelesen und fand es sehr interessant. Leider hat das aber auch einen Nachteil. Man muss die Dateien umbenennen, sobald man sie aktualisiert. Ansonsten bekommt der Nutzer es erst ab dem Expire mit, dass was passiert ist. Bei CSS- und JS-Dateien ist das kein großartiges Problem, da zumeist wenige Zeilen betroffen sind, aber bei Grafiken mache ich mir da so meine Gedanken. Insbesondere weil Nutzer auch Grafiken hochladen können und evtl. Aktualisierungen problematisch sein würden.

Weiter Optimierungen wären z.B. den Apache und MySQL besser einzustellen oder evtl. Lighttpd ein zusetzten.
Das überlasse ich All-inkl.com, also meinem Anbieter. Ich verwalte alles auf Managed Servern. Demnach ist Apache nicht zu ersetzen und MySQL wird regelmäßig durch den Anbieter optimiert.

Aktuell denke ich aber wieder darüber nach mir das APC/PECL Modul installieren zu lassen. Ich hatte das vor 2 Jahren mal vor dem Umzug auf einen größeren Server installiert und habe damit sehr gute Erfahrungen gemacht.
EDIT: APC/PECL wollte nicht, daher wurde jetzt testweise XCache installiert. Subjektiv gesehen kann ich aber keinen Fortschritt erkennen.

Vor solchen Überlegungen/Optimierungen sollte man grundsätzlich erstmal prüfen, wo der Mangel wirklich ist. Dazu gehört eine ausführliche Logfile- und Auslastungs-Analyse. Ein blindes Drauflos kann die Sache nämlich auch verschlimmern.
Es mag noch Optimierungen auf der Server-Seite geben, aber die kann ich wie gesagt nicht beeinflussen. Ich selbst habe mich auf MySQL- und PHP-Optimierungen spezialisiert. Und MySQL-Abfragen machen einfach am meisten aus, daher versuche ich die möglichst zwischenzuspeichern.

Und gegen Verschlimmbesserungen habe ich grundlegend nichts, solange ich sie wieder rückgängig machen kann. Ich probiere gerne einfach mal aus und schaue dann was das Monitoring nach 2-3 Tagen resultiert. Und langfristig nehme ich mir die Werte von den Google Crawling Statistiken (Webmaster Tools). Da bin ich aktuell noch bei über 1 Sekunden pro Seite. Das will ich langfristig auf 500 Millisekunden reduzieren.

Eine der Seiten, um die es geht, falls es jemanden interessiert: Honda Forum & Tuning - Accord, Civic, CRX, Jazz, S2000 - MaXReV
 
Last edited by a moderator:
Ich verwalte alles auf Managed Servern. Demnach ist Apache nicht zu ersetzen und MySQL wird regelmäßig durch den Anbieter optimiert.
Das halte ich für ein Gerücht. Denn "Optimieren" in SQL ist ungleich "Optimierung der MySQL-Performance".
Letzteres kannst Du Dir mal MySQL-Tuning - huschi.net anschauen.
Und für Apache-Tuning: Hochleistungs-Apache: Performance-Tuning - huschi.net
Weitere Tuning-Tipps: Apache-Optimierung auf HTTP-Ebene - huschi.net

Wenn Dein Hoster das tatsächlich macht, ist er teuer genug, als dass Du Dir auch einen Loadbalanced-System leisten kannst. ;)

Noch zu Deiner Frage:
Die Frage ist, ob Apache eigentlich die komprimierten Seiten cached oder wirft der die immer nur on-the-fly aus?
Apache komprimiert on-the-fly. Genau das ist ja der genannte Performance-Fresser.

huschi.
 
Das halte ich für ein Gerücht. Denn "Optimieren" in SQL ist ungleich "Optimierung der MySQL-Performance".
Ich habe den Unterschied zwischen MySQL-Abfragen zu optimieren (meine Aufgabe) und die Optimierung des MySQL-Prozesses schon verstanden (Aufgabe meines Anbieters).


Die ersten beiden Links sind Bereiche in denen ich nicht eingreifen kann/will, der letzte betrifft das Caching, was wir ja bereits erwähnten und was ich auch noch umsetzen werde.

Das halte ich für ein Gerücht.
Der Anbieter hat bereits mehrmals Hand angelegt, wenn ich um eine Optimierung gebeten habe. Natürlich könnte ich jetzt fragen, in wie weit der Apache bzw. MySQL optimiert wurde, aber das liegt einfach nicht in meinem Bereich und mehr als "Aha" könnte ich dazu auch nicht sagen :P

Der Anbieter ist für die Sicherheit, Updates und Umgebung zuständig. Dafür bezahle ich ihn und ich bin mit der Leistung mehr als zufrieden.

Loadbalanced-System
Falls das eine Frage sein sollte: Ja ich kann mir eines leisten (schau dir die Preise von den Servern meines Anbieters an ;)). Doch es ist noch nicht nötig. Erster Schritt ist die Auslagerung der DB, zweiter Schritt die Auslagerung von Dateianhängen, dritter Schritt die Auslagerung von Grafiken / CSS / JS. Erst danach kann ich über einen Loadbalancer nachdenken, weil ich dann auch weiß welche Gruppe überhaupt ein Balancing benötigt. Aktuell fährt das System noch sehr gut. Ich bin nur eben nicht mit 1 Sekunde Ladezeit im Schnitt zufrieden (nur HTML). Andere schaffen Zeiten von 300 und 500 ms und da will ich auch hin.

Apache komprimiert on-the-fly
Das ist schade, wobei es denke ich logisch ist, da sich die Inhalte ja ständig ändern. Statische Seiten habe ich keine, daher bleibt mir nur der Weg mit expires Headern zu arbeiten. Aber wie gesagt kann ich ganz pauschal sagen, dass die Komprimierung eine Must-Have war, wenn ich den subjektiven Effekt daraus bewerte.

xCache verspricht aktuell ähnliche Resultate. Heute waren die Auslastungskurven vorbildlich. Mal sehen was die nächste Woche bringt. Ich geb dann dazu noch mal Feedback.

Aktuell habe ich in den 30 meist aufgerufenen Seiten:
2 css-Dateien (1 wegrationalisiert und die andere komprimiert bzw. durch expires hoffentlich auch weg)
5 js-Dateien (expires)
1 ico-Datei (expires)
1 txt-Datei (expires)
Rest php-Dateien

Meine htaccess:
Code:
# expires in 2010
<FilesMatch "\.(js|css)$">
	Header set Expires "Thu, 15 Apr 2010 20:00:00 GMT"
</FilesMatch>
# expires in 14 days (robots.txt, favicon.ico)
<FilesMatch "\.(txt|ico)$">
	Header set Cache-Control "max-age=1209600, public, must-revalidate"
</FilesMatch>
 
Last edited by a moderator:
Der Anbieter hat bereits mehrmals Hand angelegt, wenn ich um eine Optimierung gebeten habe. Natürlich könnte ich jetzt fragen, in wie weit der Apache bzw. MySQL optimiert wurde
Dann tue das mal. Denn mit "Handauflegen" ist es nicht getan. I.d.R. kann man mind. 50% Leistungssteigerung rausholen, wenn man von den std.-Werten abweicht und seinen Server an das Projekt anpasst.
Ich habe oben glatt einen wichtigen Artikel vergessen: Tuning: Server beobachten - huschi.net
Evtl. verstehst Du jetzt meine Bedenken gegen die Aussage "mein Provider macht das".

Meine htaccess:
Im o.g. Apache-Tuning-Link steht, warum eine htaccess eine Performance-Falle ist.
Denn sie wird bei jedem Request neu gelesen und ausgewertet. Allein hier gehen wichtige Millisekunden flöten. Das Zeug gehört fest in die Apache-Config zu dem VirtualHost zusammen mit einem "AllowOverride none", damit Apache erst gar keine Zeit auf der Suche nach einer htaccess verschwendet.

Und das ist nur ein Beispiel für richtige Server-Optimierung. ;)

huschi.
 
Evtl. verstehst Du jetzt meine Bedenken gegen die Aussage "mein Provider macht das".
Ja klar, da sitzt keiner, der meinen Server ne Stunde am Tag beobachtet, um mal was zu optimieren. Es ist eher die deutsche Art: Mach erst was, wenn sich jemand beschwert oder was kaputt ist :D

Im o.g. Apache-Tuning-Link steht, warum eine htaccess eine Performance-Falle ist.
Das ist tatsächlich ein Komfortproblem und das Problem, dass ich die Zeilen nicht testen kann. Ich würde sie per Email an die Technik weiterleiten, sie bauen es dann innerhalb von 2 Std. ein und ich sehe dann erst was passiert bzw. nicht passiert. Ein ewiges hin und her und wenn ich bedenke, dass viele Ordner eigene htaccess Dateien besitzen, dann ist das nicht mehr lustig. Und ich ändere nicht gerade selten etwas.

Dieser Punkt ist also leider unflexibel, wenn natürlich nicht unmöglich.

Als Beobachtungsmittel stehen mir ein Auslastungs- und Traffic-Monitoring zur Verfügung, ein HTTP Apache Status, die MySQL-Prozess-Übersicht aus phpMyAdmin, Logfiles und eigene Logs, die ich über PHP realisieren kann (z.B. Arbeitsspeicherauslastung pro Script, Anzahl der Queries, Ausführungszeiten, etc.) und eben die Google Crawl Stats.

EDIT:
Laut ieHTTPHeaders dauert die Übertragung einer Seite nur noch 300-450ms. Ich denke man kann damit durchaus zufrieden sein :)
 
Last edited by a moderator:
Das erste Ergebnis der Google Crawl-Statistik begeistert:
chart.png


Aktuell sind es ca. 600ms pro Seitenaufruf. Eine andere Domain auf dem gleichen Projekt resultierte sogar 360ms, also denke ich mal, dass das noch besser wird.

Was ich noch nicht verstanden habe ist pragma oder cache-control. Bei expires und max-age habe ich das bei w3.org gefunden:
If a response includes both an Expires header and a max-age directive, the max-age directive overrides the Expires header, even if the Expires header is more restrictive.

Also der max-age überschreibt die expires-Angabe, sofern der Browser sich an den Standard hält und man beide Angaben übergeben hat.

Aber was genau macht der jeweilige Rest?

Ich habe das in meinem header umgesetzt:
Code:
if (!$user->data['session_is_bot'] || strpos($_SERVER['HTTP_USER_AGENT'], 'Google') !== false) { 
	header('Cache-Control: private, pre-check=0, post-check=0, max-age=0');
	header('Expires: 0');
	header('Pragma: no-cache');
}
else {
	// w3.org: "If a response includes both an Expires header and a max-age directive, the max-age
	// directive overrides the Expires header, even if the Expires header is more restrictive."
	header('Expires: ' . date('D, d M Y H:i:s GMT', time()+1206600)); 
	header('Cache-Control: max-age=1206600'); 
}

Da ich alle anderen Bots, außer dem Google Bot als unwichtig einstufe, gebe ich denen ebenfalls ein expires bzw. max-age aus.

Als ich noch diese Zeile hatte...
Code:
header('Cache-Control: no-cache, pre-check=0, post-check=0');

... also statt "private" das "no-cache", war es so, dass die Seiten ständig neu geladen wurden (Internet Explorer) und Seiten die per POST angesteuert wurden nicht einfach nur eine weiße Seite resultieren, sobald man im Browser auf zurück ging.

Also "private" sorgt dafür, dass die Seite im Zwischenspeicher des Browsers verweilen darf, während "no-cache" das entsprechende Gegenteil darstellt. Und was genau ist pre-check, post-check und pragma: no-cache?

Für mich klingt "Cache-Control: private" und "Pragma: no-cache" etwas widersprüchlich?!
 
Last edited by a moderator:
Back
Top