Eine Site, die ich mit Kohana erstellt habe, war gestern mit einem enormen Verkehrsaufkommen überfüllt, was mich veranlasste, einen Schritt zurückzutreten und einen Teil des Designs zu bewerten. Ich bin gespannt, welche Standardtechniken zur Optimierung von Kohana-basierten Anwendungen verwendet werden.
Ich interessiere mich auch für Benchmarking. Muss ich für jede Controller-Methode einrichten Benchmark::start()
und Benchmark::stop()
ausführen, um die Ausführungszeiten für alle Seiten anzuzeigen, oder kann ich Benchmarking global und schnell anwenden?
Ich werde die Cache-Bibliothek in der kommenden Zeit mehr nutzen, bin aber offen für weitere Vorschläge, da ich sicher bin, dass ich eine Menge tun kann, die mir im Moment einfach nicht bewusst ist.
quelle
Antworten:
Was ich in dieser Antwort sagen werde, ist nicht spezifisch für Kohana und kann wahrscheinlich für viele PHP-Projekte gelten.
Hier sind einige Punkte, die mir einfallen, wenn ich über Leistung, Skalierbarkeit, PHP usw. spreche.
Ich habe viele dieser Ideen bei der Arbeit an mehreren Projekten verwendet - und sie haben geholfen. also könnten sie wahrscheinlich auch hier helfen.
Erstens müssen bei Performances viele Aspekte / Fragen berücksichtigt werden :
Verwenden eines Reverse-Proxys
Das erste, was wirklich nützlich sein könnte, ist die Verwendung eines Reverse-Proxys wie Lack vor Ihrem Webserver: Lassen Sie so viele Dinge wie möglich zwischenspeichern , also nur Anfragen, die wirklich PHP / MySQL-Berechnungen benötigen (und natürlich einige andere Anfragen, wenn sie sich nicht im Cache des Proxys befinden , gelangen zu Apache / PHP / MySQL.
Informationen zur Verwendung eines Reverse-Proxys als Cache für eine PHP-Anwendung finden Sie beispielsweise unter Benchmark-Ergebnisse. 400% -700% Steigerung der Serverfunktionen mit APC und Squid-Cache .
(Ja, sie verwenden Squid, und ich habe über Lack gesprochen - das ist nur eine weitere Möglichkeit ^^ Lack ist neuer, aber eher dem Caching gewidmet.)
Wenn Sie das gut genug machen und es schaffen, nicht mehr zu viele Seiten immer wieder neu zu generieren, müssen Sie vielleicht nicht einmal Ihren Code optimieren ;-)
Zumindest vielleicht nicht in Eile ... Und es ist immer besser, Optimierungen durchzuführen, wenn Sie nicht zu stark unter Druck stehen ...
Als Nebenbemerkung: Sie sagen im OP:
Dies ist die Art von plötzlicher Situation, in der ein Reverse-Proxy buchstäblich den Tag retten kann , wenn Ihre Website damit fertig wird, nicht sekundengenau auf dem neuesten Stand zu sein:
Wie kann ich erkennen und überleben, dass ich „Slashdotted“ bin? könnte eine interessante Lektüre sein.
Auf der PHP-Seite der Dinge:
Zunächst einmal: Verwenden Sie eine aktuelle Version von PHP ? Mit neuen Versionen wird die Geschwindigkeit regelmäßig verbessert ;-)
Schauen Sie sich zum Beispiel Benchmark of PHP Branches 3.0 bis 5.3-CVS an .
Beachten Sie, dass die Leistung ein guter Grund ist, PHP 5.3 zu verwenden ( ich habe einige Benchmarks (auf Französisch) erstellt und die Ergebnisse sind großartig) ...
Ein weiterer guter Grund ist natürlich, dass PHP 5.2 das Ende seiner Lebensdauer erreicht hat und wird nicht mehr gewartet!
Verwenden Sie einen Opcode-Cache?
[apc.stat](https://php.net/manual/en/apc.configuration.php#ini.apc.stat)
für die Systemlast gut sein. Dies bedeutet jedoch, dass Änderungen an PHP-Dateien nur berücksichtigt werden, wenn Sie den gesamten Opcode-Cache leeren. Weitere Informationen hierzu finden Sie beispielsweise unter To stat () oder Not To stat ().Cache für Daten verwenden
So viel wie möglich ist es besser, nicht immer wieder dasselbe zu tun .
Die Hauptsache, über die ich nachdenke, sind natürlich SQL-Abfragen: Viele Ihrer Seiten führen wahrscheinlich dieselben Abfragen aus, und die Ergebnisse einiger dieser Abfragen sind wahrscheinlich fast immer dieselben ... Was viele "nutzlose" Abfragen bedeutet gemacht an die Datenbank, die Zeit damit verbringen muss, immer wieder dieselben Daten zu liefern.
Dies gilt natürlich auch für andere Dinge wie Webdienstaufrufe, das Abrufen von Informationen von anderen Websites, umfangreiche Berechnungen, ...
Es könnte für Sie sehr interessant sein, Folgendes zu identifizieren:
Speichern Sie diese Daten / Ergebnisse in einer Art Cache, damit sie leichter abgerufen werden können - schneller - und Sie nicht für "nichts" zu Ihrem SQL Server gehen müssen.
Große Caching-Mechanismen sind zum Beispiel:
Ich bin mir ziemlich sicher, dass Ihr Framework einige Cache-bezogene Dinge enthält. das weißt du wahrscheinlich schon, wie du gesagt hast "Ich werde die Cache-Bibliothek in der kommenden Zeit mehr nutzen" im OP ;-)
Profilerstellung
Nun wäre es eine gute Sache, die Xdebug- Erweiterung zu verwenden , um Ihre Anwendung zu profilieren : Sie ermöglicht es oft, ein paar Schwachstellen ganz einfach zu finden - zumindest, wenn es eine Funktion gibt, die viel Zeit in Anspruch nimmt.
Bei ordnungsgemäßer Konfiguration werden Profildateien generiert, die mit einigen Grafikwerkzeugen analysiert werden können, z.
Zum Beispiel hier ein paar Screenshots von KCacheGrind:
(Quelle: pascal-martin.fr ) (Quelle: pascal-martin.fr )
(Übrigens, der auf dem zweiten Screenshot dargestellte Callgraph kann normalerweise weder WinCacheGrind noch Webgrind, wenn ich mich richtig erinnere ^^)
(Danke @Mikushi für den Kommentar) Eine andere Möglichkeit, die ich nicht viel genutzt habe, ist die xhprof- Erweiterung: Sie hilft auch bei der Profilerstellung, kann Callgraphs generieren - ist aber leichter als Xdebug, was bedeutet, dass Sie sie installieren können sollten ein Produktionsserver.
Sie sollten es auch außerhalb von XHGui verwenden können , um Daten zu visualisieren.
Auf der SQL-Seite der Dinge:
Nachdem wir ein wenig über PHP gesprochen haben, beachten Sie, dass es mehr als möglich ist, dass Ihr Engpass nicht die PHP-Seite der Dinge ist , sondern die Datenbank ...
Mindestens zwei oder drei Dinge hier:
EXPLAIN
Anweisung, wenn Sie MySQL verwendenlog_slow_queries
, um eine Liste der Anforderungen zu erhalten, die "zu viel" Zeit in Anspruch nehmen , und Ihre Optimierung anhand dieser Anforderungen starten.Dennoch sind die beiden wichtigsten Dinge:
Und was nun?
Wenn Sie noch lesen, was könnte noch optimiert werden?
Nun, es gibt noch Raum für Verbesserungen ... Einige architekturorientierte Ideen könnten sein:
Nun, vielleicht sind einige dieser Ideen in Ihrer Situation etwas übertrieben ^^
Aber trotzdem ... Warum studieren Sie sie nicht ein bisschen, nur für den Fall? ;-);
Und was ist mit Kohana?
Ihre erste Frage betraf die Optimierung einer Anwendung, die Kohana verwendet ... Nun, ich habe einige Ideen veröffentlicht, die für jede PHP-Anwendung gelten ... Das heißt, sie gelten auch für Kohana ;-)
(Auch wenn sie nicht spezifisch dafür sind ^^)
Ich sagte: Cache verwenden; Kohana scheint einige Caching-Sachen zu unterstützen (Du hast selbst darüber gesprochen, also nichts Neues hier ...)
Wenn es etwas gibt, das schnell erledigt werden kann, probiere es aus ;-)
Ich sagte auch, Sie sollten nichts tun, was nicht notwendig ist. Gibt es in Kohana standardmäßig etwas, das Sie nicht benötigen?
Beim Surfen im Internet scheint es zumindest etwas mit XSS-Filterung zu tun zu haben. brauchst du das?
Dennoch sind hier einige Links, die nützlich sein könnten:
Fazit?
Und zum Schluss ein einfacher Gedanke:
Ich sage nicht, dass Sie nicht optimieren sollten: Sie sollten definitiv!
Aber entscheiden Sie sich für "schnelle" Optimierungen, die Ihnen zuerst große Vorteile bringen : Wenn Sie einen Opcode-Cache verwenden, können Sie die CPU-Auslastung Ihres Servers um 10 bis 50 Prozent senken ... Die Einrichtung dauert nur ein paar Minuten. ) Auf der anderen Seite 3 Tage für 2 Prozent verbringen ...
Übrigens: Bevor Sie etwas unternehmen: Setzen Sie einige Überwachungsfunktionen ein , damit Sie wissen, welche Verbesserungen vorgenommen wurden und wie!
Ohne Überwachung haben Sie keine Ahnung, was Sie getan haben ... Nicht einmal, ob es sich um eine echte Optimierung handelt oder nicht!
Zum Beispiel könnten Sie so etwas wie RRDtool + Kakteen verwenden .
Und es ist immer großartig, deinem Chef ein paar schöne Grafiken mit einem CPU-Lastverlust von 40% zu zeigen ;-)
Wie auch immer, und um wirklich zu schließen: Viel Spaß!
(Ja, das Optimieren macht Spaß!)
(Ergh, ich hätte nicht gedacht, dass ich so viel schreiben würde ... Ich hoffe, zumindest einige Teile davon sind nützlich ... Und ich sollte mich an diese Antwort erinnern: könnte zu anderen Zeiten nützlich sein. ..)
quelle
Verwenden Sie XDebug und WinCacheGrind oder WebCacheGrind , um die langsame Codeausführung zu profilieren und zu analysieren.
(Quelle: jokke.dk )
quelle
Profilcode mit XDebug .
Verwenden Sie viel Caching. Wenn Ihre Seiten relativ statisch sind, ist Reverse Proxy möglicherweise der beste Weg, dies zu tun.
quelle
Kohana ist sehr schnell einsatzbereit, mit Ausnahme der Verwendung von Datenbankobjekten. Um Zombor zu zitieren: "Sie können die Speichernutzung reduzieren, indem Sie sicherstellen, dass Sie das Datenbank-Ergebnisobjekt anstelle von Ergebnis-Arrays verwenden." Dies macht einen RIESIGEN Leistungsunterschied auf einer Site, die zugeschlagen wird. Es verbraucht nicht nur mehr Speicher, sondern verlangsamt auch die Ausführung von Skripten.
Außerdem müssen Sie Caching verwenden. Ich bevorzuge Memcache und verwende es in meinen Modellen wie folgt:
Dies erhöht auch die Leistung erheblich. Die beiden oben genannten Techniken verbesserten die Leistung einer Site um 80%.
Wenn Sie weitere Informationen darüber geben, wo Ihrer Meinung nach der Engpass liegt, könnten wir sicher bessere Ideen geben.
Schauen Sie sich auch yslow (google it) an, um weitere Leistungstipps zu erhalten.
quelle
Eng verwandt mit Kohana (wahrscheinlich haben Sie dies bereits getan oder nicht):
Im Produktionsmodus:
Nur meine 2 Cent :)
quelle
Ich stimme den XDebug- und Caching-Antworten voll und ganz zu. Schauen Sie nicht in die Kohana-Ebene, um sie zu optimieren, bis Sie Ihre größten Geschwindigkeits- und Skalierungsengpässe identifiziert haben.
XDebug teilt Ihnen mit, wo Sie die meiste Zeit verbracht haben, und identifiziert "Hotspots" in Ihrem Code. Bewahren Sie diese Profilinformationen auf, damit Sie Leistungsverbesserungen durchführen und messen können.
Beispielproblem und Lösung: Wenn Sie feststellen, dass Sie jedes Mal teure Objekte aus der Datenbank erstellen, die sich nicht oft ändern, können Sie sie mit memcached oder einem anderen Mechanismus zwischenspeichern. Alle diese Leistungskorrekturen nehmen Zeit in Anspruch und erhöhen die Komplexität Ihres Systems. Achten Sie daher auf Ihre Engpässe, bevor Sie mit der Korrektur beginnen.
quelle