Rubrik: Programmierung

Skalierung einer PHP Applikation

Die Kosmonauten, mit denen ich zu Beginn meiner Freelancer-Zeit schon einmal zusammen gearbeitet habe, kontaktierten mich zu Beginn des letzten Wochenendes mit der eiligen Bitte, mir die Performance einer von ihnen entwickelten Partyseite einmal genauer anzuschauen.

Der Grund war, dass die frisch gelaunchte Seite Eraffe.de ab einer Last von 250 Usern die gleichzeitig online waren, extrem langsam wurde bzw. den Server fast komplett lahm legte. Die Seite ist in PHP mit Mysql Anbindung umgesetzt und lief auf Mysql 5.0 und einem Apache 2.2 mit PHP 5.2. Zugrunde lag eine Datenbank mit Daten von ca. 15.000 Usern.

Da sowohl die Entwickler als auch das Team der Community davon ausgingen, dass das Problem mit einer Erweiterung der Server Architektur relativ einfach zu lösen war, waren zum Zeitpunkt meiner Beratung schon neue Server unterwegs. So konnten wir über 4 zusätzliche leistungsstarke Server verfügen, von denen drei als Appserver (Apache 2.2, PHP 5.2) und einer als reiner DB-Server vorgesehen waren.

Meine Arbeit bestand darin, den Entwickler sowie den Serveradmin der Kosmonauten zu beraten und teilweise helfend in die Programmierung einzugreifen. Erste Anhaltspunkte waren die per Skript gemessenen Parsezeiten von einzelnen Programmteilen und die hohe CPU Last die Mysql zog.

Nachdem ich den Code kurz überflogen hatte um mir einen Überblick zu verschaffen begannen wir damit,eine Kopie der Seite auf einen externen Server zu legen. Dieser war noch etwas leistungsschwacher, aber durchaus geeignet um die Anwendung zu Testzwecken darauf laufen zu lassen. Auf dem Liveserver war dies nicht möglich, da sich auch Nachts noch eine größere Anzahl Benutzer darauf befand.

Server Software: Als ersten Schritt wechselten wir von Apache 2.2 auf den weniger speicherintensiven Lighttpd und die neusten Mysql/PHP Versionen sofern noch nicht aktuell. Zudem wurde auf PHP-Ebene Opcode-Caching durch APC aktiviert.

Code Profiling: Um den Flaschenhals im Skript zu finden, nutzten wir zunächst die PHP Extension Xdebug. Xdebug wird einfach auf dem Server installiert und man kann per Profiler genau sehen, wo sich der oder die Flaschenhälse im PHP Teil der Anwendung befinden. Xdebug benötigt auch noch zusätzliche Serverressourcen, deshalb sollte man ihn nicht ständig laufen lassen. Ist aber auch gar nicht nötig, da man innerhalb kürzester Zeit große Datenmengen zum Profiling erhält. Diese Daten können dann mit WinCacheGrind oder KCacheGrind (KDE) analysiert werden und zeigen bis zur letzten ausgeführten Funktion genaue Daten zur Parsezeit und Speicherintensität an.

Query Analyse: Das Profiling ergab, dass sich unser Flaschenhals bei den Mysql Queries befand. Um die langsamen Queries rauszufiltern kann man am Mysql Server das Slow Query Log aktivieren.

Daraus ergab sich, dass bei unserer Anwendung die Queries zur Auslese der sich auf der Seite befindlichen User (das typische Onlineuser Skript) sowie einige Schreibbefehle (sowohl INSERT als auch UPDATE) mit mehreren Datumsfunktionen die langsamsten waren.

Bei fast allen Queries lies sich noch einiges optimieren, dennoch blieb die Anwendung langsam.

Um das zu messen muss man natürlich Lasttests auf der Seite fahren, möglich durch Apache-Benchmark, Siege oder ein Windows-Tool zur Trafficanalyse.

Caching: Das Naheliegendste war nun, eine Form von Caching zu aktivieren. Da im Projekt Smarty eingesetzt wurde, bot sich das Smarty eigene Caching an, erwies sich aber als die schlechtere Lösung. Um die erste Nacht zu überstehen, deaktivierten wir auf dem Liveserver dann die Onlineuser-Anzeige und benutzten dateibasiertes Caching der Mysql Ergebnisse von einigen anderen Funktionen, deren Abfragen sich als langsam erwiesen. Am Ende der Nacht war zumindest die Startseite und einige andere häufig benutzte Funktionen der Seite wieder benutzbar.

Im Endeffekt erwies sich dann das mir bis dato unbekannte memcached als die beste Lösung zum Speichern von aus der DB gelesenen Daten. Im Laufe des Tages bauten wir es in jede Funktion ein, wo dies Sinn machte [ PHP.net/memcache ].

Damit war mein Job so gut wie erledigt, doch ein paar weitere Tipps konnte ich dem Entwicklerteam noch auf den Weg geben:

  • Keine Superklassen, die alles können (und womöglich noch statisch aufgerufen werden) benutzen.
  • Keine Angst vor einzelnen Funktionen. Sie sind schneller als statisch aufgerufene Methoden die bunt in eine Klasse geworfen werden.
  • Programmteile nur unmittelbar an der Stelle an der Sie benötigt werden nachladen (gilt für Klassen, Objekte, Funktionen, Konstanten..).
  • PHP Optimierung (Kommentare durchsehen), Lighttpd Optimierung, Apache Optimierung, Mysql Optimierung ist weiterhin nötig!

Innerhalb von zwei Tagen konnten wir so die Seite auf eine angenehme Geschwindigkeit bringen und die Last auf den Servern deutlich verringern, auch wenn der Code noch nicht optimal ist.

12. Mai 2007

Internet Explorer Developer Toolbar

Die Internet Explorer Developer Toolbar von Microsoft ist fertig.

The Microsoft Internet Explorer Developer Toolbar provides a variety of tools for quickly creating, understanding, and troubleshooting Web pages.

Die Developer Toolbar erlaubt ein ähnliches Debuggen des Quelltextes wie es unter Firefox mit der Firebug Extension möglich ist und funktioniert unter IE 6 sowie IE 7.

11. Mai 2007

Geekvision

geekvision websiteZusammen mit Daniel und Aaron war ich an der Entwicklung des Vidcast-Portals Geekvision beteiligt.Ich war unter anderem für das automatisierte Auslesen und Zusammenfassen der verschiedenen Feeds zuständig.
Gestern Abend haben wir die geschlossene Beta gestartet und ein Weblog online gestellt. Wer will kann sich zur Beta anmelden und uns beim Testen helfen.

1 Kommentar 11. November 2006

Work in Progress: Tripdown Communicate

In der nächsten Zeit werde ich mich neben Kundenprojekten vornehmlich der Weiterentwicklung meiner Newsletter Software widmen. Ebendiese bekommt einen benutzerfreundlichen Workflow verpasst, der sowohl die Konfiguration als auch das Erstellen und Abschicken von Newslettern umfasst. Das ganze Paket wird dann auch “gebrandet” und bekommt mit Tripdown Communicate einen eigenen Namen verpasst.

Off to work,…

26. Oktober 2006

Abiturprojekt: Notenerfassung

Abiturprojekt Screenshot
Neben dem Vergnügen musste ich in Portugal auch an meinem Abiturprojekt arbeiten.
Morgen ist der Termin, an dem ich es in einer Art Prüfung dem Ausschuss präsentieren muss.
Umgesetzt habe ich das Projekt auf Basis meines Frameworks “dotspersite” und bin gewillt es nach Abschluss der Präsentation als Beispielanwendung zum Download freizugeben. Mal sehen was draus wird.

7. Juni 2006

Relaunch für Designffm ** Update

DesignffmIn Zusammenarbeit mit dem Grafiker Mark Linneberger entstand die neue Webseite für das Unternehmen Designffm aus Frankfurt. Designffm verkauft klassische Designermöbel aus zweiter Hand und präsentiert sich seit je her in einfachen Farbtönen und einem dadurch bedingten simplen Gewand.
Die neue Webseite mit Inhaltsverwaltung, Newslettersystem für mehrere Domains und Produktdatenbank ist weitestgehend barrierefrei und zugänglich umgesetzt. Ein besonderes Augenmerk wurde auch hier wieder auf die Optimierung des Quelltextes für Suchmaschinen gelegt.
Die Seite für Designffm ist jetzt online unter:
Designffm - neues Wohnen mit Klassikern aus zweiter Hand

14. März 2006

Flxajax Weiterentwicklung

Das kleine Framework für Ajax Anwendungen mit PHP, flxAjax erfreut sich einer gesunden Beliebtheit mit nunmehr über 1700 Downloads.
Ich hatte schon einmal einen Anfang gemacht das Projekt weiterzuentwickeln, habe diese aber aufgrund einiger Probleme mit Javascript und um das Framework so simpel wie möglich zu lassen wieder abhanden geworfen.
Diese Weiterentwicklungen gingen in die Richtung, auch für PHP-Objekte Objekte in Javascript bereitzustellen, um auf deren Methoden zufreifen zu können.
Sollte jemand andere Ideen oder Wünsche haben, immer her damit. Ansonsten werde ich mich wohl weiterhin auf kleinere Bugfixes beschränken.

17. Februar 2006

Dotspersite2

Ich habe ein altes Projekt wiederbelegt. Dotspersite wurde vor zwei Jahren von ein paar Programmierern gestartet, die sich durch ein Grafikforum kennenlernten. Irgendwie geriet es in Vergessenheit, obwohl ich eine abgewandelte Form des Projekts schon erfolgreich als Framework benutzt habe.
Jetzt habe ich mit Dotspersite2 ein neues Release davon herausgebracht und werde es aktiv weiterentwickeln.
Bereits stabil implementiert sind ein Front Controller, eine Schnittstelle für Module und eine Schnittstelle für den zugang zu Standardklassen.
Momentan gibt es noch keine native Klassenbibliothek, ich weiss auch nicht ob das geändert werden sollte, zumal viele Entwickler bereits eine große, eigene Klassensammlung haben.
Eine Implementierung des ‘View’ aus dem MVC Konzept fehlt noch, wie die am besten umgesetzt werden kann wird aber schon überlegt.

sourceforge.net/projects/dotspersite/
tripdown.de/dotspersite/

20. Dezember 2005

Unleashing the google bomb

Checkt die URLs von Azita Skateboarding.
Mit dem letzten Update, das vor allem Title und Adressen betrifft, zielen wir vor allem auf die Suchmaschinen ab, aber es erleichtert es auch den Benutzern, sich besser auf der Seite zurecht zu finden.

Ausserdem wurde ein an Internet Explorer 5 angepasstes Stylesheet mittels Conditional Comments integriert, das es jetzt auch den Benutzern der älteren Browsergeneration möglich macht die Seite komplett zu benutzen.

4. Dezember 2005

Einblick in die Entwicklung eines Onlineshops #3

azita logo
Der Azita Skateboard Onlineshop ist jetzt online.
Nach einer öffentlichen Testphase wird er den Kunden in einem Newsletter angekündigt und im Laden promotet.
Zudem wird es zu Weihnachten noch ein kleines Update geben, worüber sich vor allem die Suchmaschinenroboter freuen werden.

28. November 2005

Ältere Einträge


Kalender

August 2008
M D M D F S S
« Jul    
 123
45678910
11121314151617
18192021222324
25262728293031

Einträge nach Monaten

Einträge nach Rubrik