Einige Leute würden sagen, dass zwei Threads zu viele sind - ich bin nicht ganz in diesem Lager :-)
Hier ist mein Rat: Messen, nicht raten. Ein Vorschlag ist, es konfigurierbar zu machen und es zunächst auf 100 zu setzen, dann Ihre Software für die Wildnis freizugeben und zu überwachen, was passiert.
Wenn Ihre Thread-Nutzung bei 3 liegt, ist 100 zu viel. Wenn es den größten Teil des Tages bei 100 bleibt, erhöhen Sie es auf 200 und sehen Sie, was passiert.
Sie könnten Ihren Code selbst die Nutzung überwachen lassen und die Konfiguration für den nächsten Start anpassen, aber das ist wahrscheinlich übertrieben.
Zur Klarstellung und Ausarbeitung:
Ich befürworte nicht, Ihr eigenes Thread-Pooling-Subsystem zu rollen. Verwenden Sie auf jeden Fall das, das Sie haben. Da Sie jedoch nach einem guten Grenzwert für Threads gefragt haben, gehe ich davon aus, dass Ihre Thread-Pool-Implementierung die maximale Anzahl erstellter Threads begrenzen kann (was eine gute Sache ist).
Ich habe Pooling-Code für Thread- und Datenbankverbindungen geschrieben und sie haben die folgenden Funktionen (von denen ich glaube, dass sie für die Leistung wesentlich sind):
- eine minimale Anzahl von aktiven Threads.
- eine maximale Anzahl von Threads.
- Herunterfahren von Threads, die seit einiger Zeit nicht mehr verwendet wurden.
Der erste legt eine Basislinie für die Mindestleistung in Bezug auf den Thread-Pool-Client fest (diese Anzahl von Threads steht immer zur Verwendung zur Verfügung). Mit der zweiten Option wird die Ressourcennutzung durch aktive Threads eingeschränkt. Mit dem dritten Schritt kehren Sie in ruhigen Zeiten zur Grundlinie zurück, um den Ressourcenverbrauch zu minimieren.
Sie müssen die Ressourcennutzung durch nicht verwendete Threads (A) gegen die Ressourcennutzung durch nicht genügend Threads für die Arbeit (B) abwägen.
(A) ist im Allgemeinen die Speichernutzung (Stapel usw.), da ein Thread, der keine Arbeit erledigt, nicht viel von der CPU verbraucht. (B) ist im Allgemeinen eine Verzögerung bei der Verarbeitung von Anfragen, sobald diese eintreffen, da Sie warten müssen, bis ein Thread verfügbar ist.
Deshalb messen Sie. Wie Sie angeben, wartet die überwiegende Mehrheit Ihrer Threads auf eine Antwort aus der Datenbank, damit sie nicht ausgeführt werden. Es gibt zwei Faktoren, die sich darauf auswirken, wie viele Threads Sie zulassen sollten.
Die erste ist die Anzahl der verfügbaren DB-Verbindungen. Dies kann eine harte Grenze sein, es sei denn, Sie können sie am DBMS erhöhen. Ich gehe davon aus, dass Ihr DBMS in diesem Fall eine unbegrenzte Anzahl von Verbindungen aufnehmen kann (obwohl Sie dies idealerweise auch messen sollten).
Dann hängt die Anzahl der Threads, die Sie haben sollten, von Ihrer historischen Verwendung ab. Das Minimum, das Sie ausführen sollten, ist die Mindestanzahl, die Sie jemals ausgeführt haben, + A%, mit einem absoluten Minimum von (zum Beispiel und konfigurierbar wie A) 5.
Die maximale Anzahl von Threads sollte Ihr historisches Maximum + B% sein.
Sie sollten auch auf Verhaltensänderungen überwachen. Wenn Ihre Nutzung aus irgendeinem Grund für einen längeren Zeitraum zu 100% verfügbar ist (so dass dies die Leistung der Clients beeinträchtigt), sollten Sie das zulässige Maximum erhöhen, bis es wieder um B% höher ist.
Als Antwort auf die Frage "Was genau soll ich messen?" Frage:
Was Sie speziell messen sollten, ist die maximale Anzahl von Threads, die gleichzeitig geladen werden (z. B. auf eine Rückkehr vom DB-Aufruf warten). Dann fügen Sie einen Sicherheitsfaktor von 10% für Beispiel (hervorgehoben, da andere Plakate scheinen meine Beispiele als feste Empfehlungen zu nehmen).
Darüber hinaus sollte dies in der Produktionsumgebung zum Optimieren erfolgen. Es ist in Ordnung, vorher einen Kostenvoranschlag zu erhalten, aber Sie wissen nie, welche Produktion Ihren Weg finden wird (weshalb all diese Dinge zur Laufzeit konfigurierbar sein sollten). Dies dient dazu, eine Situation wie eine unerwartete Verdoppelung der eingehenden Clientanrufe zu erfassen.