Optimale Anzahl von Einhornprozessen pro CPU


16

Wir betreiben eine Ruby on Rails-Web-App unter Unicorn. Unsere App ist nicht streng an die CPU gebunden (wir haben ein duales Xeon E5645-System mit 12 Kernen und einen Spitzenlast-Durchschnittswert von etwa 6). Wir haben anfangs mit 40 Unicorn-Mitarbeitern angefangen, aber der Speicherbedarf für Anwendungen hat sich im Laufe der Zeit erhöht. Jetzt müssen wir also die Anzahl der Arbeitsprozesse senken. Ich dachte, dass die Standardformel (Anzahl der CPU-Kerne + 1) auch für Unicorn gilt, aber mein Kollege versuchte, mich davon zu überzeugen, dass wir mehr Unicorn-Instanzen pro CPU reservieren sollten, und stellte diesen Link bereit . Ich bin mir jedoch nicht ganz sicher, warum wir so viel Speicher für inaktive Unicorn-Prozesse benötigen.

Meine Frage ist: Was ist der Grund, mehr als eine Unicorn-Instanz pro CPU-Kern zu haben? Liegt es an einer architektonischen Besonderheit von Unicorn? Ich bin mir bewusst, dass ausgelastete Unicorn-Prozesse keine neuen Verbindungen akzeptieren können (wir verwenden UNIX-Domänensockets, um mit Unicorn-Instanzen zu kommunizieren), aber ich dachte, dass das Backlog genau eingeführt wurde, um dies zu beheben. Ist es trotzdem möglich, diese 2 bis 8 Unicorn-Instanzen pro CPU-Regel zu überwinden?

Antworten:


17

Okay, ich habe die Antwort endlich gefunden. Die optimale Anzahl der Unicorn-Worker hängt nicht direkt von der Anzahl der CPU-Kerne ab, sondern von Ihrer Auslastung und der internen App-Struktur / -Reaktivität. Grundsätzlich verwenden wir Sampling Profiler, um den Zustand der Arbeitnehmer zu bestimmen. Wir versuchen, die Arbeitnehmer zu 70% im Leerlauf und zu 30% bei der eigentlichen Arbeit zu halten. 70% der Samples sollten also "auf den Aufruf von select () warten, um eine Anfrage vom Frontend-Server zu erhalten". Unsere Forschung hat gezeigt, dass es nur 3 effektive Zustände von Arbeitnehmern gibt: 0-30% der Proben sind untätig, 30-50% der Proben sind untätig und 50-70% der Proben sind untätig (ja, wir können mehr untätige Proben erhalten, aber dort Dies ist kein wirklicher Punkt, da sich die Reaktionsfähigkeit der Anwendung nicht wesentlich ändert. Wir betrachten 0-30% Situation als "rote Zone" und 30-50% Situation als "gelbe Zone".


1
Können Sie erklären, wie Sie den Zustand dieser Arbeitnehmer beurteilen?
DPS

6

Sie haben Recht mit N + 1 für CPU-gebundene Jobs.

Auf der anderen Seite verwendet Unicorn keine Threads, sodass jedes IO op. blockiert den Prozess und ein anderer Prozess kann HTTP-Header aktivieren und analysieren, Zeichenfolgen verketten und alle CPU-intensiven Aufgaben ausführen, die für den Benutzer erforderlich sind (dies geschieht früher, um die Anforderungswartezeit zu verringern).

Vielleicht möchten Sie mehr Threads / Prozesse als Kerne haben. Stellen Sie sich folgende Situation vor: req. A braucht zehnmal mehr als req. B, Sie haben mehrere gleichzeitige A-Anforderungen, und die schnelle B-Anforderung wartet nur auf den Abschluss von A-req. Wenn Sie also die Anzahl der hohen Anforderungen vorhersagen können, können Sie diese Anzahl als weitere Richtlinie zum Optimieren des Systems verwenden.


1
Guter Punkt, nehmen wir an, dass Anfragen mehr oder weniger gleichmäßig verteilt sind und ziemlich leicht sind (wir haben zwar viele Anfragen, aber sie werden von einem anderen Pool von Einhörnern bearbeitet). Wenn alle Anforderungen plötzlich schwer werden (z. B. bei E / A-Engpässen auf einem DB-Knoten), sind wir, unabhängig von der Anzahl der CPU-Instanzen, inaktiv. Nun, wahrscheinlich ist der beste Weg, die Wahrheit zu erfahren, eine Art Belastungstest durchzuführen.
Alex

Ja, Tests werden es Ihnen sagen. Wenn Sie bereits gestartet haben, können Sie Protokolle prüfen und die maximale Anzahl gleichzeitiger Anforderungen ermitteln. Ich bin mir ziemlich sicher, dass Sie sowohl die Anforderungs- als auch die Backend-Antwortzeit protokollieren. Nginx wird dein Freund sein, wenn du es nicht tust. :)
dunkel
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.