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?
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.
quelle