Quelle est la différence entre les Travailleurs et les Fils dans Puma
Quelle est la différence entre un puma travailleur et un puma de thread dans le contexte d'une heroku dyno?
Ce que je sais (merci de me corriger si je me trompe):
-
Mince n'est pas simultanée, si un site web ne peut faire une demande à un moment
-
En licorne, je sais que je peux avoir plusieurs licorne travailleurs dans un processus pour ajouter de la simultanéité.
Mais dans puma il y a des threads et des travailleurs.. N'est pas un travailleur, un fil à l'intérieur de la puma processus?
Puis-je utiliser plus de travailleurs/threads pour ajouter web de la simultanéité dans Heroku?
Vous devez vous connecter pour publier un commentaire.
Que l'autre réponse, les états, ce Heroku article est assez bonne avec des explications de certains éléments de configuration.
Toutefois, si vous devez régler votre application sur Heroku, ou n'importe où, alors qu'il paye pour savoir comment les choses fonctionnent.
Je pense que vous êtes presque correct quand vous dites "un travailleur est un fil à l'intérieur de la puma processus", je crois qu'un travailleur est un système d'exploitation au niveau le processus de fourche de puma qui peuvent ensuite utiliser les threads en interne.
Comme je le comprends - puma fourche de son système d'exploitation processus cependant le nombre de définir via
workers
de configuration pour répondre à des requêtes http. Cela vous donne le parallélisme en termes de gestion des demandes multiples, mais il s'agit généralement de prendre plus de mémoire, car il sera de "copier" le code de votre application, pour chaque travailleur.Chaque puma travailleur sera alors d'utiliser plusieurs threads à l'intérieur de son OS de processus selon la
threads
de configuration. Ceux-ci ajoutent de la concurrence en permettant à l'puma processus pour répondre à de multiples demandes, de sorte que si un thread est bloqué, c'est à dire le traitement d'une demande, il peut traiter une nouvelle demande à un autre thread. Comme indiqué, cela nécessite toute votre application à des threads de sorte que, par exemple, la configuration globale d'une demande n'est pas une "fuite" dans l'autre.Vous serait au point de puma, alors que le nombre de travailleurs a été suffisant pour le nombre de Processeurs et de la mémoire disponible et d'ajuster les threads dépend de combien vous voulez pour saturer l'hôte de l'exécution de votre application et comment votre application se comporte - il n'est pas toujours égale plus rapide/plus de demande de débit.
C'est une grande région et je ne suis pas un expert, mais...
Puma peuvent engendrer de nombreux travailleurs, et chaque travailleur peut utiliser plusieurs threads pour traiter la demande.
Licorne n'a pas de fils autant que je sache, il a juste le modèle de travailleur.
Si vous utilisez des threads, vous devez vous assurer que votre code est thread-safe. Cela signifie Rails, n'importe quel bijou vous comptez sur, et votre propre code.
Pour un maximum de performances, vous pouvez aussi regarder dans JRuby ou Rubinius qui ont bon support pour les threads. L'IRM est limité par sa GIL.
Il y a un bon article sur Heroku qui explique comment Puma utilise les travailleurs et les threads. Vous devriez lire cela et de m'ignorer 🙂
Je veux juste mettre l'accent le plus important de la Heroku/Puma article qui a été référencé ici:
Il précise que chaque Travailleur aura sa propre Piscine. Cependant:
C'est très important de le comprendre. Si un Puma Travailleur utilise 5 threads par travailleur, la base de données.yml doit être configuré pour une connexion piscine de 5, étant donné que chaque thread pourrait éventuellement établir une connexion de base de données.
Étant donné que chaque Travailleur est engendré par un système fork(), le nouveau travailleur aura son propre ensemble de 5 threads de travailler avec, et donc pour les nouveaux Rails instance créée, la base de données.yml sera toujours définir un pool de connexion de 5.
Maintenant la base de données.yml pool de connexion et de votre base de données actuelle de la piscine sont deux choses différentes. Le TOTAL des connexions à votre base de données aurez besoin d'utiliser une formule spécifique que le Heroku docs mention:
Ce que cela signifie est que si vous utilisez 2 Travailleurs, chacun avec 5 fils, puis 2 * 5 = 10, de sorte que votre base de données doit être configuré pour accepter les 10 connexions simultanées.