Certaines personnes diraient que deux fils, c'est trop - je ne suis pas tout à fait dans ce camp :-)
Voici mon conseil: mesurez, ne devinez pas. Une suggestion est de le rendre configurable et de le régler initialement sur 100, puis de libérer votre logiciel à l'état sauvage et de surveiller ce qui se passe.
Si votre utilisation de thread atteint un pic à 3, alors 100 est trop. S'il reste à 100 pendant la majeure partie de la journée, augmentez-le jusqu'à 200 et voyez ce qui se passe.
Vous pourriez en fait avoir votre code lui-même surveiller l'utilisation et ajuster la configuration pour le prochain démarrage, mais c'est probablement exagéré.
Pour clarification et élaboration:
Je ne préconise pas de rouler votre propre sous-système de pool de threads, utilisez certainement celui que vous avez. Mais, puisque vous posiez des questions sur un bon point de coupure pour les threads, je suppose que votre implémentation de pool de threads a la capacité de limiter le nombre maximum de threads créés (ce qui est une bonne chose).
J'ai écrit du code de regroupement de connexions de threads et de bases de données et ils ont les fonctionnalités suivantes (qui, selon moi, sont essentielles pour les performances):
- un nombre minimum de threads actifs.
- un nombre maximum de threads.
- fermer les threads qui n'ont pas été utilisés depuis un certain temps.
Le premier définit une ligne de base pour des performances minimales en termes de client de pool de threads (ce nombre de threads est toujours disponible pour utilisation). Le second définit une restriction sur l'utilisation des ressources par les threads actifs. Le troisième vous ramène à la ligne de base en temps calme afin de minimiser l'utilisation des ressources.
Vous devez équilibrer l'utilisation des ressources d'avoir des threads inutilisés (A) contre l'utilisation des ressources de ne pas avoir suffisamment de threads pour effectuer le travail (B).
(A) correspond généralement à l'utilisation de la mémoire (piles, etc.), car un thread qui ne fonctionne pas n'utilisera pas une grande partie du processeur. (B) sera généralement un retard dans le traitement des demandes à mesure qu'elles arrivent, car vous devez attendre qu'un thread soit disponible.
Voilà pourquoi vous mesurez. Comme vous le dites, la grande majorité de vos threads attendront une réponse de la base de données pour ne pas s'exécuter. Il y a deux facteurs qui affectent le nombre de threads que vous devez autoriser.
Le premier est le nombre de connexions DB disponibles. Cela peut être une limite stricte sauf si vous pouvez l'augmenter au niveau du SGBD - je vais supposer que votre SGBD peut prendre un nombre illimité de connexions dans ce cas (bien que vous devriez idéalement mesurer cela également).
Ensuite, le nombre de threads que vous devriez avoir dépend de votre utilisation historique. Le minimum que vous devriez avoir en cours d'exécution est le nombre minimum que vous avez déjà eu en cours d'exécution + A%, avec un minimum absolu de (par exemple, et le rendre configurable comme A) 5.
Le nombre maximal de threads doit être votre maximum historique + B%.
Vous devez également surveiller les changements de comportement. Si, pour une raison quelconque, votre utilisation atteint 100% de la disponibilité pendant un temps significatif (de sorte que cela affecterait les performances des clients), vous devriez augmenter le maximum autorisé jusqu'à ce qu'il soit à nouveau B% plus élevé.
En réponse au "que dois-je mesurer exactement?" question:
Ce que vous devez mesurer spécifiquement, c'est la quantité maximale de threads en utilisation simultanée (par exemple, en attente d'un retour de l'appel DB) sous charge. Ajoutez ensuite un facteur de sécurité de 10% par exemple (souligné, car d'autres affiches semblent prendre mes exemples comme des recommandations fixes).
De plus, cela doit être fait dans l'environnement de production pour le réglage. Il est normal d'obtenir une estimation au préalable, mais vous ne savez jamais quelle production va vous lancer (c'est pourquoi toutes ces choses devraient être configurables au moment de l'exécution). Il s'agit d'attraper une situation telle qu'un doublement inattendu des appels clients entrant.