![]() |
TIdTCPServer und Parallel Library: Verwaltung von Threads
Hallo!
Ich habe in meinem Programm einen TCP-Server, basiert auf Indy TIdTCPServer, der extrem zeitkritische Sensoren-Werte von mehreren Quellen übermittelt bekommt. Die empfangenen Daten müssen sehr schnell analysiert und verarbeitet werden, deswegen habe ich es damals so gemacht, dass für jedes Datenpaket einen neuen Thread für die Analyse gestartet wird. Gestern sind mehrere neue Datenquellen dazu gekommen mit dem Ergebnis, dass es mittlerweile bis zu mehrere Hundert Datenpakete pro Sekunde ankommen. Der Server läuft auf einem sehr modernen System aus 2 Xeon-Prozessoren, das jedes Jahr erneuert wird, großen Probleme gab es bis jetzt keine. Allerdings kam bei meinem Programm bereits einmal zu einer kurzen "Programm reagiert nicht" - Meldung, vermutlich, weil das System mit zu vielen gleichzeitig gestarteten Threads überlastet war. Bevor ich mir jetzt selber eine Queue für die ankommenden Daten baue und die Anzahl der Thread selber verwalte, möchte ich wissen, ob die vorhandene Delphi Parallel Library in diesem Fall eine Lösung wäre. Habe noch nie mit dieser Library gearbeitet, deswegen habe ich ein paar Fragen dazu. - Da die Verarbeitungsreihenfolge nicht wichtig ist, wurde bis jetzt für jedes Datenpaket ein anonymer Thread gestartet, der nach Ablauf automatisch freigegeben wurde. Kann ich es genauso mit einem TTask machen oder muss ich hier was beachten? (vielleicht meine wichtigste Frage an Indy-Experten) - Wenn ich das richtig verstanden habe, werden TTasks von einem standardmäßig definierten ThreadPool verwaltet, der die maximale Anzahl der gleichzeitig möglichen Threads errechnet und die darüber hinaus laufende Tasks warten lässt, bis ein Platz frei ist. Sagen wir, der Server bekommt gleichzeitig sehr viele Datenpakete = Tasks, mehr als es laut dem ThreadPool geben darf. Einige Tasks müssen nun innerhalb des Execute-Events warten. Ist das im Fall Indy ein Problem? Können dadurch die Datenpakete verloren gehen? Muss ich hier was beachten? - Jede Socket-Verbindung des TIdTCPServer "läuft" meines Wissens asynchron in einem separaten Thread. In meinem Fall können es bis zu 45 gleichzeitige Verbindungen sein. Werden diese Socket-Threads von Parallel Library berücksichtigt? - Aus Ihrer Erfahrung, gibt es noch irgendwas, worauf ich besonders achten muss, wenn ich Parallel Library verwenden möchte? Im Voraus vielen Dank! |
AW: TIdTCPServer und Parallel Library: Verwaltung von Threads
Werden die Cores des Servers gleichmäßig ausgelastet, oder kann man sehen dass das Serverprogramm nur einen Core verwendet (was ungünstiger wäre)?
|
AW: TIdTCPServer und Parallel Library: Verwaltung von Threads
Zitat:
|
AW: TIdTCPServer und Parallel Library: Verwaltung von Threads
Die von Indy erstellten Threads sind unabhängig vom Parallel Threadpool. Für jede Verbindung wird ein neuer Thread gestartet und die Execute Methode in einer Schleife immer wieder aufgerufen. Wenn Daten eintreffen, und in der der Execute-Methode an den Pool übergeben werden, blockiert die Execute Methode solange bis das Daten verarbeitet wurden. Daten im Socket gehen dadurch aber nicht verloren (den Socket kann man sich wie einen Stream vorstellen, aus dem man nach und nach so viel liest wie man möchte, und dazwischen auch Pausen machen darf).
Ist es ein Programm mit GUI? Die Meldung "Programm reagiert nicht" deutet ein wenig darauf hin... Dann würde ich vor allem versuchen, es komplett ohne GUI zu realisieren. |
AW: TIdTCPServer und Parallel Library: Verwaltung von Threads
Zitat:
Ich sollte die Frage zu den Socket-Threads vielleicht ein wenig umformulieren: Werden vom default ThreadPool beim Errechnen der noch "freien Plätze" auch die Thread berücksichtigt, die ausserhalb der Parallel Library erzeugt wurden? Oder bringt die Parallel Library in Hinsicht auf die Ressourcenverwaltung nur Sinn, wenn alle Threads innerhalb der Anwendung von Parallel Library abgeleitet werden? |
AW: TIdTCPServer und Parallel Library: Verwaltung von Threads
Wie die Parallel Library in diesem Punkt genau arbeitet, kann ich leider mangels Quelltext nicht sagen. Falls der Quelltext zu komplex ist um diese Frage zu beantworten, könnte eventuell eine Anfrage bei Stackoverflow schneller zu einem Ergebnis führen.
Das mit der Visualisierung ist verständlich, allerdings könnten 45 gleichzeitige Connections und hunderte Ereignisse pro Sekunde schon leicht dazu führen, dass die Anwendung durch das Zeichnen stark belastet wird. Eventuell kann man hier noch etwas sparsamer mit Ressourcen umgehen (Daten nicht erneut visualisieren, wenn die Werte nicht geändert haben etc.) |
AW: TIdTCPServer und Parallel Library: Verwaltung von Threads
Zitat:
|
AW: TIdTCPServer und Parallel Library: Verwaltung von Threads
Zitat:
|
AW: TIdTCPServer und Parallel Library: Verwaltung von Threads
Die CPU-Auslastung springt kaum über die Marke vo 40% bei ca. 250 Datensätze pro Sekunde.
|
AW: TIdTCPServer und Parallel Library: Verwaltung von Threads
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:01 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz