PHP auf Webserver optimieren

themonk

New Member
Hallo,
ich möchte gerne meinen Webserver hinsichtlich der PHP Interpretation optimieren.
Für den Test habe ich folgendes PHP Skript verwendet:
PHP:
for ($i=0 ; $i<200000 ; $i++) {
	serialize($list);
}
Bei einem Webhosting Paket benötigt dieses Skript ca. 0.148 ms auf dem vServer 0.25257 ms also fast doppelt solange.
Auf beiden Servern ist FastCGI eingestellt. Wenn ich mir beim vServer mit htop die Auslastung anzeige ist bei der CPU und Ram kaum eine Veränderung zu sehen. Denke daher das es nicht an der Hardware liegen kann.
Hab auch noch versucht weitere Einstellungen vorzunehmen aber die zeigen alle keine Änderung.
So brachte selbst FastCGI bei diesem Skript keine Änderung und auch memcache bringt nichts.
Gibt es vielleicht noch weitere Einstellungen die ich vornehmen kann um das Skript zu beschleunigen oder hat es vielleicht andere Ursachen?
Auf dem vServer läuft übrigens Ubuntu mit PHP 5.5 und beim Webhosting Paket Debian mit PHP 5.3.
 
Die Laufzeiten sind so gering, dass da so ziemliches alles rein spielen könnte.
Erhöh die Anzahl der Schleifendurchläufe doch mal drastisch. Damit man da auch mal Zeiten im mehreren Sekundenbereich hat.
Dann wirst du vielleicht auch mal Unterschiede in der CPU Auslastung feststellen.
 
Habs auf 2 Mio. (2000000) erhöht.
Der vServer benötigt jetzt ca. 2.6189s und der "Webhosting" Server ca.1.2160s.
Die CPU Auslastung ist jetzt überwiegend beim Durchlauf bei 100%.
 
Last edited by a moderator:
Darfst du auf dem Webhosting Account via PHP /proc/cpuinfo auslesen? Ggfl. halt auch via SSH falls der Account darüber verfügt.
Dann vergleich doch einfach mal die CPU Daten von vServer und Webhosting. ;)
 
Hab leider keine Berechtigungen dazu und SSH Zugriff habe ich auch nicht.
Denke aber das die CPU Leistungsstärker ist. Kann mir nur sys_getloadavg() anzeigen lassen.

Habe jetzt auch mal auf beiden Servern den Apache Benchmark ausgeführt:
ab -n 10 -c 2 http://domain.de/

Time taken for tests:
vServer: 6.593 seconds
Webhosting: 2.257 seconds

Requests per second:
vServer: 1.52 [#/sec]
Webhosting: 4.43 [#/sec]

Time per request:
vServer: 1318.650 [ms]
Webhosting: 451.307 [ms]

Connection Times (ms)
vServer:
min mean[+/-sd] median max
Connect: 35 37 1.4 37 39
Processing: 940 1280 275.0 1396 1646
Waiting: 854 1190 277.2 1304 1558
Total: 978 1317 275.3 1433 1685

Webhosting:
min mean[+/-sd] median max
Connect: 25 28 1.9 27 31
Processing: 261 419 102.0 463 538
Waiting: 146 285 102.4 346 401
Total: 291 446 101.0 489 564


Vielleicht könnt Ihr mit diesen Werten noch Empfehlung geben.
 
Najo zaubern können wir leider auch nicht. Wenn der vServer leistungsschwächer ist als das Webhosting, dann wirst du da nie die gleiche Performance rausholen.
Je nach Webanwendung kannst du eventuell noch ein bisschen was mit Opcode Caches wie XCache oder eAccelerator rausholen (zusätzliche PHP Module). Die sind allerdings bei PHP via (F)CGI nur bedingt wirkungsvoll. Deren Vorteile kommen bei (F)CGI eher nur bei sehr frequentierten Setups zum tragen. Bei kleinen Setups merkt man die eher nur in Kombination mit mod_php, dessen Einsatz sehr stark vom restlichen System (kein Multiuserbetrieb) abhängt.

Alternativ kannst du einen Cache davor hängen und die generierten PHP-Outputs dort zwischenlagern. Funktioniert natürlich ebenfalls nur halbwegs sinnvoll, wenn man PHP-Content hat, der sich sehr selten ändert. ;)
 
Mal anders gefragt: Ist diese Art von "Test" überhaupt in irgendeiner Art und Weise aussagekräftig? Für den normalen Hostingbetrieb sehe ich in dem Test jedenfalls keine große Praxisrelevanz...
 
Demnach kann ich wohl nicht mehr viel aus dem Server rausholen. Dann würde ich mich bei einem Wechsel eigendlich verschlechtern, da es mir vorallem um die Performance der Webseite ging.
Kann man an irgendwelchen Werten festmachen woran es liegt? Also ist es nur die CPU und worauf sollte man bei einem Webserver achten?
Jetzt ist im Server ein Intel(R) Xeon(R) CPU L5630 @ 2.13GHz
 
Dafür müsste man erst mal wissen, wo es denn an der Performance mangelt - es ist ein großer Unterschied, ob Du ein ISO-Downloadportal betrieben willst oder z.B. sowas wie Piwik für ein paar Mio User oder einfach nur 50 WordPress-Insstanzen hosten willst.

Vielleicht hast Du ja auch gar kein Webserver sondern ein DB-Problem? Oder IO auf der HD? Oder die Anbindung ist suboptimal?
 
Auf dem Webserver werden viele Daten aus der Datenbank geladen. Denke das es am ehesten einem Forum ähnelt.
Beim Aufruf der Seite zeigt htop eine CPU Auslastung von 100% an. Wobei mysqld auf bis zu 90% ansteigt.
 
Ähm Moment. Dein "Benchmark" aus dem ersten Beitrag hat überhaupt nichts mit MySQL zu tun. Woher soll denn da nun bitte plötzlich die MySQL Auslastung kommen.
Wenn du hier mit Äpfeln wirfst, kannst du nicht von uns verlangen, dass wir dir sagen wie groß die Birnen sind.

Edit:
Als ich von der CPU Auslastung sprach, bezog sich das selbstverständlich auf deinen Mini-Benchmark und somit auf die konkrete CPU-Auslastung durch den spezifischen PHP-Prozess. Aber anscheinend hast du ja alles durcheinander geworfen.
 
Last edited by a moderator:
Ein klassischer Fall des Missverständnisses, dass ein VServer leistungsfähiger wäre als ein optimierter Webspace. Nein, ist er nicht.

Eine virtuelle Maschine, die all ihre Ressourcen mit vielen weiteren VMs teilen muss, kann nicht mehr Performance liefern als ein optimierter Webserver-Cluster kombiniert mit einem optimierten Datenbankcluster und einem Storage-Network als Backend.

Der Vorteil von VServern liegt in der Freiheit für den Benutzer, nicht in der Performance.
 
Die Angaben zur Datenbank bezogen sich auf den Beitrag von marce und haben eigendlich nichts mit dem vorherigen Tests zu tun.

Wie ich deinem Beitrag entnommen habe könnte ich die PHP Skript nur durch Cache verbessern.
 
Wenn in deinem Real-World Scenario plötzlich auch der MySQLd am Anschlag läuft, gibt es durchaus weitere Stellschrauben.
Ist ja nun auch die Frage, was willst du eigentlich erreichen? Soll es (was überhaupt?) auf dem vServer nur halbwegs sinnvoll laufen oder willst du tatsächlich auf etwas performanteres als das Webhosting hinaus?
 
Was verstehst du unter halbwegs sinnvoll?
Also wechseln möchte ich, da mir die Antwortzeiten beim Webhosting, vor allem zu Lastzeiten, zu langsam waren. Daher möchte ich auf etwas performanteres heraus. Da der vServer schon jetzt beim testen langsamer ist, scheint der Plan wohl nicht ganz aufzugehen. Wenn dann noch ein paar Request hinzukommen wird er wahrscheinlich noch deutlich langsamer.

Daher war eigentlich meine Frage, ob man außerdem FastCGI noch weiteres vornehmen kann bzw. worauf man bei einem vServer der als Webserver genutzt werden soll achten soll.
 
Code:
for ($i=0 ; $i<200000 ; $i++) {
    serialize($list);
}

Typisches Missverständnis von Optimierungsbedarf. Du testest hier genau was? Das serialisieren von der Variable list, die genau was beinhaltet? Dieses Testszenario geht an der Realität vorbei. Du läufst eine Schleife durch, die 20.000 mal oder mehr die gleiche Funktion auf die gleiche Variable anwendet. Wahrscheinlich findet auch noch eine dynmaische Optimieurng des Interpreters zur Laufzeit statt, was die Messergebnisse nochmals verfälscht.

Du gehst die Sache völlig falsch herum an. Im Endeffekt spielt die Optimierung von Funktionsaufrufen der Sprache primär keine Rolle. Alles was du am Ende machst, hat mit IO zu tun und diese Operationen sind zu minimieren. Im Web hat so ziemlich alles mit IO zu tun. Sei es die Abfrage einer DB oder das Senden der Seite. D.h. wenn du einer Schleife 20.000 mal eine DB-Abfrage machst, machst du grundsätzlich etwas falsch. Die Sprache SQL bietet nicht ohne Grund so komplexe Abfragemechanismen, damit du diese dann in Sprache XY einfach ersetzt. Es geht darum eine einzige Abfrage zu machen, die dir weitestgehend ein aufbereitetes Ergebnis liefert und damit kannst du dann weiterarbeiten. Der DB-Server ist so entwickelt worden, dass er solche komplizierten Abfragen effizient verarbeiten kann. 20.000 Datensätze abzufragen, um dann in PHP nach einer Spalte zu sortieren ist so ziemlich die größte Verschwendung, die man machen kann. Der DB-Server liefert dir dann alles 20.000 Datensätze, der Interpreter füllt den Speicher bis er überläuft und dann soll der Interpreter auch noch mit der Liste irgendwas machen. Das ist so ziemlich der Fehler schlechthin, der in der Webprogrammierung gemacht wird. Sobald du innerhalb einer Schleife eine DB-Abfrage machst oder etwas einer DB-Abfrage filterst oder sortierst, solltest du dich fragen, ob die DB das nicht für dich schon machen kann.

Erst wenn du komplizierte Algorithmen mit vielen Rechenoperationen hast, kannst du dir einen besseren Algorithmus ausdenken, was nicht immer einfach ist. Anzufangen den Interpreter zu optimieren, ist der allerletzte Schritt. Sobald du damit anfängst, musst du genau wissen wie der Interpreter arbeitet, wie die dynamsichen Typen z.B. funktionieren usw. D.h. du musst nicht nur die Sprache kennen, sondern auch wissen wie Datentypen gebildet werden, Operationen funktionieren, die Funktionen arbeiten, wie Klassen aufgebaut sind, ob ein Hashing bei bestimmten Datentypen stattfindet uvm. Wenn du dieses Wissen hast, ist eine Optimierung meist überflüssig, da du dann genau diese langsameren Techniken verhinderst und die effizienteren nimmst. Darum geht es im Endeffekt, die Vorzüge einer Sprache zu nutzen und die Eigenheiten der Sprache bzw. Implementierung der Sprache zu kennen.
 
Last edited by a moderator:
"Langsame Antwortzeiten" laufen immer auf das Gesamt-Konstrukt hinaus - sprich Du musst auch alle beteiligten Komponenten entsprechend anpassen und optimieren. Ggf. auch über einen komplexen und langwierigen Debugging-Prozess und der Anwendung selbst.

Nur den Webserver zu "optimeren" (und dann auch noch über einen Test, der mit der Realität recht wenig bis gar nichts zu tun hat) bringt erst mal so rein gar nichts.

Ansonsten - es kann auch gut sein, daß bei Deinem Hostingpaket vom Anbieter schon entsprechende Optimierungen drin sind wie OpCode-Cache und ähnliches - du aber ggf. davon gar nichts mitbekommst.
 
Was verstehst du unter halbwegs sinnvoll?

Die Frage musst du selbst beantworten. Ist schließlich deine Website mit deinen Anforderungen und Erwartungen. ;)

@DeaD_EyE
Du hast zwar grundsätzlich recht, allerdings sind die Optimierungsspielräume in diesem Bereich ziemlich gering, wenn man fertige CMS einsetzt. Und das ist "leider" meistens der Fall.
 
Ja ok, in diesem Fall sollte man ein CMS nutzen, was vernünftig programmiert ist *duckundweg*
 
Das ich noch Optimierung an SQL-Befehlen und am Code vornehmen ist mir klar.
Aber worum es mir eigentlich ging ist, das auf 2 Servern der gleiche Code unterschiedlich lange benötigt bis dieser fertig ist. Der Code ist auf beiden Systemen gleich gut/schlecht.
Erhofft habe ich mir mit diesem Thema, dass vielleicht noch eine wichtige Einstellung am Webserver vorgenommen werden muss damit dieser zumindest genauso schnell antwortet wie beim Hostingpaket. Oder eine Aussage darüber, ob der vServer vielleicht zu schlecht ist.
 
Back
Top