Laden...

Gibt es eine Regel, wie viele Threads in einer Anwendung (für maximale Performance) sinnvoll sind?

Erstellt von Pioneer17 vor 12 Jahren Letzter Beitrag vor 12 Jahren 8.472 Views
P
Pioneer17 Themenstarter:in
148 Beiträge seit 2007
vor 12 Jahren
Gibt es eine Regel, wie viele Threads in einer Anwendung (für maximale Performance) sinnvoll sind?

Mich würde mal eure Meinung zu meiner Frage interessieren.

In meinen Programmen die ich hin und wieder mal schreibe verwende ich gerne Threads.
Teilweise rufe ich sogar Threads in Threads auf, je nach dem auch eine dynamische Anzahl.

Beruflich arbeite ich mit einer Software die - aus meiner Sicht - sehr sehr viele Threads benötigt (100 - 200 Threads).

Ich habe mal gehört, dass ein Programm welches alleine soviele Threads benötigt eigentlich schlecht programiert ist.
Die Begründung: Windows benötigt sehr viele Ressourcen um all diese und die restlichen Threads des OS zu verwalten.

Teilweise fällt mir das sogar auf: Windows ist sehr träge, die CPU "schläft" aber so zu sagen bei <5%

Nun meine Frage: Was habt ihr für Erfahrungen mit (vielen) Threads?
Gibt es so eine Faustregel die besagt wieviele Thread optimal verwendet werden sollen?

Gruss
Pioneer17

D
33 Beiträge seit 2010
vor 12 Jahren

Naja soviele threads hab ich nie da ich immer einen Threadpool verwende.

Zu deiner Frage, der thread pool von microsoft verwendet bis zu 25 pro prozessor kern
ThreadPool-Klasse

Gelöschter Account
vor 12 Jahren

Es gibt Faustregeln die sich auf konkrete Systeme beziehen. Aber wie es eben so ist, es hängt davon ab was du tust und wo du es tust. Desktop? Server? Grid?

Die Frage ob das Programm das richtige Design hat wenn es soviele Threads benötigt ist berechtigt, aber die kann dir im konkreten Fall keiner beanworten ausser du erzählst etwas mehr. Die Trägheit bei hohem Thread Aufkommen kann ich in jedem Fall bestätigen.

Mir hat das Buch "ParallelComputing mit .NET" diesbezüglich sehr geholfen.

T
2.224 Beiträge seit 2008
vor 12 Jahren

Wenn du über den ThreadPool arbeitest, ist die Frage an sich schon egal.
Der ThreadPool verwaltet die Threads dort schon so, dass pro CPU Kern auch ein Thread arbeitet.
Dies ist auch eine gute Regel, da ein Thread der viel Last erzeugt, den Kern optimal ausnutzen kann.

T-Virus

Developer, Developer, Developer, Developer....

99 little bugs in the code, 99 little bugs. Take one down, patch it around, 117 little bugs in the code.

C
2.122 Beiträge seit 2010
vor 12 Jahren

Was macht deine Software dass sie so viele Threads braucht?
Ich nutze Threads hauptsächlich um die GUI am Leben zu halten. Hintergrundaufgaben können je nach Laufzeit auch serialisiert ablaufen. Wenn man z.B. nur 2 CPU-Kerne hat, laufen 10 Aufgaben in 10 Threads eigentlich ja trotzdem genauso lange wie in nur 2 Threads.

P
Pioneer17 Themenstarter:in
148 Beiträge seit 2007
vor 12 Jahren

Das ist nicht eine SW die ich gemacht habe. Diese die 100-200 Threads benötigt ist eine Videosoftware. D.h. Überwachungskameras werden in dieser SW konfiguriert / verwaltet.s

Die SW ist in Delphi programmiert. Wie, wann und warum vom Entwickler so viele Threads benötigt werden weiss ich nicht.

Was ich interessant finde ist die Tatsache, dass wenn ich meinen Taskmanager zur Zeit betrachte dann benötigt der Prozess "System" 133 Threads. Microsoft Messanger benötigt sogar 148!

Wenn ich unsere SW starte, verwendet sie bereits ca. 130 Threads, dabei ist aber noch keine Kamera konfiguriert.
Interessant ist auch, egal ob ich dann 2 oder 5 Kameras konfiguriere die SW dann ca. 150 benötigt.

Es ist sehr schwirig an dieser Stelle das Verhalten der SW nach zu vollziehen...

Mich interessiert einach die Meinung aus dem Forum dies bezüglich.

Wieviele Threads verwenden euere Programme so?
Ab wann ist Windows träge, kann man das irgendwie sehen / messen / auslesen?

49.485 Beiträge seit 2005
vor 12 Jahren

Hallo Pioneer17,

wieviele Threads sinnvoll sind, hängt von einer großen Anzahl von Faktoren ab, nicht nur davon, wieviel Arbeit die einzelnen Threads zu erledigen haben, wie viel (Platten-)IO und Speicherzugriffe sie erledigen, wie oft sie blockieren, welche Synchonisationsmaßnahmen erforderlich sind, so dass man hier keine einfache Regel angeben kann. Alleine alle Einflussfaktoren zu benennen, würde schon den Rahmen sprengen.

Richtig ist, dass es normalerweise wenig Sinn macht, mehr vollbeschäftigte, nicht blockierende Threads als Prozessor-Kerne zu haben, weil durch mehr Threads nur der Verwaltungsaufwand für die Threads steigt.

Es kann aber auch sein, dass eine geringere Anzahl von Threads als Kerne sinnvoll ist, wenn sich die Threads sonst z.B. gegenseitig die Daten aus dem Cache werfen (Thrashing) oder verursachen, dass der Arm der Festplatte ständig hin und her schwenken muss, um die Daten für den gerade aktuellen Thread zu lesen, anstatt dass ein Thread die Daten sequentiell liest.

Außer Performance-Überlegungen muss man natürlich auch das Anwendungsdesign berücksichtigen. Da kann es sinnvoll (z.B. einfacher) sein, jede anstehende Aufgabe einfach an den Thread-Pool zu übergeben, auch wenn es dadurch mehr gleichzeitige Threads als Kerne gibt.

Je nach Situation können also weniger, genausoviele oder mehr Threads als Kerne sinnvoll sein.

Kurz gesagt: nebenläufige Programmierung ist schwierig, auch hinsichtlich der Wahl der richtigen Anzahl von Threads. Es gibt keine einfache Antwort auf deine Frage und eine halbwegs vollständige Antwort würde den Rahmen sprengen.

herbivore

W
872 Beiträge seit 2005
vor 12 Jahren

Vom theoretischen Standpunkt aus solltest Du Dir Amdahls Gesetz und Gustafsons Gesetz anschauen.
Vom praktischen Standpunkt her haengt die beste Anzahl der Threads vom Problem und den Ressourcen ab.
Ich kenne zum Beispiel Applikationen, da hat jedes offene Fenster seinen eigenen Thread mit Verbindungen zum Server und die Zahl der Threads veraendert sich dann mit jedem Schliessen/Oeffnen der Verbindung.
Viele Threads sind nicht problematisch, problematisch ist, wenn die CPUs bei der Ausfuehrung oft zwischen den Threads wechseln und viele Daten zwischen Threads synchronisiert werden.