Laden...

Forenbeiträge von knuti Ingesamt 3 Beiträge

21.05.2008 - 08:38 Uhr

Hallo Experten,

ich habe momentan ein Problem, an dem ich verzweifle.
Der Methoden-Aufrufe .Set() von AutoResetEvent oder ManualResetEvent dauert Ewigkeiten. Dies zieht die Performance unseres Programmes sehr stark nach unten. Neben der gefühlten Beeinträchtigung kann man diesen Umstand auch in diversen Profilern herauslesen.

Hierbei dauern z.B. 400 Aufrufe von .Set() ca. 20 Sekunden.

Bei einem kleinen Testprogramm verbrauchen diese Methodenaufrufe so gut wie überhaupt keine Zeit. Auch bei der Vorgängerversion des jetzt in Entwicklung befindlichen Programms gibt es hier gar keine Probleme. (im ms-Bereich)

Jetzt meine Frage, was kann diese .Set() Methode so dermaßen in der Performance beeinflussen?
Kurze Infos zum Programm selbst:

  • WindowsDienst
  • .Net 3.5
  • ca. 20 laufende Threads
  • mehrere Timer (Threading.Timer), die in der Anwendung laufen
  • 3-4 Threads werden mit AutoResetEvent/ManualResetEvent (egal welches, beide sind langsam) signalisiert.

Zum Ablauf des Programms:

Es tritt ein Ereignis ein (z.B. über TCP kommen Daten an), diese sollen sofort in einem anderen Thread (damit nichts blockiert), verarbeitet werden. Diese Verarbeitung kann länger dauern, daher wird dies in einem extra Thread ausgelagert.
Nun greift dieser extra Thread in einer globale Queue auf Daten zu, die er zu verarbeiten hat.

Variante 1 -> der extra Thread hat immer ein Sleep von 20ms... (auch nicht optimal)

Variante 2 -> Nach erfolgreicher Verarbeitung der zur Verfügung stehenden Daten wird ManualResetEvent.Reset() und ManualResetEvent.WaitOne() aufgerufen.
-> kommt nun über TCP etwas rein, so wird für das ManualResetEvent - Objekt von diesem Extra-Thread die .Set() Methode aufgerufen, sodass die Verarbeitung fortgesetzt wird.

Und genau dieses Informieren "Hey, neue Daten sind da" dauert für meine Begriffe Ewigkeiten (siehe oben).
Kennt jemand das Problem oder hat noch einen Hinweis auf was ich achten sollte?

Wäre super!.

Gruß

05.04.2007 - 12:53 Uhr

danke für die Antworten und Ideen,
werde das bei den Kunden mal testen mit dem Servicepack.

Gruß

30.03.2007 - 11:31 Uhr

Hallo zusammen,

hoffe jemand kann mir bei meinem "kleinen" Problem helfen.

wir haben mit unserem Produkt ein kleines Problem.

Bei vielen Rechnern/Kunden funktioniert alles einwandfrei.
Jedoch auf einem weist das Programm eine extrem hohe Prozessorlast auf.
Das fängt bei 10% an, und endet bei 100% nach 4-5 Tagen.

An sich funktioniert das Programm weiterhin gut, Windows ist jedoch kaum zu bedienen.
Das Programm ist ein installierter Dienst.

Im Einsatz ist Windows2003 Server.
Der Speicherverbrauch bleibt nahezu unverändert.

Unsere Vermutung ist, dass das Logging im Hintergrund diese Auslastung nach einiger Zeit verursacht. (vielleicht durch Fragmentierung auf HDD - Seite!?)

Jedoch wird ab einer bestimmten Dateigröße immer eine neue Logdatei erzeugt und verwendet (1MB)
Pro Dienst werden 2 Logdateien weggeschrieben.
Es hat auch relativ wenig mit der Auslastung zu tun, da auch ohne Last auf den Dienst nach 3-4 Tagen die Prozessorauslastung in die Höhe geht (Logeinträge sind somit auch nicht übermäßig erzeugt worden)

der dienst fungiert als converter zwischen 2 TCP - Endpunkten und wandelt die einkommenden daten so um, dass der zweite Partner dies verstehen kann. und umgedreht.

momentan sind wir ein wenig ratlos. unser derzeitiger ansatz ist die geschichte mit dem logging und der fragmentierung....

hoffe jmd kennt ein ähnliches problem/phänomen.

danke schonmal.

gruß