Was alles trägt zur Ausführungszeit von Drupal-Seiten bei?

17

Ich habe eine von mir untersuchte Site, die schwerwiegende Leistungsprobleme aufweist. Mit memcache konnte ich die Anzahl der Abfragen sowohl in Bezug auf die Anzahl als auch auf die Gesamtausführungszeit (von 3 Sekunden auf 230 ms) verringern, aber die Ausführungszeit der Seite ist mir entgangen (ich bin es) Betrachtet man die von devel ausgegebenen Werte, so ist nach meinem Verständnis die Ausführungszeit der Seite = die für die Ausführung von PHP benötigte Zeit. Daher habe ich APC installiert und kann sehen, dass PHP-Opcode zwischengespeichert wird und Statistiken mit Treffern in der APC-Systemsteuerung (apc.php im Lieferumfang von APC) angezeigt werden Die Ausführungszeit meiner Seite sinkt nicht. Ich denke, meine Frage ist zweifach:

  • Was alles trägt zur (langsameren) Seitenausführungszeit bei? Ist es nur Zeit, um PHP auszuführen?
  • Welche Maßnahmen sollte ich ergreifen, um die Ausführungszeit der Seite zu verkürzen? Ich habe versucht, APC, aber nicht viel Hilfe

Die Anzahl der auf dieser Site verwendeten Module ist nur enorm (168), aber im Moment bin ich nicht in der Lage, diese Empfehlung abzugeben, es ist eher wie ein Feuer in der Grube.

Edit: Ausgabe von xhprof auf lokaler Instanz (empfohlen von mikeytown), das scheint verrückt zu sein Ich denke, die späteren Ergebnisse sind auf Thrashing zurückzuführen? Diff-Läufe für dieselbe URL haben drastische Unterschiede und einen zu hohen Ressourcenverbrauch. Auch nicht sicher, warum es Werte anzeigt, die nicht von heute sind: | (Ich habe gerade xhprof auf diesem Laptop installiert)

Ausgabe von xhprof auf lokaler Instanz

Dipen
quelle

Antworten:

4

Holen Sie sich ein Cachegrind Ihrer Website. xdebug oder xhprof können einen erzeugen. Hier erfahren Sie, welche Funktionen am längsten ausgeführt werden. Bis Sie dies tun, ist es ein schlechtes Ratespiel.

mikeytown2
quelle
Hey, danke für den Vorschlag, dass ich gerade xhprof auf meiner lokalen Entwicklungsversion (Laptop nicht auf Server) ausgeführt habe und das sehe ich - picasaweb.google.com/lh/photo/… Ist das echt? Ich meine, ist es überhaupt möglich, dass eine Seite 750 MB Speicher belegt?
Dipen
Könnte es so schlimm sein? Die später profilierten Daten für dieselbe URL beanspruchen viel weniger Ressourcen, wenn Sie sich die untere Seite ansehen, zeigt ein Diff-Lauf jedoch eine völlig unterschiedliche und extreme Ressourcennutzung.
Dipen
1
Es hängt wirklich davon ab, aber bei 99,9% der Setups stimmt etwas nicht, wenn Sie mehr als 100 MB RAM verwenden.
mikeytown2
Konnte außer der Anzahl der Module noch etwas falsch sein? Ich bin mir nicht sicher, ob Module sofort aus der Produktion genommen werden können. Übrigens verwende ich auf lokaler Ebene Nginx + Php-Fpm und auf der Produktionsseite Lighspeed mit schnellem CGI.
Dipen
1
Sie müssen einen Drilldown in den Cachegrind durchführen und auflisten, welche Funktionen Ihre Zeit in Anspruch nehmen. img715.imageshack.us/i/cgrindout.png
mikeytown2
1

EDIT: Ich habe den Originalbeitrag falsch gelesen. 168 Module sind eine Menge, und 300 bis 700 ms SQL-Abfragen sind riesig . Je mehr Module Sie verwenden, desto mehr Anfragen werden gestellt, sobald Module welche ausführen.

Verwenden Sie aggressives Caching, solange Sie können. Cachen Sie alles. Wenn es nicht ausreicht, versuchen Sie es mit einem Reverse-Proxy-Cache. Die Verwendung eines CDN für Dateien kann das Ganze erheblich verbessern. Ein Reverse-Proxy-Cache kann Ihnen auch helfen, indem Sie einige Auth-Cookies entfernen, wenn Sie Seiten aufrufen, für die er nicht benötigt wird (dann glaubt Core, der Benutzer sei für diese anonym und maximiert das Caching).


Die Drupal-Kerndynamik verlangsamt die Morgendämmerung, sobald zu viele Module gleichzeitig interagieren.

Wenn Sie beispielsweise viele Module verwenden, die Daten zum Zeitpunkt hook_node_load () laden, anstatt Felder zu verwenden, werden viele Abfragen durchgeführt, während die Feldnutzung die Caching-Effizienz gewährleistet hätte.

Das Rendern kann auch viel Zeit in Anspruch nehmen, drupal_render () (die Rendering-API, die manchmal aufgerufen wird) ist eine nette API (sehr nützlich), aber auch ein bisschen langsam. Das Umschalten auf PDO (D7) und das volle DBTNG (was übrigens großartig ist) erhöhen auch die nicht zu vernachlässigende Latenz.

Das heißt, der Kern an sich ist recht schnell (aber er führt zu viele SQL-Abfragen durch, auch wenn fast nichts installiert ist), schlecht codierte Module sind oft der Engpass.

APC kann die Ausführungszeit je nach ausgeführtem Code auf 2 oder 3 aufteilen. Wenn Sie es gut konfigurieren (aktivieren Sie alle APC-Optimierungen, das offizielle APC-Handbuch ist gut geschrieben und wird Sie führen).

Wenn Sie sich in einer Box mit einem langsamen Dateisystem (Netzwerkdateisystem oder langsame Festplatte) befinden, kann dies einen sichtbaren Einfluss auf die Ausführungszeit haben. Drupal besteht aus vielen kleinen Dateien, wodurch PHP gezwungen ist, jedes Mal, wenn es eine von ihnen lädt, I / O auf dem FS durchzuführen (APC hilft auch sehr dabei).

Ein falsch konfiguriertes DBMS kann auch ein ziemlich hässlicher Engpass sein, wenn Sie mit MySQL überlegen, ob Sie eine Feinabstimmung vornehmen möchten. Wenn Sie ein Shared-Hosting-System verwenden, das nicht Drupal-spezifisch (oder bereit) ist, sind DBMS- und PHP-Stapel wahrscheinlich falsch konfiguriert oder nicht optimiert, was zu sehr langsamen Websites führen kann.

Vergessen Sie nicht, alle Caches zu aktivieren. Wenn Ihre Website nicht benutzerorientiert authentifiziert ist, aktivieren Sie das aggressive Seiten-Caching (es ist wirklich erstaunlich).

Je mehr Blöcke Sie haben, desto langsamer werden die Seiten, und die Blöcke des Views-Moduls stellen einen Engpass dar (abhängig von den von Ihnen verwendeten Views-Plugins kann der Block von OG eine echte Belastung sein), wenn Sie deren Sichtbarkeit nicht einschränken Auf Seitenbasis oder mit benutzerdefiniertem PHP-Code (jeder andere Block kann auch die Blocksichtbarkeit manuell festlegen. Dies hilft dem Framework erheblich, da es nicht versucht, leere Blöcke zu rendern.)

Vermeiden Sie Module, die hook_init () verwenden. Hook_init () wird auf jeder Seite ausgeführt, auch wenn Sie eine 403 oder eine 404 erhalten, die alles verlangsamt (dies verlangsamt sogar die Generierungszeit von | imagecache | style und 404-Fehler in Dateien würden auftreten) Dämmerung langsam, nur um Ihnen zu sagen, dass die Datei nicht existiert).

Pierre
quelle
Hallo, hier meine ich mit Seitenausführungszeit den Wert, der vom Entwicklungsmodul unten auf der Seite angezeigt wird und nicht im allgemeinen Sinne des Drupal-Anforderungs- / Antwortzyklus verwendet wird, der auch SQL-Abfragen usw. umfasst. Meine Frage ist im Kontext des authentifizierten Benutzers. Wenn devel die Ausführungszeit von Seiten meldet, beinhaltet dies auch SQL-Abfragen?
Dipen
Ich bin mir nicht sicher, ob das Dateisystem ein Engpass wäre, da ich ein Linux-Dateisystem mit 15.000 U / min verwende. SQL-Abfragen dauern je nach Seite ungefähr 300-700 ms, aber die Ausführungszeit der Seite beträgt ~ = 3 Sekunden (von devel gemeldet). Nicht sicher, was sonst das Problem sein könnte.
Dipen
Oh, entschuldigung, ich habe Ihren ursprünglichen Beitrag falsch gelesen. Der Devel-Wert wird vom Booten bis zum Herunterfahren berechnet (das Devel-Modul hat einen eigenen PHP-Shutdown-Handler, um eine Menge Dinge zu erledigen, einschließlich dieser). Ich bin mir nicht sicher, wann es startet und wann es stoppt, aber die gesamte Drupal-Seitenerstellungszeit und die geschäftlichen Details sind in der Ausführungszeit dieser Seite enthalten. Ja, es enthält alles (einschließlich SQL-Abfragezeit und Latenz) und seine eigene Latenz (die Protokollierung von Entwicklungsabfragen hat auch Auswirkungen auf die Leistung).
Pierre