2010-01-11 5 views
26

Existe-t-il un nombre magique ou une formule pour définir les valeurs de SetMaxThreads et SetMinThreads pour ThreadPool? J'ai des milliers de méthodes de longue durée qui ont besoin d'être exécutées, mais je ne trouve pas la solution parfaite pour définir ces valeurs. Tout conseil serait grandement apprécié.ThreadPool SetMaxThreads et SetMinThreads Nombre magique

Répondre

39

Le nombre minimum de threads par défaut est le nombre de cœurs de votre machine. C'est un bon nombre, cela n'a généralement pas de sens d'exécuter plus de threads que de cœurs.

Le nombre maximal de threads par défaut est 250 fois le nombre de cœurs que vous avez sur .NET 2.0 SP1 et plus. Il y a énormément de respiration ici. Sur une machine à quatre cœurs, il faudrait 499 secondes pour atteindre ce maximum si aucun des threads ne se termine dans un délai raisonnable.

Le planificateur de pool de threads essaie de limiter le nombre de threads actifs au minimum, par défaut, le nombre de cœurs que vous avez. Deux fois par seconde, il permet à un autre thread de démarrer si les threads actifs ne se terminent pas. Les threads qui s'exécutent depuis très longtemps ou font beaucoup de blocage qui ne sont pas causés par des E/S ne sont pas de bons candidats pour le pool de threads. Vous devriez utiliser un thread régulier à la place.

Atteindre le maximum n'est pas sain. Sur une machine à quatre cœurs, seules les piles de ces threads consommeront un gigaoctet d'espace mémoire virtuel. Obtenir OOM est très probable. Envisagez d'abaisser le nombre maximal de threads si c'est votre problème. Ou pensez à ne démarrer que quelques threads réguliers qui reçoivent des paquets de travail depuis une file d'attente thread-safe.

+0

S'il vous plaît jeter un oeil à [ma question connexe] (http://stackoverflow.com/q/7974559/75500 " Exécuter un lot de processus et signaler les progrès de chacun d'entre eux "), un utilisateur m'a suggéré d'utiliser le [ThreadPool], selon ce que vous dites, je ne pense pas que ce soit une bonne idée, peut-être pourriez-vous m'aider. – Shimmy

+3

@Hans Passant: c'est à peine correct, tout d'abord t Le nombre maximal de threads par défaut dépend de la version du .NET Framework utilisée par l'application (par ex. 25 par core dans 2.0). La deuxième chose est que l'augmentation du nombre minimum de threads permet aux threads de se lancer sans délai, jusqu'à ce que le nombre minimum soit atteint (ils ne seront pas lancés s'ils ne sont pas nécessaires). Si le délai minimum est atteint, les nouveaux threads ne seront créés qu'avec un retard entre eux, ce qui entraînera une augmentation des performances sur les opérations longues (> 500ms), mais dans une baisse de performance sur les opérations courtes. – haze4real

+0

@HansPassant - Si l'on crée des threads qui peuvent être bloqués en attendant des E/S externes, je pense qu'il y a des situations où le «meilleur» minimum serait en effet plus élevé que le nombre de cœurs. Parce qu'un thread "bloqué" compte "toujours" vers le minimum, non? (Je comprends que cela n'aura pas d'importance pendant plus de quelques secondes, car après cela, l'ordonnanceur aura créé ces threads supplémentaires de toute façon, en s'assurant simplement de comprendre le raisonnement.) – ToolmakerSteve

6

Typiquement, le nombre magique est de le laisser seul. Le ThreadPool fait un bon travail de manipulation. Cela étant dit, si vous faites beaucoup de services à long terme, et ces services auront de longues périodes où ils attendent, vous pouvez augmenter le nombre maximum de threads pour gérer plus d'options. (Si les processus ne bloquent pas, vous ralentirez probablement les choses si vous augmentez le nombre de threads ...)

Affichez votre application pour trouver le bon numéro.

+0

Si je devais modifier les threads max (et min threads?) Il y a deux paramètres, les threads de travail et les threads de port d'achèvement. Quel est le nombre de threads de port d'achèvement pour ?? – Benny

+0

En outre, si je laisse le ThreadPool seul, sans définir de threads min/max, je rencontre une exception OutOfMemoryException et tous les threads échouent. – Benny

+3

C'est un problème différent - vous pouvez réduire la quantité de travail en l'étranglant, mais manquer de mémoire n'a vraiment rien à voir avec le filetage ... –

5

Si vous voulez un meilleur contrôle, vous pouvez envisager de ne PAS utiliser le ThreadPool intégré. Il y a un bon remplacement au http://www.codeproject.com/KB/threads/smartthreadpool.aspx.

+0

J'ai essayé d'utiliser SmartThreadPool, mais en vain. Après avoir mis en file d'attente tous les éléments de travail, j'ai essayé d'utiliser WaitForIdle (j'ai une logique de post-exécution à exécuter) et il ne bloque jamais , se déplace juste à droite.Peut être entre le clavier et l'ordinateur, mais ne l'ai pas encore compris – Benny