ThreadPool SetMaxThreads et nombre magique SetMinThreads

Existe-t-il un nombre ou une formule magique permettant de définir les valeurs de SetMaxThreads et SetMinThreads pour ThreadPool? J’ai des milliers de méthodes à exécution longue qui nécessitent une exécution mais ne trouvent pas la correspondance parfaite pour définir ces valeurs. Tout conseil serait grandement apprécié.

Le nombre minimum de threads par défaut est le nombre de cœurs de votre machine. C’est un bon nombre, il n’est généralement pas logique 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 versions supérieures. Il y a une énorme marge de manoeuvre 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 pools 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 qui bloquent beaucoup, mais qui ne sont pas causés par les E / S, ne sont pas de bons candidats pour le pool de threads. Vous devriez utiliser un fil régulier à la place.

Atteindre le maximum n’est pas sain. Sur une machine à quatre cœurs, seules les stacks de ces threads consumnt un gigaoctet d’espace mémoire virtuel. Obtenir OOM est très probable. Pensez à réduire le nombre maximal de threads si tel est votre problème. Ou envisagez de ne démarrer que quelques threads normaux recevant des paquets de travaux provenant d’une queue sécurisée pour les threads.

Généralement, le nombre magique consiste à le laisser seul. Le ThreadPool fait un bon travail pour gérer cela.

Cela étant dit, si vous utilisez beaucoup de services de longue durée et que ces services auront de longues périodes d’attente, vous pouvez augmenter le nombre maximal 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 …)

Profil de votre application pour trouver le bon numéro.

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