60 votes

Quand le planificateur App Engine utilise-t-il un nouveau thread par rapport à une nouvelle instance?

Si j'ai mis en threadsafe: true mon app.yaml le fichier, quelles sont les règles qui régissent lorsqu'une nouvelle instance sera créée pour servir une demande, par rapport à quand un nouveau thread est créé sur une instance existante?

Si j'ai une application qui effectue quelque chose de calcul intensif sur chaque demande, ne le multi-threading m'acheter quoi que ce soit? En d'autres termes, est un exemple d'un multi-core instance ou d'un seul cœur?

Ou sont les nouveaux threads seulement en rotation quand les threads sont en attente sur IO?

36voto

proppy Points 6747

Les règles suivantes sont actuellement utilisés pour déterminer si une instance donnée peut accepter une nouvelle demande:

if processing more than N concurrent requests (today N=10): false
elif exceeding the soft memory limit: false
elif exceeding the instance class CPU limit: false
elif warming up: false
else true

La suite de total CPU/core limites s'appliquent à chacune des classes:

CLASS 1: 600MHz 1 core
CLASS 2: 1.2GHz 1 core
CLASS 4: 2.4GHz 1 core
CLASS 8: 4.8GHz 2 core

Si seulement un B8 instance peut traiter jusqu'à 2 entièrement en CPU, les demandes en parallèle.

Paramètre threadsafe: true (Python) ou <threadsafe>true</threadsafe> (Java) pour les instances de classes < 8 ne serait pas permettre à plus d'un CPU, demande à être traité en parallèle sur une seule instance.

Si vous n'êtes pas entièrement liée à l'UC ou faire des I/O, le Python et Java runtime se frayer de nouveaux threads pour traiter de nouvelles demander jusqu'à 10 demandes simultanées avec threadsafe: true

Notez également que même si l'Aller runtime est mono-thread, il prend en charge les demandes simultanées: Il se frayer 1 goroutine selon les demandes et le contrôle du rendement entre les goroutines pendant l'exécution de I/O.

1voto

maxiperez Points 513

Lire les prochains messages de lien qui a été suggéré par Kyle Finley

Jeff Schnitzer: Est-il encore une dure limite de 10 threads?

Oui, mais probablement pas pour la raison que vous attendez. Le principal problème que nous est la gestion de la mémoire. Si nous avons soulevé la valeur par défaut de 100, de nombreux les applications seraient alors hors-la mémoire de décès (plus que ce qu'ils font maintenant), et ces décès présentent de façon différente pour python/java/go. Le droit chemin l'avant est plus intelligent algorithmes wrt mémoire, ce qui configurabilité, et ainsi de suite. C'est un exemple du type de projets, nous travaillons sur pour le planificateur, mais aussi avec toute l'équipe que nous avons de prioriser nos projets. Je vous recommande le dépôt de cette (ou de toute autre souhaité planificateur améliorations) sur le public à l'issue tracker afin qu'ils pouvez obtenir de la rétroaction/data/voix.

0voto

Derpy Derp Points 123

Si j'ai mis des threads: vrai dans mon application.fichier yaml, quelles sont les règles qui régissent lorsqu'une nouvelle instance sera créée pour servir une demande, par rapport à quand un nouveau thread est créé sur une instance existante?

Comme les gens disent, ici, si une instance antérieure est déjà à l'aide de 10 threads, une nouvelle instance avec un nouveau thread serait mis en place. Un nouveau sujet sera créé si tous les autres threads sont occupés, ils doivent être soit de l'attente d'une réponse ou avec les résultats de calcul.

Si j'ai une application qui effectue quelque chose de calcul intensif sur chaque demande, ne le multi-threading m'acheter quoi que ce soit? En d'autres termes, est un exemple d'un multi-core instance ou d'un seul cœur?

Maintenant, cette question est très controversée. Tout le monde connaît la réponse mais qu'ils sont encore sceptiques. Le Multi-threading ne peut jamais acheter pour vous si votre tâche est basée sur des calculs sauf si vous utilisez un processeur multi-core, ne me demandez pas pourquoi un processeur multi-core aidera à mieux, vous connaissez la réponse. Maintenant, google app engine n'est pas assez sophistiquée pour décider que, lorsque de nouveaux threads doit être envoyé à l'autre processeur/core(si elle existe), seules les nouvelles instances sont expédiés à l'autre core/processeur. Voulez que votre thread à exécuter dans l'autre core/processeur? Bien, jeter un peu de qualifications, et booya! Rappelez-vous, c'est jusqu'à vous de décider si les threads doivent s'exécuter dans d'autres noyaux de transformateurs, le moteur ne peut pas prendre la responsabilité pour de tels car cela pourrait conduire à de nombreuses confusions, le moteur n'est pas Dieu. En bref, par défaut, l'instance est seul core, le moteur ne peut pas décider pour vous quand il doit aller en multi-core.

Ou sont les nouveaux threads seulement en rotation quand les threads sont en attente sur IO?

La première partie de ma réponse efface. Oui, ils n'en rotation lorsque les threads existants sont occupés, c'est comment des threads œuvres, pour éviter les blocages.

Maintenant, je peux vous dire tout cela, de mon expérience personnelle, j'ai travaillé sur l'app engine pour de nombreux mois et programmation/débogué/testé les applications qui ont été fortement dépendants des threads de l'architecture. Si vous voulez, je peux ajouter des références(je n'ai pas de références, juste l'expérience personnelle, mais je suis prêt à rechercher et à mettre les choses sur la table pour vous), mais je ne pense pas qu'ils sont nécessaires dans ce cas, des threads fonctionne de manière évidente que j'ai validé moi-même.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X