Nun, wie viel Verkehr haben die tatsächlichen Superuser- und Serverfault-Sites? Hypothesen nützen nicht viel, wenn sie nicht genug Informationen haben, um die Antwort zu erleichtern ...
Die Prozessanzahl im ungünstigsten Fall sollte die maximale Anzahl der Anforderungen pro Sekunde sein, die die Site verarbeiten kann, geteilt durch die Anzahl der Anforderungen pro Sekunde, die ein Prozess verarbeiten kann, wenn alle diese Anforderungen an Ihre langsamste Aktion gesendet werden (z. B. den Kehrwert der Bearbeitungszeit dieser Aktion). Fügen Sie den gewünschten Fudge-Faktor hinzu, basierend auf dem Konfidenzintervall Ihrer Anforderungs- / Sekunden- und Zeitmessungen.
Die durchschnittliche Fallzahl ist dieselbe, aber Sie dividieren die Anforderung / Sek. Durch das gewichtete Mittel Ihrer Anforderungen pro Sekunde für jede Aktion (die Gewichtung gibt den Prozentsatz der Anforderungen an, von denen Sie erwarten, dass sie diese bestimmte Aktion treffen). Auch hier sind Fudge-Faktoren nützlich.
Die tatsächliche Obergrenze für die Anzahl der Prozesse, die Sie auf dem Computer ausführen können, hängt von der Speichergröße ab, die jeder Prozess benötigt. Spoolen Sie einen Prozess und führen Sie dann eine Reihe von speicherhungrigen Aktionen aus (die normalerweise viele Daten abrufen und verarbeiten), wobei Sie einen realistischen Datensatz verwenden (wenn Sie nur einen Spielzeugdatensatz zum Testen verwenden, z. B. 50 oder 100) Wenn dann eine Ihrer Aktionen jede Zeile in der Tabelle abruft und manipuliert, ist dies kein gutes Maß dafür, wann diese Tabelle auf 10.000 Zeilen anwächst, um zu sehen, wie hoch die Speichernutzung ist. Sie können die Speichernutzung pro Prozess künstlich einschränken, indem Sie ein Skript verwenden, das Worker abruft, die einen bestimmten Schwellenwert für die Speichernutzung erreichen. Dies kann zu unangenehmen Problemen führen, wenn Sie diesen Schwellenwert zu niedrig festlegen.
Sobald Sie Ihre Speicherauslastung ermittelt haben, ziehen Sie eine gewisse Menge an Speicher für den System-Overhead ab (ich selbst mag 512 MB), ziehen einen Stapel mehr ab, wenn andere Prozesse auf demselben Computer ausgeführt werden (wie eine Datenbank), und dann einige mehr, um sicherzustellen, dass Ihnen nicht der Cache-Speicherplatz ausgeht (hängt von der Größe Ihres Arbeitsspeichers ab, aber auch hier würde ich nicht weniger als 512 MB verwenden). Dies ist die Speichermenge, die Sie durch die prozessbezogene Speichernutzung dividieren, um die Obergrenze zu erreichen.
Wenn die Anzahl der Prozesse, die Sie zur Wartung Ihrer Spitzenlast benötigen, größer ist als die Anzahl der Prozesse, die Sie in die Box einpassen können, benötigen Sie mehr Computer (oder im einfachsten Fall, um die Datenbank auf einen anderen Computer zu verschieben).
Sie haben mehrere Jahre Erfahrung in der Skalierung von Websites, die in einem kleinen und einfachen SF-Beitrag zusammengefasst sind.
Die Antwort von womble ist großartig, wenn auch etwas schwer zu verstehen und für Unerfahrene zu beantragen. Ich möchte einige empirische Zahlen und den Vergleich von "einfachen Inhalten" und "E-Commerce" -Anwendungen nennen.
Es gibt nicht viel Material, um verschiedene Anwendungsfälle in Bezug auf die entsprechende Konfiguration von mod_wsgi festzulegen, daher hoffe ich, dass es in Ordnung ist, hier eine kleine Prosa zu verwenden.
A) CMS Sites & Microsites
Wir betreiben mehrere Kundenwebsites, von denen die meisten Content-Websites oder Micro-Websites sind, auf denen Django CMS, einige benutzerdefinierte Formulare und manchmal Sellerie für geplante Hintergrundaufgaben gehostet werden. Diese Sites sind nicht ressourcenhungrig. Einige von ihnen laufen problemlos parallel auf einem einzigen 4-Core Intel Xeon mit 32 GB RAM. Hier ist die Konfiguration, die wir für jede dieser Sites verwenden:
WSGIDaemonProcess example.com user=www-data processes=2 maximum-requests=100
Ich spreche von ungefähr 40 Sites auf einem einzelnen Server, von denen die meisten mit ihrer Staging-Site im Standby-Modus ausgeführt werden. Mit 2 Prozessen (standardmäßig mit jeweils 15 Threads) sind die Sites gut ausgelastet, auch wenn ihre Fähigkeit zur Zuweisung von Serverressourcen eingeschränkt ist. Warum dieses Setup ausreicht, lässt sich mit der einfachen Art der (CMS-) Anwendung begründen: Es wird nie erwartet, dass eine Anforderung länger als ein paar Millisekunden dauert. Apache bleibt immer entspannt, ebenso wie die CPU-Last.
B) E-Commerce-Sites
Komplexere Sites, die wir anbieten, zeichnen sich durch immer noch rechengünstige lokale Operationen aus, aber externe Abhängigkeiten (z. B. Webdienste, die Buchungsdaten bereitstellen), die in Bezug auf die Transaktionszeit teuer sind. Vorgänge mit externen Anforderungen belegen Threads viel länger, sodass Sie mehr Threads benötigen, um die gleiche Anzahl von Benutzern zu bedienen (im Vergleich zu einer einfachen CMS-Site von oben). Noch schlimmer ist, dass Threads gelegentlich blockiert werden, wenn ein externer Dienst eine Anfrage nicht sofort beantworten kann, manchmal für ein paar Sekunden. Dies kann zu dem unangenehmen Nebeneffekt führen, dass Threads, die Anforderungen an dieselbe Servicewarteschlange senden, so lange in Betrieb bleiben, bis alle verfügbaren mod_wsgi-Threads aufgebraucht sind und das Warten blockiert wird.
In diesen Szenarien haben wir versucht,
6
Prozesse zu verwenden , ohne große Unterschiede zu bemerken, und12
dabei eine unvergleichliche Steigerung der Leistung und der Betriebsstabilität festgestellt:WSGIDaemonProcess example.com user=www-data processes=12 maximum-requests=100
Einige einfache Auslastungstests mit 150 und 250 parallelen Benutzern können von der Site problemlos durchgeführt werden, wobei die Site gut reagiert (während
2
die Site bei Prozessen nicht mehr für die gleichzeitige Verpflegung von 50 Benutzern geeignet ist). Der Intel Xeon mit 2 CPUs und 6 Kernen und 32 GB RAM ist unter dieser Last mit deutlich weniger als 25% der CPU ausgelastet. Auch die RAM-Auslastung bleibt mit weniger als 25% nahezu konstant. Beachten Sie, dass wir hier einen dedizierten Computer nur für einen einzelnen Standort verwenden, damit wir keine Ressourcen stehlen, die andere Standorte möglicherweise benötigen.Fazit
Die Verwendung einer höheren Anzahl von Prozessen ist ein Kompromiss zwischen dem Ermöglichen, dass Apache die verfügbaren Systemressourcen nutzt oder nicht. Wenn Sie ein stabiles Serversystem (nicht Website!) Unter "Angriffsbedingungen" betreiben möchten, halten Sie die Anzahl niedrig. Wenn Sie möchten, dass Apache Sie bei Bedarf bei der Verwendung von Systemressourcen (CPU, RAM) unterstützt, wählen Sie eine höhere Zahl. Wie hoch Sie gehen können, hängt in etwa von der oben angegebenen akzeptierten Antwort ab und wird letztendlich durch die verfügbare CPU-Leistung und den verfügbaren Arbeitsspeicher eingeschränkt.
(PS: Ich behalte den Abschnitt "ConfigurationDirectives" des Modwsgi-Projekt-Wikis unter meinem Kopfkissen, damit ich Apache-ähnliche Hintergrundinformationen lesen kann. Vergewissern Sie sich auch, dass Sie die offenen Verbindungen Ihres Apache-Servers verstehen und überwachen .)
quelle
threads
15 ist laut Dokumentation . Ich glaube nicht, dass es von Vorteil ist, dies explizit anzugeben. Tatsächlich erinnere ich mich, dass ich es aus einem Grund weggelassen habe: Es gab einen Post auf SO oder einen Teil einer Dokumentation, in der empfohlen wurde, den Wert wegzulassen, um Nebenwirkungen zu vermeiden (ich weiß, das klingt komisch). Leider finde ich diese Quelle jetzt nicht. Für den Rest Ihrer Frage (GIL) sind Sie wahrscheinlich kompetenter als ich, sorry.You should never use maximum-requests in a production system unless you understand the implications and have a specific temporary need.