Nutze die Power von mySQL

Vorneweg: Ich bin kein Profi bei der Arbeit mit ZOPE/ZMS, aber bei einem aktuellen Projekt wurde mir aufgetragen die dramatische Performance einer ZOPE/ZMS Anwendung zu verbessern.

Als Ausgangsszenario dient eine ZOPE/ZMS Umgebung, die mittels ZEO über 8 ZMS Client auf einer physikalischen Maschine verfügt. Die Idee dahinter ist, das jeder Python Prozess einen CPU Kern nutzen kann / soll.

Die Anwendung hat in verschiedenen Knoten teilweise bis zu 200 Kindknoten und mit allen Knoten addiert kommt das Projekt auf über 1800 Knoten. Anscheinend ist ZOPE/ZMS nicht auf solche Ausmaße ausgelegt, da die Generierung einzelner Seiten bis zu 40 Sekunden in Anspruch nahm.

Mein Bauchgefühl sagte mir das die ZODB, die objektorientierte Datenbank von ZOPE die Wurzel des Übels ist und ich versah erstmal alle Templates mit Zeitstempel bevor und nachdem ein Template Daten aus der ZODB akquirierte. Der Verlgeich der Zeitstempel legte alle Schwachstellen offen und ich fing an die Datenmodelle aus ZOPE in mySQL Tabellen nachzubauen, mit dem Fokus auf optimale mySQL Performance. Große Textfelder wurden in eine eigene Tabelle ausgelagert, damit die Ausspielung von Übersichtsseiten aus schlanken Tabellen kommt.
Die automatisch generierten IDs des ZMS verkürzte ich so, dass sie nur noch aus Nummern bestanden damit ich als Primäre Schlüssel integer Werte habe. Mit dem ZMS Hook „onObjChangeEvt“ habe ich die ZMS Objekte aufgebohrt, sodass sie jede Änderung auch in die mySQL Datenbank schreiben. Einzig die ZMS Funktion zum Löschen der Objekte war trickreicher, wie gesagt ich bin kein ZOPE/ZMS Profi und diese Ausgabe wurde von meinem Kollegen implementiert.

Nachdem alle Daten mit mySQL synchronisiert waren, konnte ich die Ausspielungen auf mySQL umstellen und verkürzte die Datenakquise gut und gerne um den Faktor 100 – 400. Ausserdem konnte ich teile der Logik aus den Templates nehmen und in die mySQL Statements schreiben, zB bei Datumsfunktionen oder Zufallsausspielungen.

Neben der mySQL Auslagerung schaute ich auch bei „einfacheren“ ZMS Ausspielungen auf die Zeit und musste entsetzt feststellen das die Ausspielung von 30 Bilder URLs, die von einer Javascript Funktion weiter genutzt werden, zwischen 6 und 10 Sekunden dauerte! Das Auskommentieren der .getHref() Funktion beschleunigte die Ausspielung in den Zehntelsekunden Bereich. Als Konsequenz fügte ich bei diesem und anderen Objekte ein Textfeld ein, in den der gerenderte Template Text beim speichern des Templates geschrieben wird und bei der Ausspielung nur auf dieses Feld zugegriffen wird, dadurch dauert die Ausspielung ca 0.005 Sekunden – also eine Art Caching innerhalb des ZMS nachgestellt.

Im Endeffekt wurde die Ausspielung wahnsinnig beschleunigt, während der volle Komfort des Backends erhalten blieb, allerdings wurde im Backend auch keine Performance Besserung hergestellt.

Update: Hier gibt es noch einen Nachtrag: Nutze die Power von mySQL

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.