Welche Teile der Modellschicht können im Interesse der Leistungsoptimierung umgangen werden?

28

Ich sehe derzeit, dass für eine Datenbanktabelle mit einem sehr einfachen Schema (ungefähr 5 Felder) neue Datensätze mit einer Rate von knapp 50 Einfügungen / Sekunde in meiner lokalen Entwicklungsumgebung (SSD-Laufwerk) eingefügt werden - dies ist mit Keine Beobachter im Modell, die zugeordnete Tabellen ausfüllen.

Mit Direct SQL sehe ich eine ziemliche Verbesserung - ~ 1800 Inserts / Sekunde. Wir denken darüber nach, die Leistung unserer Modelle zu optimieren, aber wir möchten natürlich nicht die schöne Stabilität und Flexibilität verlieren, die uns der Magento-Kern bietet.

Ich frage mich, ob jemand diesen Weg schon einmal gegangen ist und ob es einige einfache Erfolge in Bezug auf Komponenten der Modellebene gibt, die relativ sicher umgangen werden können, was zu erheblichen Leistungssteigerungen führt.

Dinge wie:

  • Klassennamenauflösung
  • vor und nach dem Speichern von Ereignissen
  • Ereignismeldungen
  • Transaktionen
  • etc.

UPDATE: Ich habe gelogen, es gab tatsächlich einige zusätzliche Abfragen von Beobachtern oder afterSave (), die ich gesehen habe, als ich das Datenbank-Abfrageprotokoll inspiziert habe. Das Benchmarking mit einer ganz einfachen Entität ergibt bei Magento-Modellen ungefähr 300 Zeilen pro Sekunde - nur MySQL-Overhead ist eine Transaktion.

kalenjordan
quelle
1
Haben Sie versucht, das Modellobjekt erneut zum Schreiben der Daten zu verwenden? Dh es löschen, setData und dann speichern. Dies würde die Aufrufe von getModel und den mit PHP verbundenen Overhead für die Objektinstanziierung vermeiden.
Davidalger
Außerdem werde ich vermuten, dass der Engpass hier in Ihrer CPU und nicht im Laufwerk liegt ... da alle erforderlichen Codedateien beim ersten Durchlauf geladen werden.
Davidalger
Danke, David! Ich werde das auch versuchen. Eigentlich denke ich, wir sind immer noch an die Anzahl der Abfragen gebunden, die ausgeführt werden. Wir haben ungefähr 20 Abfragen, die für eine bestimmte Modellsicherung ausgeführt werden - einige müssen aufbewahrt werden (zugeordnete Tabellen werden aufgefüllt, SELECTs müssen vor der Sicherung auf Existenz überprüft werden), andere können wir wahrscheinlich entfernen (externe Sitzungsspeicherungen, zusätzliche Last) () s, die in der Anwendungslogik vermieden werden können)
Kalenjordan
Sie könnten leicht herausfinden. Mounten Sie das gesamte Stammverzeichnis und die MySQL-Datenbank auf einer RAM-Disk. Ich würde jedoch stark bezweifeln, dass E / A ein Problem bei Geräten mit Serverqualität darstellt. Sie werden wahrscheinlich mehr Vorteile sehen, wenn Sie nur "Index beim Speichern" deaktivieren.
Ben Lessani - Sonassi

Antworten:

17

Eine Sache, die die gesamte Site beschleunigen kann, besteht darin, alle Verweise Varien_Profilerauf Ihre Produktionssite zu entfernen . Auch wenn der Profiler deaktiviert ist, prüft er immer, ob er aktiviert ist, sodass jeder Aufruf von zu Varien_Profiler::einer zusätzlichen ifAnweisung führt. Das Entfernen all dieser Anrufe hat natürlich zur Folge, dass der Profiler nicht mehr verwendet werden kann. Dies kann jedoch die gesamte Site um etwa 5% beschleunigen (dies ist eine subjektive Erfahrung, aber es gibt VIELE Anrufe in Varien_Profilerganz Magento). Ich habe tatsächlich ein kleines Shell-Skript geschrieben, um diese Aufrufe in allen Dateien automatisch zu kommentieren, und ich werde dies morgen zu meinem Beitrag hinzufügen, wenn ich bei der Arbeit bin und meinen Code bereit habe.

Wie versprochen nun den Code um diese Aufrufe auszukommentieren:

grep -l "Varien_Profiler" * -R > profiler.txt 
for x in `cat profiler.txt` 
do 
sed -i '/Varien_Profiler/s/^/\/\//' $x
done

Dies sollte in der Linux-Konsole sowohl in der App / als auch in der lib / -Ordner ausgeführt werden. Möglicherweise müssen Sie die Datei /lib/Varien/Profiler.php anschließend manuell anpassen. Beachte auch, dass du dies gründlich in einer sicheren Umgebung testen solltest, bevor du es live nimmst - aber ich denke, das sollte offensichtlich sein;)

mpaepper
quelle
Wow! Ich hätte mir nie vorstellen können, dass etwas nur für die Varien_Profiler-Aufrufe, wenn deaktiviert, auch nur annähernd 5% beträgt. Ich werde das überprüfen, danke!
Kalenjordan
@sparcksoft Wie versprochen habe ich jetzt den Code hinzugefügt.
MPaepper
1
Hier sind C-Precompiler-Bedingungen wirklich gut. Es ist schade, dass PHP sie nicht hat, aber das würde natürlich bedeuten, dass es eine eigene Methode zum Vorkompilieren und Zwischenspeichern haben müsste. :)
Davidalger
2
Sie können es auch schreiben, find . -type f -exec grep -qF 'Varien_Profiler' {} \; -exec sed -i '/Varien_Profiler/d' {} \;wenn Sie einen schnellen Oneliner bevorzugen.
Kojiro
14

Wenn Sie viele Speichervorgänge mit Magento-Modellen ausführen, deaktivieren Sie am besten den Magento-Indexer, der den Vorgang verlangsamt:

$processes = Mage::getSingleton('index/indexer')->getProcessesCollection();
$processes->walk('setMode', array(Mage_Index_Model_Process::MODE_MANUAL));
$processes->walk('save');

Und aktivieren Sie es, wenn Sie fertig sind:

$processes->walk('setMode', array(Mage_Index_Model_Process::MODE_REAL_TIME));
$processes->walk('save');
Rick Kuipers
quelle
Ah gotcha, nett. Das wäre also so, als würden Sie viele Datensätze zu customer_entity speichern und möchten vermeiden, dass die Kundenindizierung bei jedem Speichervorgang erfolgt? In meinem Fall mache ich das tatsächlich gegen eine benutzerdefinierte Entität, die keine Indizierung hat - zumindest für den Benchmark, den ich gemacht habe. Wir haben auch einige benutzerdefinierte Indizes, für die ich diesen Tipp wahrscheinlich verwenden werde!
Kalenjordan
Ich glaube, es gibt keine Kundenindizierung, aber es wird Ihnen sicherlich bei der Änderung vieler Produkte und dergleichen helfen. Auf jeden Fall ist es einen Versuch wert!
Rick Kuipers
Sorry, ja EAV Produktdaten und so zum Beispiel. Vielen Dank.
Kalenjordan
Hallo! Möglicherweise müssen Sie danach (teilweise) neu indizieren?
Alex
@Alex Ja, die Indexer werden auf MODE_REAL_TIME zurückgesetzt, sodass sie nach Zeitplan neu indiziert werden. Sie können es natürlich erzwingen, wenn Sie wollen.
Rick Kuipers