Puma ist tatsächlich Multithreaded und Multiprozess. Sie können es im "Clustered-Modus" aufrufen, wo es mehrere gegabelte Arbeiter hervorbringt, die auf verschiedenen Kernen im MRT laufen. Da Puma Multithread ist, ist es wahrscheinlich angemessen, eine Anzahl von Prozessen gleich der Anzahl der Kerne auf dem Server auszuführen.
puma -t 8:32 -w 4 --preload
Dies wird handhaben bis zu 32 gleichzeitigen Threads, mit bis zu 4 Threads gleichzeitig auf dem CPUs laufen und soll die CPU-Ressourcen auf die zu maximieren fähig sein: So für ein 4-Kern-Server so etwas wie dies angemessen wäre, Server. Das Argument --preload
lädt die App vor und nutzt die Vorteile von Ruby 2.0 COW für die Garbage Collection, um die RAM-Nutzung zu reduzieren.
Wenn Ihre App viel Zeit darauf verwendet, auf andere Dienste (Suchdienste, Datenbanken usw.) zu warten, wird dies eine große Verbesserung darstellen. Wenn ein Thread blockiert, kann ein anderer Thread in demselben Prozess die CPU greifen und funktionieren. Sie können in diesem Beispiel bis zu 32 Anforderungen parallel unterstützen, während Sie nur 4 Prozesse im RAM ausführen.
Mit Unicorn müssten Sie 32 Arbeiter abzweigen, die 32 Prozesse im RAM ausführen würden, was sehr verschwenderisch ist.
Wenn Ihre ganze App CPU-Knirschen ausführt, dann wird dies sehr ineffizient sein, und Sie sollten die Anzahl der Einhörner reduzieren und die Vorteile von Puma gegenüber Unicorn reduzieren. Aber im Unicorn-Fall musst du deine App benchmarken und die richtige Zahl herausfinden. Puma tendiert dazu, sich selbst zu optimieren, indem es mehr Threads hervorbringt, und seine Leistung sollte von nicht schlechter als Unicorn (im reinen CPU-Fall) bis zu weit besser als Unicorn reichen (im Falle einer App, die viel schläft).
Natürlich, wenn Sie Rubinius oder JRuby verwenden, dann ist es kein Wettbewerb, und Sie können einen Prozess spawnen, der Multicore ausführt und alle 32 Threads behandelt.
TL; DR ist, dass ich denke, dass Unicorn gegenüber Puma keinen großen Vorteil hat, da Puma tatsächlich beide Modelle verwendet.
Natürlich weiß ich nichts über die Zuverlässigkeit von Puma vs Unicorn in laufenden Produktionssoftware in der realen Welt. Eine Sache, die Sie beachten müssen, ist, dass wenn Sie über einen globalen Status in einem Thread kritzeln, dies andere Anforderungen beeinflussen kann, die zur gleichen Zeit ausgeführt werden, was zu unbestimmten Ergebnissen führen kann. Da Unicorn keine Threads verwendet, gibt es keine Nebenläufigkeitsprobleme. Ich würde hoffen, dass Puma und Rails zu diesem Zeitpunkt bereits reif für Concurrency-Probleme sind und dass Puma in der Produktion einsetzbar ist. Allerdings würde ich nicht unbedingt davon ausgehen, dass jedes rails-plugin und rubygem, das ich auf GitHub gefunden habe, threadsicher ist, und ich würde erwarten, dass ich etwas zusätzliche Arbeit machen muss. Aber sobald Sie genug Erfolg haben, Threading-Probleme in Bibliotheken von Drittanbietern zu finden, sind Sie wahrscheinlich groß genug, dass Sie sich die RAM-Kosten für das Ausführen so vieler Unicorn-Prozesse nicht leisten können. OTOH, ich verstehe Nebenläufigkeit Bugs und ich bin gut mit Ruby, so dass die Debugging-Kosten viel weniger für mich als die Kosten für den Kauf von RAM in der Cloud sein können. YMMV.
Beachten Sie auch, dass ich nicht sicher bin, ob Sie Hyperthread-Kerne oder physische Kerne bei der Schätzung des Werts für die Übergabe an "-w" zählen und Sie selbst testen müssen und welche Werte zu verwenden sind für -t. Selbst wenn Sie die Anzahl der Prozesse, die Sie benötigen, doppelt ausführen, sollte der Prozessplaner im Kernel in der Lage sein, dies ohne Probleme zu bewältigen, bis Sie die CPU gesättigt haben. In diesem Fall haben Sie ohnehin größere Probleme. Ich würde wahrscheinlich empfehlen, für jeden Kern mit Hyperthreading einen Prozess zu beginnen (im MRT).
Danke Stuart für die tolle Aufklärung !! – Ryan
Rubin 2.0 "Kopie bei Schreibfreundlich" bedeutet, dass der GC die Freigabe nicht mit der Kopie auf Schreibseiten im Heap teilt. Mit 1.9 würden Sie eine Reihe von Einhörnern abzweigen, und der GC würde Objekte ausführen und verschieben und alle COW-Sharing-Vorteile, die Sie möglicherweise zwischen diesen Prozessen hatten, bevor der GC gestartet wurde, vollständig verwerfen. – lamont