Performance Test eines phpBB Internet Forums
Ich habe dies anlässlich eines Performanceproblems eines nicht kommerziellen aber rege genutzten Internetforums getan und will hier kurz zeigen, was nötig war bzw. wie ich die wichtigsten Informationen gewonnen habe.
In dem zu untersuchenden Fall kam es beim Speichern von Beiträgen teilweise zu erheblich langsamen Antwortzeiten. Verwendet wird die phpBB Board Software, welche eine mySQL Datenbank nutzt.
Ich möchte hier das Vorgehen von der Analyse bis zur Lösung darstellen. Dafür habe ich das Thema in mehrere Artikel aufgeteilt um den Teilbereichen etwas mehr Details darstellen zu können.
Da das Problem (teilweise sehr lange Antwortzeiten) nur sporadisch auftrat war der erste Schritt das Problem messbar und reproduzierbar zu machen.
Hierfür habe ich ein Loadrunner Script mit der Comunity Version des Loadrunners erstellt und einen kleinen Lasttest ausgeführt.
In dem betroffenen Board habe ich also einen Performancetest User angelegt und einen nicht öffentlichen Thread erstellt, in dem dieser Beiträge erstellen konnte ohne andere Benutzer zu stören.
Das Scripting mit Loadrunner war nicht besonders schwierig, enthielt jedoch einen interessanten Fallstrick, dem ich einen eigenen kleinen Artikel (http://www.sanchofock.de/?p=65) widme.
Als Szenario habe ich mich für einen einfachen Performancetest mit einem virtuellen User entschieden, der für 15 Minuten jeweils einen Artikel nach dem anderen postet.
Das Ergebnis bestätigte zuerst mal, dass die langsamen Antwortzeiten keine Einbildung und auch kein Zufall waren. Besonders auffällig war jedoch, dass die Antwortzeiten zum einen sehr unterschiedlich waren, die schnellsten waren kleiner als eine Sekunde, die Langsamsten ca. 12 Sekunden manchmal sogar 15 Sekunden. Allerdings war die Verteilung nicht gleichmässig, sondern es gab Gruppen mit ca 0,x 3,x 6,x 9,x 12,x und 15,x Sekunden jedoch nichts dazwischen. Die Percentile Darstellung zeigt das recht deutlich:
Dieses seltsame Bild deutete darauf hin, dass es irgendwo in dem Prozess -hin und wieder- zu Timeouts kommt, aber wo?
Als erstes habe ich mir die Datenbank angesehen. Dies beschreibe ich ausführlich in dem Artikel http://www.sanchofock.de/?p=56
Das Ergebnis war jedoch, dass die Ursache nicht in der Datenbank selbst lag.
Deshalb habe ich die Gelegenheit genutzt mit Hilfe einer DynaTrace Teststellung dieses Tool in Verbindung mit PHP zu testen. Auch hierzu habe ich einen ausführlichen Artikel geschrieben (http://www.sanchofock.de/?p=39)
Und siehe da mit Hilfe von Dyna Trace habe ich den entscheidenden Hinweis bekommen. Keiner der Service Aufrufe selbst war langsam, aber die häufig verwendete Methode getHostByName verbrauchte insgesamt viel Zeit. Diese Methode ist dafür Zuständig die IP Adresse für einen HostNamen zu ermitteln bzw. eine DNS Abfrage zu machen.
Ein manueller Check an der Konsole des Servers bestätigte den Verdacht: Ich führte mehrere nslookup Anfragen auf den eigen Host Namen aus und die meisten waren blitzschnell beantwortet, so wie es sein sollte, aber einige dauerten mehre Sekunden.
Ein Blick in die resolv.c Datei verriet, dass das Timeout für DNS anfragen auf genau 3 Sekunden eingestellt war. Treffer!
Ich verringerte nun das Timeout und wiederholte den Test und siehe da die Gruppen, die zuvor je 3 Sekunden auseinander lagen lagen nun nur noch 1 Sekunde auseinander. Die maximalen Antwortzeiten waren nun auch entsprechend geringer.
Als nächstes habe ich die bisher verwendeten DNS Server des eigenen Providers durch eine Liste frei verfügbarer DNS Server ersetzt und die Anzahl der langsamen Antworten verringerten sich im folgenden Test signifikant. Es blieben aber noch immer einige langsame Antworten übrig. Wo genau in der DNS Infrastruktur das eigentliche Problem lag konnte ich zwar nicht ermitteln, aber mit der Einrichtung eines lokalen DNS Servers, welcher die verwendeten Namen chached konnte das Problem endgültig beseitigt werden.
Fall gelöst
Schreibe einen Kommentar