Combien de threads puis-je exécuter simultanément?
commentaire une autre de mes questions dit que je ne peux exécuter que" tant " de threads de façon concrète, une notion que j'ai vue ailleurs.
en tant que novice dans le threading, Comment puis-je déterminer le nombre maximum de threads à utiliser? Ou est-ce une question "Combien de temps dure un morceau de ficelle"? Que faut-il dépend? Configuration matérielle ou quoi?
(VB en MS Visual Studio .Net 3.5, si ce qui compte)
mise à jour: est-ce que quelqu'un est au courant n'importe quel outil s / w qui pourrait suggérer un certain nombre de threads (ou des tâches), ou devrais-je juste coder mon propre qui continue d'essayer des nombres différents jusqu'à ce que le rendement baisse?
[Upperdate] presque sept ans plus tard et nous avons maintenant un logiciel de recommandations sitedemande s'il y a un outil pour aider avec cela.
7 réponses
cela dépend du matériel puisque vous n'utilisez pas (probablement) un ordinateur théorique mais un matériel physique, donc vous avez des ressources limitées.
Lire: est-ce que Windows a une limite de 2000 threads par processus?
de plus, même si vous pouviez exécuter 5000+ threads, en fonction de votre matériel, cela pourrait être beaucoup plus lent qu'un programme équivalent à 10 threads. Je pense que vous devriez jeter un coup d'oeil à mise en pool de threads.
en général, le nombre de threads que vous exécutez réellement simultanément est déterminé par le nombre de processeurs CPUs et CPU Core (y compris l'Hyper threading) que vous avez. C'est-à-dire qu'à tout moment le nombre de threads en cours d'exécution (dans le système d'exploitation) est égal au nombre de "cœurs".
Combien de threads peuvent s'exécuter simultanément dans votre application dépend d'un grand nombre de facteurs. Le meilleur (laïc) nombre serait le nombre de processeurs de la machine, mais bien sûr, c'est comme faire semblant que personne d'autre n'existe (pas d'autre application):).
franchement, je dirais faire beaucoup plus d'études sur le multi-threading dans .NET / Windows parce qu'on a tendance à faire plus de "dommages" que de bien quand on n'a pas une compréhension vraiment solide. .NET a le concept d'un pool de threads et vous devez savoir comment cela fonctionne en plus de Windows.
.NET 3.5/4.0, vous devez être à la recherche à des Tâches (Bibliothèque Parallèle Des Tâches) que la bibliothèque fait un bien meilleur travail de déterminer le nombre de threads (si) pour frayer. Avec le TPL le threadpool obtient une révision majeure et il est beaucoup plus intelligent au sujet des fils de frai et vol de tâche, etc. Mais vous travaillez généralement avec des tâches et non des fils.
il s'agit D'un domaine complexe et, par conséquent, le framework .NET a introduit des tâches de manière à abstraire les programmeurs à partir des threads et donc à permettre à l'exécution d'être intelligente à ce sujet tandis que le programmeur dit juste ce qu'elle veut et pas tellement sur la façon de faire il.
chaque thread consomme plus de mémoire (pile de noyau, bloc d'environnement thread, thread-local, pile....). AFAIK il n'y a pas de limite explicite dans Windows, donc la contrainte sera mémoire (probablement la pile pour chaque thread).
sous Linux, les threads ressemblent plus à des processus (avec mémoire partagée) et vous êtes limité par:
cat /proc/sys/kernel/threads-max
une assez bonne règle empirique pour exécuter des tâches intensives est d'exécuter le même nombre que votre nombre de noyau physique.
Oui, vous pouvez exécuter plus de tâches, mais elles attendront des ressources (ou des threads dans un pool de threads) et votre boîte, quelle que soit sa taille ne peut pas tout à fait allouer toutes les ressources de base d'un cpu 100% du temps à un thread en raison de l'arrière-plan/d'autres processus. Ainsi, plus vous instanciez de tâches, plus vous générez de threads, car ils surpassent les threads concurrents possibles (1 par core), Plus il y aura de gestion, de mise en file d'attente et d'échange de ressources.
un test que nous avons fait où je travaille maintenant en utilisant un patron viral pour lancer des tâches supplémentaires a trouvé qu'optimal était assez proche du compte cpu comme un cap. Les tâches lancées selon un ratio de un à un avec le nombre de noyaux physiques ont été exécutées à environ 1 minute par tâche. Réglé à deux fois le nombre de cpu, le temps de tâche est passé de 1 minute en moyenne à environ 5 minutes en moyenne. Il est plus lent géométriquement plus de tâches initié passé nombre de cœurs.
par exemple, si vous avez 8 noyaux physiques, 8 tâches (et en utilisant TPL, essentiellement 8 threads concurrents dans le processus actif) devraient être les plus rapides. Il y a votre fil principal ou processus qui crée les autres tâches, et d'autres processus de fond, mais si la boîte est assez isolée pour votre plaisir d'exploitation des ressources, ceux-ci seront assez minimes.
l'envers de la programmation de votre cap de tâche basée sur le noyau compter que vous mâchez des tâches hors d'un la file d'attente ou la liste ainsi lorsque vous déployez l'application sur des boîtes de tailles différentes, il s'ajuste automatiquement.
pour déterminer ceci de façon programmatique, nous utilisons
var CoreCount = System.Environment.ProcessorCount / 2;
Pourquoi diviser par deux, vous demandez-vous? Parce que presque tous les processeurs modernes utilisent des noyaux logiques ou de l'hyperthreading. Vous devriez trouver avec vos propres tests que si vous utilisez le compte logique, votre vitesse globale par tâche, et donc l'ensemble du processus, va baisser de manière significative. Les noyaux physiques sont la clé. Nous ne pouvions pas voir de moyen rapide de trouver physique vs logique, mais un rapide sondage de nos boîtes a trouvé que ce soit toujours vrai. YMMV, mais cela pourrait obtenir votre assez loin assez rapide.
cela dépend beaucoup de la machine-CPU et mémoire sont les principaux facteurs limitatifs (bien que des limites OS puissent y entrer).
en ce qui concerne .NET le pool de threads la configuration entre également en jeu.
D'après ma propre expérience, lorsqu'on utilise des threads, une bonne règle empirique pour augmenter la performance des processus liés au CPU est d'utiliser un nombre égal de threads comme noyaux, sauf dans le cas d'un système Hyper-threadé dans lequel on devrait utiliser deux fois plus de noyaux. L'autre règle empirique que l'on peut conclure concerne les processus liés aux e/s. Cette règle est de quadrupler le nombre de threads par des carottes, sauf pour le cas d'un système hyper-thread, alors on peut quadrupler le nombre de threads par core.
j'ai été capable d'exécuter 4 threads à la fois sur mon ancien CPU (2005) en utilisant le brûleur CPU D'EVGA avant que mon buzzer CPU ne sonne (programmé dans le menu BIOS) ce qui signifie que j'ai frappé plus de 90*C. Gardez à l'esprit que nous parlons de fils de données qui fonctionnent tout à la fois. un bon exemple serait d'avoir ouvert plusieurs programmes à la fois. Mais dans l'ensemble, cela dépend vraiment de la qualité de votre CPU avec multitâche. (en d'autres termes peut gérer de nombreux fils actifs) une façon sûre de tester est de télécharger "ocscanner (by EVGA)" et "Thermomètre CPU" utilisez le brûleur CPU à L'intérieur du Scanner OC pendant les tests, assurez-vous que votre température ne s'élève pas au-dessus de 90*c (ou toute température que vous vous sentez en sécurité) et regardez votre nombre actuel de threads que vous avez lancé votre CPU. démarrer à 2 threads, attendre 3-5 minutes en regardant la température CPU, ajouter un autre thread, répéter. (NE POUSSEZ PAS VOTRE CHANCE!!!) (N'ESSAYEZ PAS SI LE THERMOMÈTRE CPU NE PEUT PAS DÉTECTER VOTRE TEMPÉRATURE!!!)