Was ist das beste Magento Server Setup?


121

Wir arbeiten derzeit mit der Anforderung, dass die erste Antwort vom Webserver in Großbritannien unter 200 ms eingehen muss. Derzeit sind unter 2 dedizierten Webservern unter Load Balancer und 1 DB-Server, wir kommen bei 800ms.

Die Site hat im Moment weniger als 5 Kunden, 2 Produkte, 4 Kategorien, es gibt kein Frontend zur Site im Moment, es ist stilfrei und frei von Bildern.

Es wird auch mit Lack auf Nginx betrieben.

Kann mir jemand einen Rat zu Webserver-Setups geben? Warum kommen unsere langsam rein? Was können Sie empfehlen, um dies zu optimieren? Sie müssen 400% schneller sein!


2
Wenn die Site aus dem Lack-Cache stammt, muss sie in <100ms vorhanden sein
Fabian Blechschmidt

Wofür versuchst du genau zu sorgen? Wie viele einzelne Besucher pro Stunde? Wie viele Seiten / Besucher? Wie viele Bestellungen pro Stunde? Welche Spezifikation haben die Server? Magento-Version?
Ben Lessani - Sonassi

Wie gehen Sie mit der Replikation zwischen den Servern um? Welche Netzwerkverbindung besteht zwischen den Computern? Welche PHP-Version verwenden Sie? Welche MySQL-Version verwenden Sie? Welches Server-Betriebssystem verwenden Sie?
Ben Lessani - Sonassi

Haben Websites mit höherem TTFB-Ranking auf der ersten Seite neben Google bei Amazon, eBay und anderen gesehen, nur einer der vielen technischen Faktoren - ohne Berücksichtigung der vielen geschäftlichen Faktoren. Sie nähern sich von unten nach oben, was für KMU in Ordnung ist, aber um zu den Top-Websites zu zählen, funktioniert es anders. Sie benötigen dynamische Seitenladevorgänge von 1 bis 2 Sekunden. Wir haben Websites mit 10.000 Produkten auf 5 bis 10 Mal kleinerer Hardware und ohne FPC (dynamischer Inhalt) mit niedrigeren TTFB-Werten und einer durchschnittlichen Fertigstellung der Website von <1 Sekunde. Auch bei Tier 1/2-Anbietern - besseres Ranking, aber langsamer als bei Tier 3/4 & 5/6-Anbietern - versteckt fpc das Problem. Entfernen Sie es daher vorerst.

Antworten:


146

Ich werde beißen.

Diese erste Antwort vom Webserver muss in Großbritannien unter 200 ms eingehen. Derzeit
gibt es kein Frontend für die Website, sie ist frei von Stilen und Bildern .

Sie werden diese Zahlen nicht ohne die Hilfe von Varnish oder FPC (oder beidem) erreichen. Ich würde mit Sicherheit hoffen, dass die Abbildung nicht auch statischen Inhalt enthalten muss (wenn Sie sich entscheiden, ihn hinzuzufügen) - da dies so gut wie unmöglich ist (es fehlen nur wenige bis gar keine Bilder / js / css).

Wir kommen um 800ms an.
Es wird auch auf Nginx mit Lack gefahren

Sie haben Varnish falsch konfiguriert.

Eine richtig konfigurierte Installation von Varnish führt zu Ladezeiten von <100 ms (näher an <10 ms).

In der Tat, für Magento sollten Sie so etwas erwarten,

Wenn ein Kunde nicht eingeloggt ist ...
Dh. Keine einmalige Sitzung erstellt (zum Warenkorb / Wunschzettel hinzufügen, einloggen usw.)

--1.2s--------0.8s-----------------0.6s----------------0.1s--------------0.08s----
  Uncached    Mage default cache   Partial FPC cache   Total FPC cache   Varnish

Wenn ein Kunde angemeldet ist ...
Dh. Eine einmalige Sitzung erstellt haben (angemeldet, Artikel im Warenkorb usw.). An diesem Punkt wird Varnish wahrscheinlich ausgeschaltet sein. Wenn Sie sich für die Verwendung von ESIs entschieden haben - abhängig von den umgekehrten Aufrufen -, kann diese entweder eine ähnliche Seitenladezeit beibehalten wie der FPC-Cache (aufgrund des Bootstrap-Overheads) - oder die Seitenladezeiten erhöhen, ohne dass sie zwischengespeichert werden.

--1.4s--------0.8s-----------------0.6s--------------
  Uncached    Mage default cache   Total FPC cache   

Es geht nicht darum, den Lack abzustimmen - es geht darum, "dass Sie überhaupt nichts zwischenspeichern" .


Die idealen Magento Server Konfigurationsdateien

Es gibt keinen, na ja, nicht ganz.

Wir betreiben über 400 Server, allesamt reine Magento-Stores - unterschiedlicher Größe und Kapazität. Und es ist selten, dass die Konfigurationsdateien, die wir auf einer haben, mit denen einer anderen übereinstimmen. Das liegt daran, dass nicht alle Unternehmen gleich sind.

Engpässe können sich aus vielen verschiedenen Gründen bilden:

  1. Hohe Anzahl von gleichzeitigen Besuchern mit aktiven Sitzungen
  2. Opfer von "schlechten" Crawl-Bots, die die notwendige, unschätzbare Last erzeugen
  3. Hoher Anteil geschichteter Navigationstreffer
  4. Hohe Anzahl von Suchanfragen
  5. Hohes Transaktionsvolumen pro Stunde
  6. Schlecht gebaute Vorlage
  7. Zu viele / langsame / sperrige Erweiterungen von Drittanbietern
  8. Veraltete eingehende Links führen zu einem hohen Anteil von 404 Treffern
  9. Netzwerkschnittstellenkapazität am Limit
  10. Großer / komplexer Katalog (viele Produkte / Kategorien / Attribute)

Bei Geschäften in allen Bereichen dieses Spektrums hat jeder eine andere Herangehensweise, um eine optimale Leistung zu erzielen.

Um die oben beschriebenen Probleme zu lösen; Wir werden absichtlich vermeiden, nur "mehr / bessere Hardware" anzugeben.

  1. Verwenden Sie eine FPC, die über die von Varnish hinausgeht
  2. Filtern / blockieren Sie fehlerhafte Bots am Netzwerkrand - oder leiten Sie alle Anfragen an Varnish um, unabhängig vom Cookie-Status / der URL
  3. Ändern Sie die Standardnavigation in SOLR, und machen Sie die Filter für die Navigation in Ebenen abhängig
  4. Ändern Sie die Aktiensuche in SOLR
  5. Verteilen Sie die MySQL-Last auf die Master / Slave-Konfiguration - tun Sie dies nur, wenn Sie garantiert haben, dass die Browserbelastung von Varnish / FPC absorbiert wird
  6. Erstellen Sie die Vorlage neu
  7. Zieh sie aus
  8. Überwachen Sie die Zugriffsprotokolle kontinuierlich und schreiben Sie die URLs bei Nginx / Varnish vor der Auslieferung neu. Wenn Sie dies auf Nginx-Ebene tun, stellen Sie sicher, dass Varnish 301/302 Weiterleitungen zwischenspeichert.
  9. Teilen Sie statische Inhalte auf ein CDN auf oder verbessern Sie die Konnektivität
  10. Füge mehr Hardware hinzu (nun, wir mussten es irgendwann sagen)

Aus diesem Grund werden Sie wahrscheinlich feststellen, dass es keine Nginx-Konfigurationsdatei, PHP-FCGI-Pool-Konfigurationsdatei, MySQL-Konfigurationsdatei oder Lack-Konfigurationsdatei geben wird, die gleich sein werden. Verbinden Sie dies mit der Hardware, die sich selbst ändert. Verfügbarer Arbeitsspeicher, E / A-Leistung (Festplatte und Netzwerk) und CPU - und Sie werden feststellen, dass es geringfügige Unterschiede gibt, die zu dem gewünschten Leistungsgewinn von 400% führen -, aber keine schnelle Antwort, die Sie direkt online finden.

Sie können das von Peer 1 gesponserte Magento- Whitepaper zu Performance kopieren und einfügen (wir würden es nicht empfehlen). Ich hoffe, dass die Einstellungen den verfügbaren Speicher, die Thread-Limits, die TCP / IP-Zustände und die E / A-Kapazität nicht überschreiten und zu einer geringeren Leistung führen als eine Vanille-Apache / mod_php-Konfiguration.

Also lasst uns weitermachen.

Der ideale Magento Server Stack

Dies ist wahrscheinlicher, um Sie näher an die Realität zu bringen. Ein gutes Beispiel, um dies zu demonstrieren, ist die Konfiguration eines speziellen Magento-Betriebssystems, MageStack

MageStack - Magento-Betriebssystem

Nehmen Sie die separaten Unterkomponenten und Sie haben eine Liste der optimalsten / kritischsten Software, wenn sie richtig konfiguriert ist , um einen Magento-Store zu betreiben. Vor allem:

Firewall, DOS-Filter, Load Balancer, Firnis, Nginx, PHP, Redis, Memcached, MySQL

Wenn Sie also fragen:

Was ist das beste Magento Server Setup?

Was genau ist dein Ziel?

  1. Hohe Verfügbarkeit
  2. Verlässlichkeit
  3. Einfache Administration
  4. Performance
  5. Skalierbarkeit

Genug Vorlesungen, wie würden wir das machen?

Um die Antwort auf einen Serverfehler teilweise widerzuspiegeln , gehen Sie ähnlich vor. Sie haben 3 Server zur Verfügung - orientieren Sie diese also zuerst so optimal wie möglich. Wir werden eine hochverfügbare Lösung vermeiden, da dies den Rahmen dieser Antwort sprengt.

Die für eine Konfiguration mit mehreren Servern erforderlichen Unterkomponenten sind:

  • Firewall
  • Lastenausgleicher
  • Webserver
  • MySQL Server
  • Gemeinsamer Speicher

Deshalb werden wir einige Systeme für verschiedene Zwecke einsetzen. Die PCI-DSS-Konformität schreibt für jeden Server eine Rolle vor. Mit 5 Rollen und 3 Servern sind Sie sofort in Gefahr. MageStack umgeht dies mithilfe der Virtualisierung - Sie könnten das Gleiche tun.

Server 1: Load Balancer + Webserver
Server 2: Webserver
Server 3: Datenbankserver

Ohne geringe Latenz und erhebliche Netzwerkbandbreite (> 1 Gbit / s, <125 µs) anstelle eines gemeinsamen Speichers ist es besser, das Stammverzeichnis des Speichers auf jedem Computer zu speichern und die Daten entweder in Echtzeit zu replizieren ionotifyoder zu verwenden ein cronJob. Auch hier vermeiden wir Netzwerkdateisysteme wie NFS oder replizierte Blockgeräte wie Gluster oder DRBD, da eine umfassende Optimierung und eine angemessene Netzwerkbandbreite erforderlich sind.

Lack muss so nah wie möglich vorne sitzen. Varnish kann SSL jedoch nicht entschlüsseln. Kombinieren Sie es also mit einem SSL-Terminator. Nginx, Pound, Stunnel, Stud usw. Der eingebaute Load Balancer in Varnish ist nicht besonders gut - aber für eine Einrichtung mit zwei Servern ausreichend.

Nginx + PHP-FPM ist in Ordnung, aber trinken Sie nicht zu viel von der Nginx Kool-Hilfe. Es wird fast identisch mit einer traditionellen Apache / mod_php-Konfiguration ablaufen. Hier ist eine gute Lektüre, warum man Nginx nicht verwenden sollte . Nginx ist gut, sehr gut, aber es ist sicherlich kein Engpass in einem Magento-Geschäft - und angesichts seiner Komplexität und des Mangels an nativem Magento-Support. Die meisten unerfahrenen Systemadministratoren würden von der Verwendung von Apache / mod_php über alles andere profitieren. Dies scheint eine archaische Empfehlung für die Verwendung von PHP-FPM zu sein - aber unsere Leistungstests haben gezeigt, dass die Leistung mit der Nginx-Lösung nur ~ 7% schneller ist - wenn sie richtig konfiguriert ist. Das Tuning und die Erfahrung, die für ein leistungsstarkes, zuverlässiges Nginx / PHP-FPM-Setup erforderlich sind, sind ziemlich umfangreich, um Apache / mod_php zu übertreffen. Was auch immer Sie verwenden, ist Ihr Anruf.

Der Datenbankserver ist einfach, MySQL. Wie bereits erwähnt, wird jedoch eine Master / Slave-Konfiguration empfohlen, wenn Sie eine hochgradig konvertierende Site haben. Ob Sie diesem Ansatz folgen sollten, erfahren Sie in diesem Artikel .

Dann werden Ihre peripheren Back-End-Caches, Memcached und Redis. In kleineren Geschäften führt das Speichern von Sitzungen in einer Memcache-Instanz und des schnellen Back-End-Caches in einer anderen zu guten Leistungsvorteilen. Wir raten davon ab, die Cache-Tags in einem langsamen Backend zu speichern, da dies mehr Probleme verursacht als es gibt. Bei einer Memcached-Konfiguration müssen Sie also auf das Cache-Tagging verzichten . Stattdessen verwenden wir eine Konfiguration wie diese .

Redis ist nicht in Magento integriert, aber mit der Erweiterung von Colin Mollenhour - eine bessere Lösung als Memcache - werden Cache-Tags, Sitzungsspeicher und sogar permanenter Cache-Speicher unterstützt - dies ist nicht ganz so flüchtig wie Memcache . Aber es hat seine Nachteile. Wir haben in großen Produktionsgeschäften (> 500 Bestellungen / Stunde,> 30.000 Unikate / Stunde) festgestellt, dass sich der Cache (und die Tags) sehr schnell füllen können und der LRU-Mechanismus nach Erreichen des Sättigungspunkts etwas ausfällt ( trotz unterschiedlicher Einstellungen) und verursacht einen massiven unmittelbaren Engpass. Es ist daher ratsam, alte Datensätze regelmäßig manuell zu bereinigen.

Also, welche Hardware sollte für was verwendet werden?

Webserver: Schnellste CPU, die meisten CPU-Kerne, Verhältnis von 2 GB RAM / Core
DB-Server: Schnelle CPU, schnellste Festplatten-E / A, die meisten RAM

Wenn Sie also Ihre 3 Maschinen für mehrere Zwecke einsetzen, ist das beste Layout:

Server 1: SSL Terminator -> Lack -> Nginx / Apache> PHP
Server 2: Nginx / Apache> PHP, Redis, (MySQL Slave)
Server 3: MySQL

Bezüglich der spezifischen Konfiguration jeder Anwendung. Das hängt von Ihren Hardwarespezifikationen, der Komplexität Ihres Geschäfts, Ihrem Besuchertyp und der Art des Besuchers sowie dem enormen Besucheraufkommen ab.


Sehr interessante Antwort. Zu Ihrer Information, es gibt einen defekten Link unter: "Stattdessen verwenden wir eine Konfiguration wie diese."
Zeugen Jehovas.

1
@JW. - Darn Link rot. Ich habe den Link aktualisiert.
Ben Lessani - Sonassi

30

Mit dieser Cluster-Konfiguration sind Sie auf einem guten Weg. Ich empfehle, einen dedizierten Cache-Host für Redis hinzuzufügen. Wählen Sie eine mit hoher CPU-Leistung und viel RAM (~ 64 GB).

Hier ist die vollständige Liste der Konfigurationen, die ich für einen hochverfügbaren, fehlertoleranten, verteilten und lastausgeglichenen LEMP-Cluster verwendet habe. Es enthält app/etc/local.xmldie core_config_dataTabelle und Konfigurationen für MySQL, php-fpm, nginx und Redis. Alle laufen unter Ubuntu 12.04 LTS 64-Bit. Die Konfigurationen beinhalten viele Optimierungen ohne Nachteile.

Höhepunkte

  • Admin Benutzer: 46
  • Kategorien: 2.450 (größte mit 2.400 Produkten)
  • Produktentitäten: 101.000
  • Kombinierte Produkte: 484
  • Produktbeziehungen: 54.000
  • Auf Lager und aktivierte konfigurierbare Produkte: 10.100
  • CMS-Blöcke: 3.100
  • CMS-Seiten: 1.400

August 2013 Verkehr:

  • 40 Millionen monatliche Seitenaufrufe
  • 2,3 Millionen einzelne Besucher
  • 46.000 monatliche Kassen
  • 89% der Besucher aus den USA

Web-Hosts

Hinter redundanten, hochverfügbaren Hardware-Firewalls und Hardware-Load-Balancern stehen 10 Hosts. Die meisten statischen Assets werden auf einen CDN ausgelagert.

  • Standortweite durchschnittliche Antwortzeit: 282 ms
  • Durchschnittliche FPC-Antwort: 48 ms
  • Belastungsdurchschnitt: 0,6 bis 1,0 (in Tests verschlechtert sich die Leistung um 35%, wenn die Belastungsdurchschnitte ~ 5,0 erreichen)
  • Dual Intel Xeon CPU E3-1230 V2 bei 3,30 GHz (je 4 Kerne)
  • 32 GB DDR3 1333 MHz RAM

Module


Hosts zwischenspeichern

Es gibt zwei Hosts, auf denen Redis in einer Master-Slave-Konfiguration mit automatischem Failover ausgeführt wird. Drei Redis-Instanzen (Sitzungen, Backend und FPC) werden verwendet, um den Durchsatz zu erhöhen und das Persistenzverhalten zu optimieren.

  • 3000 Befehle pro Sekunde
  • 0,7 ms durchschnittliche Reaktionszeit
  • Lastdurchschnitt von 1,0 bis 1,5
  • Quad Intel Xeon CPU E5-2620 0 bei 2,00 GHz (je 6 Kerne)
  • 128 GB gepufferter DDR3 1333 MHz RAM
  • Mechanische Festplatten, RAID 1, Hardware-Controller

Datenbank-Hosts

Es gibt zwei Hosts, auf denen MySQL 5.6.11 in einer Master-Slave-Konfiguration mit warmem Failover ausgeführt wird.

  • 1.500 Befehle pro Sekunde
  • 1,1 ms durchschnittliche Reaktionszeit
  • Lastdurchschnitt von 0,1 (Master) und 0,4 (Slave)
  • Quad Intel Xeon CPU E7-2860 bei 2,27 GHz (je 10 Kerne)
  • 128 GB gepufferter DDR3 1333 MHz RAM
  • SSD, RAID 1 + 0, Hardware-Controller
  • MySQL 5.6.11 mit tcmalloc

Da Redis Single-Threaded ist, ist Ihr Cache-Host mit Quad-Hexa-Core-CPUs nicht etwas überlastet? Warum ist Ihr Slave-Lastdurchschnitt auch höher als der Master-Lastdurchschnitt?
ColinM

@ColinM: Ich habe den Server nicht gekauft. Ja, es ist überlastet! Der Slave wird für Magento-Leseverbindungen verwendet, sodass er nicht nur mit den Schreibvorgängen des Masters Schritt hält, sondern auch viele Lesethreads bedient.
parhamr


0

Ich möchte einen weiteren wichtigen Tipp hinzufügen, der die Geschwindigkeit der Magento-Seite verbessert, wenn sie nicht mit Lack zwischengespeichert und standardmäßig nicht aktiviert ist (die Ladezeit der Warenkorbseite wurde von 6 auf 1,5 Sekunden geändert).

Aktivieren Sie den Mysql-Abfrage-Cache in /etc/mysql/my.conf

query_cache_size = 268435456
query_cache_type= 1
query_cache_limit=1048576

Bei aktiviertem Cache-Typ ist die Cache-Größe der Wert, der vom Cache im Speicher verwendet wird, und das Cache-Limit ist die maximale Größe des Abfrageergebnisses, das zwischengespeichert werden soll


-2

Mit unserer aktuellen Konfiguration erhalten wir eine erste Antwort in 400 ms und das Dokument ist in 2 Sekunden fertig (unter Verwendung einer Standardverbindung von 5 MBit / s). Unsere Homepage hat eine Größe von 1 MB.

Unser Setup basiert auf AWS wie folgt: Wir haben eine ec2-Instanz mit einem Load Balancer, der mit einer RDS-Datenbank verbunden ist (mit Failover). Wir haben auch einen Ganzseiten-Cache mit einem Redis-Cache-Backend sowohl für den Cache-Speicher als auch für den Sitzungsspeicher implementiert.

Im Durchschnitt haben wir 300 - 400 Besucher pro Tag, aber mit Redis-Caching konnten wir den Ressourcenverbrauch für Ec2 auf ein Minimum reduzieren und gleichzeitig die Geschwindigkeit und die Kosten senken.

Der Grund für den Load Balancer ist, dass der ec2 so konfiguriert ist, dass er automatisch eine neue Instanz startet, wenn die seltene Möglichkeit besteht, dass Datenverkehrsspitzen auftreten, die das aktuelle Setup nicht verarbeiten kann.


Nur um die Vorteile der Verwendung eines Elastic Load Balancers in AWS zu erweitern: Sie können Ihre SSL-Verbindungen damit auslagern und müssen sich keine Gedanken über die Vielzahl von OpenSSL-Schwachstellen-Patches machen, die Sie bei der Verwaltung Ihrer EC2-Instanzen ständig anwenden müssen es selbst
Robbie Averill
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.