Refactoring von Wordpress zur Verbesserung der Speicherleistung [geschlossen]

63

Ich habe mir den Speicherverbrauch in Wordpress genau angesehen. Auf meiner Website werden anscheinend für jeden Seitenaufruf 20 MB RAM zugewiesen, um eine komfortable Umgebung für die Ausführung aller Plugins vorzubereiten. Ich habe es folgendermaßen dargestellt:

Es gibt keinen einzigen zu optimierenden Punkt, keinen einzigen Bösewicht, der den größten Teil des Gedächtnisses aufnimmt. Der Verbrauch ist auf viele, viele PHP-Module verteilt.

Wie kann Wordpress veranlasst werden, seine Umgebung nur einmal im Speicher zu initialisieren und sie dann für jeden Treffer mehrmals zu verwenden? Ich möchte nicht, dass langsames PHP bei jedem Klick 20 MB frisst - selbst auf einem Server mit viel Arbeitsspeicher dauert es Sekunden, bis all diese Arbeit erledigt ist. Grundsätzlich benötigen Sie schreibgeschützte Speicherbereiche, die wiederverwendet werden können.

Also ... warum 20MB? Kann mir jemand einen Einblick geben?

Bearbeiten: Hier ist die WinCacheGrind-Ausgabe in Wordpress, die auf meinem Entwicklungscomputer ausgeführt wird (viel schneller als das gemeinsam genutzte Hosting). Wie Sie sehen, dauert es mehr als eine Sekunde, bis das HTML der Hauptseite erstellt ist. Verlangsamen Sie das durch Shared Hosting und Sie haben ein Rezept für Probleme. Ich habe die Methode gewählt, die die meiste Zeit in Anspruch nimmt. Wie würden Sie dies optimieren?

Bearbeiten: Hier sind Abfragestatistiken von diesem fantastischen functions.php Profiling Tool .

Laden: 12 Abfragen - 532 ms - 19,1 MB - 43 Cache-Treffer / 53
Abfrage: 15 Abfragen - 563 ms - 19,0 MB - 72 Cache-Treffer / 86
Anzeige: 21 Abfragen - 705 ms - 19,2 MB - 234 Cache-Treffer / 257

Edit: Willst du etwas sehen, das dich garantiert ausflippt? Fügen Sie diese Zeilen am Ende von index.php ein:


echo "<pre>\n";
print_r(get_defined_vars());
echo "</pre>\n";

Ich habe versucht zu zählen, wie oft der Körper des aktuellen Posts im Speicher gespeichert ist. Ich habe 20 Fälle gezählt. Dann wurde mir klar, dass PHP über eine Referenzzählung verfügt, sodass die Anzahl der Kopien auf drei reduziert wurde: Zwei scheinen sich in WP_Query zu befinden, eine im Objektcache. Ich recherchiere weiter.

Aus diesem Grund denke ich, dass WordPress überarbeitet werden muss, um die Speicherprobleme in den Griff zu bekommen. Sie können den Speicherverbrauch nicht länger auf die Komplexität seiner Funktionen zurückführen. Es macht einfach eine Menge Dinge falsch .

Edit: Nach einem Tag, um dies herauszufinden, sind hier meine Ergebnisse:

1) 88% des gesamten Speichers stammen aus Aufrufen des Typs require oder include oder include_once:

2) Die PHP-Datei enthält Informationen, die meistens während des ersten Teils der Bearbeitung einer Anfrage auftreten (nicht überraschend). Hier wird auch der gesamte Speicher aufgebraucht:

3) Es ist sehr interessant, alle Funktionen aufzuzeichnen, die während einer Anfrage ausgeführt werden. Insgesamt gibt es über 12000 Anrufe. Ich habe sie gezittert, um es sichtbarer zu machen (die Level-Achse ist im Grunde die Tiefe des Stapels):

4) Der einzige Weg, den ich mir vorstellen kann, besteht darin, die Anzahl der enthaltenen .php-Dateien zu minimieren. Wenn ich die Funktionen nach Dateien aufteile, aus denen sie stammen, können Sie feststellen, dass viele Dateien höchstens ein- oder zweimal aufgerufen werden. Wir brauchen eine Möglichkeit, diese zu überspringen, wenn sie nicht benötigt werden. Zum Beispiel wird mein Remote-Datenbank-Backup-Plugin geladen und registriert, nur um überhaupt nicht verwendet zu werden. Hier ist der obige Plot nach Dateinamen aufgeteilt:

Ich biete ein Kopfgeld an, das allen meinen Ruf wert ist :) für Umgestaltungen, die dazu führen würden, dass sich der Speicherbedarf meines Blogs um 30% oder mehr verringert.

Edit: Ich habe WP 3.1 installiert, hier ist ein Vergleich mit der alten Version.

Blau ist WP 3.1, Rot ist 3.0.4. Das neue WP ist schneller, verbraucht aber auch mehr Speicher.

Hier ist eine Liste nach Include-Datei.

Dies ließ mich erkennen, wie viel Speicher von "All In One SEO Pack" verbraucht wird - eine Möglichkeit wäre, nur einen Bruchteil der Funktionalität des Plugins zu nutzen, um das zu bekommen, was ich will. Außerdem scheinen meine eigenen Plugins ziemlich schlecht zu sein.

Ich möchte das bedingte Laden von zB comment.php (ich erlaube keine Kommentare in meinem Blog) und mehreren anderen versuchen. Ich habe den gesamten veralteten Code gelöscht. Ich habe kses.php runtergeschnitten, um die globalen Tabellen nur bei Bedarf zu laden. Ich habe l10n vereinfacht (ich mache keine Lokalisierung), so dass seine Funktionen die Zeichenketten sofort ohne Nachschlagen zurückgeben. Ich bin immer noch weit von der 30% -Marke entfernt, die ich willkürlich festgelegt habe.

Bearbeiten: Ich habe APC mit den Standardeinstellungen (32 MB Opcode-Cache) heruntergeladen und aktiviert. Hier ist der Vergleich:

Sie können sehen, dass das Laden des Codes massiv beschleunigt wurde und der Code auch weniger Speicherplatz beansprucht (wahrscheinlich, weil wir uns nur mit Opcodes befassen, nicht mit der Originalquelle). Der Speicherverbrauch ist aber immer noch recht hoch.

Roman Zenka
quelle
Könnten Sie Cachegrind-Datei selbst irgendwo hochladen? Ich erinnere mich nur nicht, ob etwas, das es wert ist, privat zu bleiben, enthalten ist, wenn ja, dann nicht.
Rarst
@Rarst Es sollte in Ordnung sein. foxloft.com/files/mbala/cachegrind.out
Roman Zenka
1
hm, ich stimme Ihrer Schlussfolgerung zu - nichts springt wirklich heraus und möchte repariert werden. Ich habe ein neues Profil auf meinen lokalen Teststapel (3.1, MS, Twenty Ten, Testdaten für Themeneinheiten) gelegt und 1,5s erhalten (der größte Unterschied scheint auf das benutzerdefinierte Menü zurückzuführen zu sein - die Sache ist langsam). Also ich denke nichts zu reparieren = Caching-Forschung ist es.
Rarst
@Rarst Vielen Dank für Ihre Hilfe. Ich denke, es gibt noch einiges zu reparieren, aber dafür müsste die Architektur von Wordpress in eine völlig andere Philosophie geändert werden, und das ist zu viel Arbeit.
Roman Zenka

Antworten:

25

Die Mühe nicht wert. WordPress verbraucht nicht viel Speicher, nur weil. Es frisst viel Speicher, weil es viele Funktionen unter der Haube ausführt.

Mit dem statischen Cache-Plugin ist es viel einfacher und effizienter, Ergebnisse zwischenzuspeichern (Seite generiert) und diese bereitzustellen. Auf diese Weise werden die meisten Besucher WP nicht einmal selbst treffen.

Rarst
quelle
2
Ich verwende bereits einen Cache, habe aber noch ein paar wirklich dynamische Seiten (z. B. einen Einkaufswagen). Und wenn die Sterne nicht richtig zugeordnet sind, kann der Benutzer 20 Sekunden warten - das ist auf GoDaddy selbstverständlich, aber selbst wenn nicht, denke ich, wären es mindestens ~ 3 Sekunden. Ich kann einfach nicht die Art von wirklich bissiger Erfahrung bieten, die Menschen von Google gewohnt sind.
Roman Zenka
8
@Roman Zenka Wenn Sie bestimmte Leistungsanforderungen haben, sind Sie besser auf der Suche nach bestimmten Lösungen, als zu hoffen, dass WordPress selbst auf magische Weise superschnell und ressourcenschonend wird. Die ersten Dinge, die ich prüfen möchte, sind der Opcode-Cache und das statische Zwischenspeichern von Fragmenten. Zuvor müssen Sie jedoch einen Benchmark durchführen und nicht nur bestimmen, wohin der Speicher verschoben wird, sondern auch, wo Zeit aufgewendet wird. WordPress ist eine Umgebung, kein Engpass für sich. Der Engpass liegt in dem, was Sie tun müssen.
Rarst
@Rarst Ich habe tatsächlich die CPU-Auslastung gemessen und kann nicht mit dem Finger auf eine bestimmte Stelle zeigen, die den Fehler verursacht. Ähnlich wie bei der Erinnerung scheint es überall zu sein. Mein Benchmarking kann jedoch möglicherweise nicht optimal durchgeführt werden - ich verwende den XDebug-Profiler und Cachegrind - es ist beispielsweise aufgrund der Datenbankaufrufe ziemlich schwierig, die Latenz auseinanderzuhalten. Ich wäre dankbar für Hinweise auf bessere Profilierungstechniken.
Roman Zenka
@Rarst Profiling Screenshot wurde hinzugefügt.
Roman Zenka
4
Es könnte auch sein, dass GoDaddys Server langsam sind. Sie sind dafür bekannt, nicht die beste Hardware zu haben und würden " lieber für Fernsehwerbung bezahlen, als ihre Server aufzurüsten "
Zack,
23

Und aus diesem Grund denke ich, dass WordPress dringend umgeschrieben werden muss. Sie können den Speicherverbrauch nicht länger auf die Komplexität seiner Funktionen zurückführen. Es macht einfach Dinge falsch.

Was für eine naive Schlussfolgerung. Lesen Sie Dinge sollten Sie niemals tun, Teil I .

Vielen Dank für die Speicherauslastung.

Viel später: Autommatic hat eine Bibliothek namens prefork veröffentlicht , die genau das tut, wonach Sie gefragt haben: Laden Sie den WordPress-Code nur einmal in den Arbeitsspeicher.

scribu
quelle
Es stimmt, es ist naiv. Vielleicht hätte ich "refactor" anstelle von "rewrite" sagen sollen, dann klingt es viel besser. Beitrag aktualisiert.
Roman Zenka
2
Okay, wenn Sie spezielle Vorschläge haben (insbesondere Patches), können Sie diese gerne auf trac: core.trac.wordpress.org
scribu
Ich arbeite gerade daran. Ich versuche, eine Karte von Objekten im Speicher zu zeichnen, damit ich sehen kann, wie viel von was verwendet wird. Gibt es ein Tool, das einen Speicherauszug erstellt und plottet?
Roman Zenka
5
@scribu - +1 für den Link zu Joels Beitrag!
MikeSchinkel
1
Ok, denken Sie daran, dass WP_Object_Cache durch eine Implementierung im Memcache usw. ersetzt werden kann
scribu
17

Ab WordPress 3.2 ist PHP 5.2 die Mindestanforderung. Ich denke, dass unter unseren Gürteln Teile des Kerns anfangen können, umstrukturiert zu werden, und Klassen mit automatischem Laden verwenden können. Auf diese Weise könnten wir das Laden einiger Codestücke vermeiden, es sei denn, sie würden tatsächlich benötigt. Wenn beispielsweise keine Einbettungen oder Galerien in einer Seitenansicht vorhanden sind, können wir möglicherweise vermeiden, dass viel Mediencode geladen wird.

Selbst wenn sie sich dazu entschließen, diesen Weg zu beschreiten, würde ich davon ausgehen, dass er sich langsam entwickelt (wie viele der anderen Veränderungen, die im Verborgenen geschehen sind). Es würde das Mischen vieler Dateien und Codes erfordern, was bei einigen Plugins möglicherweise zu einer Abwärtskompatibilität führen könnte.

Ein Teil des Problems (wenn man es wirklich so nennen kann) ist, dass das Core Framework ohne diese Art des bedingten Ladens nicht im Voraus wissen kann, welche Funktionalität es benötigt oder nicht benötigt, um die Inhaltsansicht zu generieren. Daher müssen viele Funktionen geladen werden, nur für den Fall, dass sie benötigt werden.

Dougal Campbell
quelle
@Dougal Campbell Ich habe eine Kopfgeldaktion für diese Frage gestartet, um zu sehen, ob wir mindestens diese eine Instanz von WordPress hacken können, die schlecht genug ist, um jetzt eine Verbesserung des Speicherverbrauchs um mindestens 30% zu erzielen, relativ schmerzlos. Es könnte einen Teil der zukünftigen Entwicklung beflügeln.
Roman Zenka
Bedingtes Laden beeinträchtigt die Geschwindigkeit, wenn es um das Zwischenspeichern von Opcodes geht , und verringert möglicherweise den Speicherverbrauch . Wir neigen dazu, Geschwindigkeit zu bevorzugen.
Scribu
Weitere Gedanken zum automatischen
Laden
@scribu Wenn Sie "Bedingtes Laden" sagen, sprechen Sie von automatischem Laden oder tatsächlichem Laden von Code basierend auf einer Bedingung? Wie sehr schmerzt es die Geschwindigkeit?
Roman Zenka
1
Danke! Wie gesagt, ich weiß nicht, ob der WP-Core diesen Weg jemals einschlagen wird (das erforderliche Refactoring könnte zu extrem sein). Aber ich war sehr beeindruckt von der Mühe, die Sie in die Analyse gesteckt haben, und von den Grafiken, die Sie erstellt haben. Mach weiter so!
Dougal Campbell
16

Wie kann Wordpress veranlasst werden, seine Umgebung nur einmal im Speicher zu initialisieren und sie dann für jeden Treffer mehrmals zu verwenden?

Es heißt Opcode-Caching.

http://en.wikipedia.org/wiki/PHP_accelerator

Otto
quelle
1
Ich werde APC ausprobieren und sehen, was passiert. Als ich diese Frage ursprünglich stellte, meinte ich mehr als nur das Zwischenspeichern von Opcode - ich meinte die Wiederverwendung der gesamten Umgebung, die WordPress erstellt - Code + Daten. Memcached hilft Ihnen dabei, die Daten schneller zu erhalten, aber Sie klonen die Daten weiterhin im Serverspeicher. Nun scheint es, als würde das Zwischenspeichern von Opcodes etwa 90% des gesamten Speicherverbrauchs ausmachen.
Roman Zenka
Wenn Sie über die Ressourcen für einige Experimente verfügen, können Sie auch versuchen, eine FastCGI-Umgebung einzurichten. Ich wäre sehr an Vergleichen zwischen mod_php und FastCGI interessiert.
Dougal Campbell
5

Sie werden es wahrscheinlich nicht schaffen, die RAM-Nutzung so stark zu reduzieren. Wenn Sie jedoch verwenden mod_php, möchten Sie möglicherweise zu wechseln mod_fcgid.

Während mod_php etwas langsamer ist, lädt es PHP, auch wenn es nicht benötigt wird, wie zum Beispiel das Bereitstellen von Bildern, statischen Dateien oder sogar das Zwischenspeichern. Wenn Sie viele Anfragen haben, ist dies viel RAM.

Mit fcgid wird dies erheblich reduziert.

auch wird eine statische Cache verwenden (wie w3total Cache) vermeiden Aufruf php überhaupt , die ein wirklich großer Vorteil ist: weniger RAM - Auslastung, weniger db - Verbindungen.

boyska
quelle
4

Ha. Ich arbeite an einem Web - App jetzt , dass ich voll mit Daten und die Nutzung über das, was mein Shared - Hosting - Konto zu überlasten beabsichtige umgehen kann, also entschied ich mich - während es super einfach gewesen wäre, in WP zu bauen - zu versuchen , von der Arbeit BackPress als ein Framework und bauen Sie nur das auf, was ich für meine spezifischen Anwendungsfälle brauchte.

So konnte ich meine Kernumgebung von Hunderten von PHP-Dateien in WP auf etwa die zwanzig reduzieren, die ich tatsächlich benötige, während ich weiterhin in der Lage war, alle Funktionen für Datenbank, HTTP, Benutzerverwaltung, Formatierung und Cron zu nutzen Funktionen, die ich in WordPress liebe.

Das Problem ist, dass es eine Menge Arbeit ist, und ich würde meinem Hackjob nie vertrauen, wenn es um etwas geht, das über meinen persönlichen Gebrauch hinausgeht. Wenn Sie die vollständige WP-Umgebung verwenden möchten, nehmen Sie sie so, wie sie ist. Es ist so gut wie es ist, weil Hunderte von Entwicklern es über mehrere Jahre hinweg verfeinert haben. Wie jeder hier gesagt hat, werden Sie viel weiter kommen, wenn Sie einen besseren Hosting-Plan finden und nach Caching-Techniken suchen, als wenn Sie wahrscheinlich den Kern hacken.

goldenapples
quelle
1
Ich bin damit einverstanden, dass WP für eine lange Zeit fein abgestimmt wurde. Aber ich glaube nicht, dass es eine feine Sache war, an einem beschissenen Hosting mit einer bestimmten Mischung von Plugins zu arbeiten. Ich bin gespannt, wie weit ich es schieben kann. Auch wenn die Änderungen nicht in den Kern gelangen, ist es gut, eine dokumentierte Methode zum Hacken des Kerns zu haben, wenn Sie denken, dass Sie dies tun müssen.
Roman Zenka
3

Ja, WordPress lädt zuerst alles und macht dann, was wir von ihm verlangen. Ich kann mich erinnern, dass wir irgendwo einen virtuellen Pool im RAM erstellen können, in dem wir Dateien ablegen können. Ich hatte die Idee, das gesamte WordPress in den Speicher (<10 MB) zu stellen und dann können wir eine Menge I / O-Vorgänge speichern, die allein einen Geschwindigkeitsschub bewirken sollten. Aber ich hatte nie die Gelegenheit, es zu versuchen, und außerdem bin ich nicht so geschickt darin, so etwas zu verfolgen. Aber es sieht einen Versuch wert aus.

Ashfame
quelle
Und ich bin mit Rarst einverstanden, ein statisches Cache-Plugin zu verwenden, damit überhaupt keine Verarbeitung erfolgt. Das kann aber auch mit guter Dynamik genutzt werden. :)
Ashfame
Ich mag diese Idee. Ich bin nicht sicher, wie viel von diesem Problem auf E / A-Latenzen zurückzuführen ist und wie viel darauf, dass PHP langsam auf den Daten herumkaut. Wissen Sie, wie man es erkennt?
Roman Zenka
Tut mir leid, es ist nur eine Idee in meinem Kopf. Möglicherweise wirkt sich dies nicht auf die Leistung aus, da Daten in der Regel als Blöcke von der Festplatte gelesen werden. Daher wurden möglicherweise bereits viele andere erforderliche Daten abgerufen. Ich bin mir nicht sicher.
Ashfame
3

ein paar grundsätzliche vorschläge:

  1. w3 total cache plugin zum cachen ..
  2. Memcache installieren und aktivieren lassen, auch über die Einstellungen für den gesamten w3-Cache aktivieren
  3. Minimieren Sie Anfragen, um Links in Themendateien zu leiten.
  4. Deaktivieren Sie alle zusätzlichen nicht verwendeten Plugins und entfernen Sie sie.
  5. Datenbank optimieren.

Ich betreibe täglich eine bekannte WordPress-Seite mit großem Datenverkehr. Ich bin nicht auf "Dedicated Even", was großartig für mich ist :)

Ayaz Malik
quelle