Frage

Eine Website, die ich mit Kohana erstellt habe, wurde gestern von enormem Traffic überschwemmt, was mich dazu veranlasste, einen Schritt zurückzutreten und einige Aspekte des Designs zu bewerten.Ich bin neugierig, was einige Standardtechniken zur Optimierung von Kohana-basierten Anwendungen sind.

Ich interessiere mich auch für Benchmarking.Muss ich etwas einrichten? Benchmark::start() Und Benchmark::stop() für jede Controller-Methode, um die Ausführungszeiten für alle Seiten zu sehen, oder kann ich Benchmarking global und schnell anwenden?

Ich werde die Cache-Bibliothek in Zukunft häufiger nutzen, bin aber offen für weitere Vorschläge, da ich mir sicher bin, dass ich noch vieles tun kann, was mir im Moment einfach nicht bewusst ist.

War es hilfreich?

Lösung

Was ich in dieser Antwort sagen werde, ist nicht spezifisch für Kohana und kann wahrscheinlich auf viele PHP-Projekte angewendet werden.

Hier sind einige Punkte, die mir in den Sinn kommen, 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, wenn es um Auftritte geht, gibt es welche viele Aspekte/Fragen, die es zu berücksichtigen gilt:

  • Konfiguration des Servers (sowohl Apache, PHP, MySQL, andere mögliche Daemons als auch System);Möglicherweise erhalten Sie weitere Hilfe dazu Serverfehler, Ich nehme an,
  • PHP-Code,
  • Datenbankabfragen,
  • Benutzen Sie Ihren Webserver oder nicht?
  • Können Sie irgendeine Art von Caching-Mechanismus verwenden?Oder benötigen Sie immer aktuellere Daten auf der Website?


Verwendung eines Reverse-Proxys

Das erste, was wirklich nützlich sein könnte, ist die Verwendung von a Reverse-Proxy, wie Lack, vor Ihrem Webserver:Lass es Cachen Sie so viele Dinge wie möglich, 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) Machen Sie es zu Apache/PHP/MySQL.

  • Zunächst einmal Ihr CSS/Javascript/Bilder -- nun ja, alles was statisch ist -- müssen wahrscheinlich nicht immer von Apache bedient werden
    • Sie können also all das über den Reverse-Proxy zwischenspeichern.
    • Das Bereitstellen dieser statischen Dateien ist für Apache keine große Sache, aber je weniger es für diese arbeiten muss, desto mehr kann es mit PHP tun.
    • Erinnern:Apache kann nur eine endliche, begrenzte Anzahl von Anfragen gleichzeitig bearbeiten.
  • Lassen Sie dann den Reverse-Proxy so viele PHP-Seiten wie möglich aus dem Cache bereitstellen:Gibt es wahrscheinlich einige Seiten, die sich nicht so oft ändern, und könnte aus dem Cache bereitgestellt werden.Anstatt einen PHP-basierten Cache zu verwenden, können Sie diesen von einem anderen, leichteren Server bereitstellen lassen (und sie von Zeit zu Zeit vom PHP-Server abrufen, damit sie immer fast auf dem neuesten Stand sind)?
    • Zum Beispiel, wenn Sie einige RSS-Feeds haben (Wir neigen im Allgemeinen dazu, diese zu vergessen, wenn wir versuchen, die Leistung zu optimieren.) die angefordert werden sehr oft, sie für ein paar Minuten im Cache zu halten, könnte Hunderte/Tausende von Anfragen an Apache+PHP+MySQL einsparen!
    • Das Gleiche gilt für die am häufigsten besuchten Seiten Ihrer Website, sofern sich diese mindestens ein paar Minuten lang nicht ändern (Beispiel:Startseite?), Dann ist keine CPU-Verschwendung erforderlich, um sie jedes Mal neu zu generieren, wenn ein Benutzer sie anfordert.
  • Möglicherweise gibt es einen Unterschied zwischen Seiten, die für anonyme Benutzer bereitgestellt werden (die gleiche Seite für alle anonymen Benutzer) und Seiten, die für identifizierte Benutzer bereitgestellt werden („Hallo Herr X, Sie haben neue Nachrichten“, zum Beispiel)?
    • Wenn ja, können Sie den Reverse-Proxy wahrscheinlich so konfigurieren, dass die Seite, die für anonyme Benutzer bereitgestellt wird, zwischengespeichert wird (basierend auf einem Cookie, typischerweise dem Sitzungscookie)
    • Das bedeutet, dass Apache+PHP weniger zu bewältigen hat:Nur identifizierte Benutzer – was möglicherweise nur ein kleiner Teil Ihrer Benutzer ist.

Um Verwendung eines Reverse-Proxys als Cache, für eine PHP-Anwendung können Sie sich zum Beispiel ansehen Benchmark-Ergebnisse zeigen eine 400- bis 700-prozentige Steigerung der Serverkapazitäten 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 immer wieder zu viele Seiten 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 sehr unter Druck stehen ...


Als Anmerkung:Du sagst im OP:

Ein Standort, den ich mit Kohana gebaut habe

Das ist die Art von plötzliche Situation, in der ein Reverse-Proxy buchstäblich den Tag retten kann, wenn Ihre Website es verträgt, nicht sekundenschnell auf dem neuesten Stand zu sein:

  • Installieren Sie es, konfigurieren Sie es und lassen Sie es immer -- jeden normalen Tag -- laufen:
    • Konfigurieren Sie es so, dass PHP-Seiten nicht im Cache bleiben.oder nur für kurze Zeit;So haben Sie stets aktuelle Daten angezeigt
  • Und an dem Tag, an dem Sie einen Slashdot- oder Digg-Effekt nutzen:
    • Konfigurieren Sie den Reverse-Proxy so, dass PHP-Seiten im Cache bleiben.oder für einen längeren Zeitraum;Vielleicht sind Ihre Seiten nicht von Sekunde zu Sekunde auf dem neuesten Stand, aber so übersteht Ihre Website den Digg-Effekt!

Über das, Wie kann ich „Slashdotted“ erkennen und überleben? könnte eine interessante Lektüre sein.


Auf der PHP-Seite:

Erstens:Benutzt du ein aktuelle Version von PHP?Mit neuen Versionen gibt es regelmäßig Geschwindigkeitsverbesserungen ;-)
Schauen Sie sich zum Beispiel an Benchmark der PHP-Branches 3.0 bis 5.3-CVS.

Beachten Sie, dass die Leistung ein guter Grund ist, PHP 5.3 zu verwenden (Ich habe einige Benchmarks erstellt (auf Französisch), und die Ergebnisse sind großartig)...
Ein weiterer guter Grund ist natürlich, dass PHP 5.2 das Ende seiner Lebensdauer erreicht hat und nicht mehr gepflegt wird!

Verwenden Sie einen Opcode-Cache?

  • Ich denke über APC – Alternativer PHP-Cache, zum Beispiel (pecl, Handbuch), die Lösung, die ich am häufigsten gesehen habe – und die auf allen Servern verwendet wird, auf denen ich gearbeitet habe.
  • In manchen Fällen kann es die CPU-Auslastung eines Servers erheblich senken (Ich habe gesehen, dass die CPU-Auslastung auf einigen Servern von 80 % auf 40 % anstieg, allein durch die Installation von APC und die Aktivierung seiner Opcode-Cache-Funktionalität!)
  • Grundsätzlich erfolgt die Ausführung eines PHP-Skripts in zwei Schritten:
    • Kompilierung des PHP-Quellcodes zu Opcodes (eine Art Äquivalent zum JAVA-Bytecode)
    • Ausführung dieser Opcodes
    • APC behält diese im Speicher, sodass bei jeder Ausführung eines PHP-Skripts/einer PHP-Datei weniger Arbeit anfällt:Holen Sie sich nur die Opcodes aus dem RAM und führen Sie sie aus.
  • Möglicherweise müssen Sie einen Blick darauf werfen APCs Einstellmöglichkeiten, Übrigens
    • Davon gibt es eine ganze Reihe, und einige können für Sie einen großen Einfluss auf Geschwindigkeit, CPU-Auslastung und Benutzerfreundlichkeit haben
    • Zum Beispiel Deaktivieren [apc.stat](https://php.net/manual/en/apc.configuration.php#ini.apc.stat) kann gut für die Systemlast sein;Dies bedeutet jedoch, dass an PHP-Dateien vorgenommene Änderungen nicht berücksichtigt werden, es sei denn, Sie leeren den gesamten Opcode-Cache.Weitere Einzelheiten hierzu finden Sie z. B. unter stat() oder nicht stat()?


Cache für Daten verwenden

So viel wie möglich ist es besser Vermeiden Sie es, immer wieder das Gleiche zu tun.

Das Wichtigste, woran ich denke, sind natürlich SQL-Abfragen:Viele Ihrer Seiten führen wahrscheinlich dieselben Abfragen aus, und die Ergebnisse einiger davon sind wahrscheinlich fast immer dieselben ...Was viel bedeutet "nutzlos" Abfragen an die Datenbank, die Zeit damit verbringen muss, immer wieder dieselben Daten bereitzustellen.
Dies gilt natürlich auch für andere Dinge wie Webdienstaufrufe, das Abrufen von Informationen von anderen Websites, umfangreiche Berechnungen usw.

Es könnte für Sie sehr interessant sein, Folgendes zu identifizieren:

  • Welche Abfragen häufig ausgeführt werden und immer die gleichen Daten zurückgeben
  • Welche anderen (schwer) Berechnungen dauern viel Zeit und liefern immer das gleiche Ergebnis

Und speichern Sie diese Daten/Ergebnisse in einer Art Cache, damit sie leichter abgerufen werden können – Schneller – und Sie müssen nicht umsonst auf Ihren SQL-Server zurückgreifen.

Tolle Caching-Mechanismen sind zum Beispiel:

  • APC:Zusätzlich zum Opcode-Cache, über den ich zuvor gesprochen habe, können Sie damit Daten im Speicher speichern.
  • Und/oder zwischengespeichert (siehe auch), was sehr nützlich ist, wenn Sie buchstäblich haben viele von Daten und/oder sind Verwendung mehrerer Server, wie es verteilt wird.
  • Natürlich können Sie über Dateien nachdenken;und wahrscheinlich noch viele andere Ideen.

Ich bin mir ziemlich sicher, dass Ihr Framework einige Cache-bezogene Dinge enthält.Das wissen Sie wahrscheinlich schon, wie Sie sagten „Ich werde die Cache-Bibliothek in Zukunft häufiger nutzen“ im OP ;-)


Profilierung

Nun wäre es eine nette Sache, das zu verwenden Xdebug Erweiterung auf Profilieren Sie Ihre Bewerbung:Dadurch lassen sich ein paar Schwachstellen oft ganz einfach finden – zumindest, wenn es eine Funktion gibt, die viel Zeit in Anspruch nimmt.

Richtig konfiguriert, werden Profilierungsdateien generiert, die mit einigen Grafiktools analysiert werden können, wie zum Beispiel:

  • KCachegrind:mein Favorit, funktioniert aber nur unter Linux/KDE
  • Wincachegrind für Windows;Es macht leider etwas weniger Dinge als KCacheGrind – es zeigt normalerweise keine Callgraphs an.
  • Webgrind das auf einem PHP-Webserver läuft, also überall funktioniert – aber wahrscheinlich weniger Funktionen hat.

Hier sind zum Beispiel ein paar Screenshots von KCacheGrind:

KCacheGrind : main screen
(Quelle: pascal-martin.fr)
KCacheGrind : Callgraph exported as an image
(Quelle: pascal-martin.fr)

(Übrigens ist der auf dem zweiten Screenshot dargestellte Callgraph normalerweise etwas, was weder WinCacheGrind noch Webgrind können, wenn ich mich richtig erinnere ^^ )


(Danke @Mikushi für den Kommentar) Eine andere Möglichkeit, die ich nicht oft genutzt habe, ist die xhprof Verlängerung :Es hilft auch bei der Profilerstellung und kann Callgraphs generieren – ist aber leichter als Xdebug, was bedeutet, dass Sie es auf einem Produktionsserver installieren können sollten.

Sie sollten es auch alleine verwenden können XHGui, was bei der Visualisierung von Daten hilfreich ist.


Auf der SQL-Seite:

Nachdem wir nun ein wenig über PHP gesprochen haben, stellen Sie fest, dass dies der Fall ist Es ist mehr als möglich, dass Ihr Engpass nicht auf der PHP-Seite liegt, aber die Datenbank ...

Mindestens zwei oder drei Dinge hier:

  • Sie sollten Folgendes festlegen:
    • Was sind die häufigsten Abfragen, die Ihre Anwendung durchführt?
    • Ob diese optimiert sind (Verwendung der richtige Indizes, hauptsächlich?), Verwendung der EXPLAIN Anleitung, wenn Sie MySQL verwenden
    • ob Sie einige dieser Abfragen zwischenspeichern könnten (siehe, was ich zuvor gesagt habe)
  • Ist Ihr MySQL gut konfiguriert?Ich weiß nicht viel darüber, aber es gibt einige Konfigurationsoptionen, die einen gewissen Einfluss haben könnten.

Dennoch sind die beiden wichtigsten Dinge:

  • Gehen Sie nicht zur Datenbank, wenn Sie Folgendes nicht benötigen: Cachen Sie so viel wie möglich!
  • Wenn Sie zur Datenbank wechseln müssen, verwenden Sie effiziente Abfragen:Indizes verwenden;und Profil!


Und was nun?

Wenn Sie noch lesen, was könnte noch optimiert werden?

Nun ja, es gibt noch Raum für Verbesserungen...Ein paar architekturorientierte Ideen könnten sein:

  • Wechseln Sie zu einer N-Tier-Architektur:
    • Stellen Sie MySQL auf einen anderen Server (2-stufig:eine für PHP;das andere für MySQL)
    • Verwenden Sie mehrere PHP-Server (und Lastausgleich der Benutzer zwischen diesen)
    • Verwenden Sie für statische Dateien einen anderen Computer mit einem einfacheren Webserver, wie zum Beispiel:
    • Verwenden Sie mehrere Server für MySQL, mehrere Server für PHP und davor mehrere Reverse-Proxys
    • Natürlich:Installieren zwischengespeichert Daemons auf jedem Server, der über eine beliebige Menge an freiem RAM verfügt, und nutzen Sie sie, um so viel wie möglich/sinnvoll zwischenzuspeichern.
  • Verwenden Sie etwas „Effizienteres“ als Apache?
    • Ich höre immer öfter davon Nginx, was angeblich großartig ist, wenn es um PHP und hochvolumige Websites geht;Ich selbst habe es nie benutzt, aber vielleicht finden Sie im Internet einige interessante Artikel darüber;

Nun, vielleicht sind einige dieser Ideen in Ihrer Situation etwas übertrieben ^^
Aber dennoch...Warum studieren Sie sie nicht ein wenig, 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 gepostet Ideen, die für jede PHP-Anwendung gelten...Was bedeutet, dass sie auch für Kohana gelten ;-)
(Auch wenn nicht spezifisch dafür ^^)

Ich sagte:Cache verwenden;Kohana scheint einige zu unterstützen Dinge zwischenspeichern (Du hast selbst darüber gesprochen, also hier nichts Neues ...)
Wenn es etwas gibt, das schnell erledigt werden kann, probieren Sie es aus ;-)

Ich habe auch gesagt, dass Sie nichts tun sollten, was nicht notwendig ist.Ist in Kohana standardmäßig etwas aktiviert, das Sie nicht benötigen?
Beim Durchsuchen des Internets scheint es, dass es zumindest etwas mit der XSS-Filterung zu tun hat.brauchst du das?

Dennoch sind hier ein paar Links, die nützlich sein könnten:


Abschluss?

Und zum Schluss noch ein einfacher Gedanke:

  • Wie viel wird es Ihr Unternehmen kosten, Ihnen 5 Tage zu bezahlen? – wenn man bedenkt, dass es eine angemessene Zeitspanne ist, um einige großartige Optimierungen vorzunehmen
  • Wie viel kostet der Kauf für Ihr Unternehmen? (bezahlen für?) ein zweiter Server und dessen Wartung?
  • Was ist, wenn Sie größer skalieren müssen?
    • Wie viel kostet es, 10 Tage zu verbringen?mehr?Optimieren Sie jeden möglichen Teil Ihrer Anwendung?
    • Und wie viel kostet ein paar Server mehr?

Ich sage nicht, dass Sie nicht optimieren sollten:Das solltest du auf jeden Fall!
Aber Entscheiden Sie sich für „schnelle“ Optimierungen, die Ihnen große Vorteile bringen Erste:Durch die Verwendung von Opcode-Cache können Sie möglicherweise die CPU-Auslastung Ihres Servers um 10 bis 50 Prozent senken ...Und die Einrichtung dauert nur ein paar Minuten ;-) Auf der anderen Seite: 3 Tage für 2 Prozent...

Ach ja, und übrigens:Bevor Sie etwas tun: Richten Sie einige Überwachungsmaßnahmen ein, damit Sie wissen, welche Verbesserungen vorgenommen wurden und wie!
Ohne Überwachung haben Sie keine Vorstellung davon, welche Auswirkungen das hat, was Sie getan haben ...Auch nicht, ob es sich um eine echte Optimierung handelt oder nicht!

Zum Beispiel könnten Sie so etwas verwenden wie RRDtool + Kakteen.
Und es ist immer großartig, Ihrem Chef ein paar schöne Grafiken mit einem Rückgang der CPU-Last um 40 % zu zeigen ;-)


Wie auch immer, und um es wirklich zum Schluss zu bringen: viel Spaß!
(Ja, Optimieren macht Spaß!)
(Ergh, ich hätte nicht gedacht, dass ich so viel schreiben würde ...Ich hoffe, dass zumindest einige Teile davon nützlich sind ...Und ich sollte mir diese Antwort merken:könnte ein andermal nützlich sein...)

Andere Tipps

Verwenden Sie XDebug und WinCacheGrind oder WebCacheGrind profilieren und zu analysieren, langsame Ausführung von Code.


(Quelle: jokke.dk )
WinCacheGrind

Profil Code mit XDebug .

eine Menge Caching verwenden. Wenn Ihre Seiten relativ statisch sind, dann Reverse-Proxy könnte der beste Weg, es zu tun.

Kohana ist sehr aus der Box sehr schnell, mit Ausnahme der Verwendung von Datenbankobjekten. Zitieren Zombor „Sie Speicherverbrauch reduzieren kann, indem sichergestellt wird Sie die Datenbank Ergebnis verwenden Objekt statt Ergebnis-Arrays.“ Dies macht einen HUGEE Performance-Unterschied auf einer Website, die knallte wird. Nicht nur, dass es mehr Speicher, es verlangsamt die Ausführung von Skripten.

Auch - Sie müssen Caching verwenden. Ich ziehe es memcache und verwenden Sie es in meinen Modellen wie folgt aus:

public function get($e_id)
{
    $event_data = $this->cache->get('event_get_'.$e_id.Kohana::config('config.site_domain'));

    if ($event_data === NULL)
    {
        $this->db_slave
            ->select('e_id,e_name')
            ->from('Events')
            ->where('e_id', $e_id);

        $result = $this->db_slave->get();
        $event_data = ($result->count() ==1)? $result->current() : FALSE;

        $this->cache->set('event_get_'.$e_id.Kohana::config('config.site_domain'), $event_data, NULL, 300); // 5 minutes
    }

    return $event_data;
}

Dies wird auch die Leistung erheblich steigern. Die beiden oben genannten Techniken verbessert eine Websites Leistung um 80%.

Wenn Sie mehr Informationen über gab, wo Sie denken, der Engpass ist, ich bin sicher, dass wir ein paar bessere Ideen geben könnte.

Überprüfen Sie auch YSlow (google es) für einige andere Leistungsspitzen.

Strictly im Zusammenhang mit Kohana (Sie wahrscheinlich bereits dieses getan haben, oder nicht):

Im Produktionsmodus:

  1. Aktivieren internes Caching (dies wird nur die Kohana Cache :: find_file Ergebnisse, aber dies kann tatsächlich helfen, eine Menge.
  2. Deaktivieren Profiler

Just my 2 cents:)

I ist vollkommen einverstanden mit dem XDebug und Caching-Antworten. Sehen Sie nicht in die Kohana Schicht zur Optimierung bis zur größten Geschwindigkeit und das Ausmaß Engpässe identifiziert haben.

XDebug wird Ihnen sagen, waren Sie die meiste Zeit verbringen und ‚Hotspots‘ im Code zu identifizieren. Bewahren Sie diese Profilinformationen, so dass Sie die Basislinie und messen Leistungsverbesserungen.

Beispiel Problem und Lösung: Wenn Sie feststellen, dass Sie jedes Mal teure Objekte aus der Datenbank sind aufgebaut, die nicht wirklich oft ändern, dann können Sie sehen sie mit Memcached oder einem anderen Mechanismus bei Caching. Alle diese Leistung Behebungen einige Zeit dauern, und die Komplexität zu Ihrem System, so Ihrer Engpässe sicher sein, bevor Sie sie beginnen zu fixieren.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top