Anzeige

 Startgeschwindigkeit einer Forms-Anwendung miit einem RAID-System


pschilling

Erfahrenes Mitglied
#1
Hallo zusammen,

ich habe hier ein merkwürdiges Problem mit einem C#-Forms-Projekt.
Und zwar arbeite ich schon seit geraumer Zeit an einer Windows-Forms-Applikation welche auf einem 'normalen' PC ohne Beeinträchtigung läuft.

Nun wird die Software bei den ersten Kunden eingesetzt und dort läuft so ein Intel-RAID 1 und das Starten der Applikation dauert bis zu einer Minute. Auf normalen PC's mit einer Festplatte dauert es nicht mal eine Sekunde..

Ich habe das ganze nun auf einem anderen Rechner getestet mit demselben Startverhalten.

Durch exzessives Logging habe ich nun herausgefunden, dass der Großteil der Zeit für den Aufruf von InitializeComponents der MainForm draufgeht.

Die Applikation hat auch recht viele Verweise:
- EPPlus
- Postgres
- MySql
- SQLite
- Snap7
- OPC
- SharpZipLib

Hat von euch vielleicht jemand ähnliche Erfahrungen mit dem Ausführen von .NET Applikationen auf RAID-Systemen gemacht und eventuell eine Lösung parat?

Ich wäre für jeden Hinweis oder Schubser in die richtige Richtung sehr dankbar ;)

Grüße,

Peter
 
Zuletzt bearbeitet:

pschilling

Erfahrenes Mitglied
#2
Ich habe jetzt die verantwortliche Stelle durch Zeilenweises Loggen herausgefunden und zwar braucht es über 35 Sekunden das erste Control der MainForm hinzuzufügen.

this.Controls.Add(this.listOpc);

Der Aufruf dieser Funktion dauert jedesmal 35 Sekunden wobei listOpc eine generische ListView ist.
 

pschilling

Erfahrenes Mitglied
#5
Danke für eure Antworten, die .NET Runtime ist dieselbe wie auf allen anderen Rechnern.. (2.0 mit Service Pack 2)

Das hier ist die komplette Generierung der ListView bevor Sie der Form hinzugefügt wird:
Code:
            this.listOpc.Dock = System.Windows.Forms.DockStyle.Fill;
            this.listOpc.FullRowSelect = true;
            this.listOpc.HideSelection = false;
            this.listOpc.Location = new System.Drawing.Point(244, 61);
            this.listOpc.Margin = new System.Windows.Forms.Padding(4);
            this.listOpc.Name = "listOpc";
            this.listOpc.Size = new System.Drawing.Size(690, 539);
            this.listOpc.TabIndex = 1;
            this.listOpc.UseCompatibleStateImageBehavior = false;
            this.listOpc.View = System.Windows.Forms.View.Details;
            this.listOpc.MouseDoubleClick += new System.Windows.Forms.MouseEventHandler(this.listGroup_MouseDoubleClick);
            this.listOpc.VisibleChanged += new System.EventHandler(this.listOpc_VisibleChanged);
            this.listOpc.ColumnClick += new System.Windows.Forms.ColumnClickEventHandler(this.listOpc_ColumnClick);
            this.listOpc.KeyDown += new System.Windows.Forms.KeyEventHandler(this.listGroup_KeyDown);
Das einzige was hier eine Bearbeitung nach sich ziehen könnte wäre das VisibleChanged .. Dort wird aber nur, wenn vorhanden, ein Timer gestoppt..

Also wie gesagt, auf einem normalen PC läuft die Applikation rund. Es muss irgendwas mit diesem RAID-System zu tun haben :/

Übrigens ist es doch kein Fake-RAID sonder ein Intel Scsi RAID 1..
 
Zuletzt bearbeitet:

pschilling

Erfahrenes Mitglied
#6
Also die Ursache ist eine von mir geschriebene dll und deren Verwendung des SQLite-Verweises (System.Data.SQLite).
In dieser dll sind 5 Klassen, in welchen ausschließlich statische Funktionen existieren die SQLite-Operationen durchführen.

Kann es vielleicht sein, dass diese statischen Funktionen alle beim Laden instantiiert werden oder sowas was den langen Programmstart erklärt?
Aber warum startet die Applikation auf Rechnern ohne RAID dann normal schnell?

Hat jemand vielleicht eine Erklärung oder Lösungsvorschlag?

Das wird mich Tage kosten die statischen Funktionen alle umzuschreiben :(
 
#7
Also die Verlangsamung ist, bevor du irgendeine dieser DLL-Funktionen aufrufst?
Woher weißt du, dass die DLL Schuld ist?

...klingt trotzdem immer mehr nach einem Problem, das nicht in deinem Code ist.

Und um noch etwas Öl ins Feuer zu gießen, hatte vor Jahren selbst minutenlange Hänger in C#-Programmen, im Zusammenhang mit einer Mysql-Verbindung (ganz ohne Raid). Die Ursache hat sich damals eindeutig als Bug von Microsft herausgestellt, der zum Zeitpunkt meines Problems auch schon dokumentiert war. Erneuerung von .NET hat geholfen [und deine Version 2 ist ziemlich alt]. Vielleicht find ich die Beschreibung ja wieder...
 

pschilling

Erfahrenes Mitglied
#8
Hallo Sheel,

ja, die Verzögerung tritt direkt bei Programmstart auf bevor auch nur eine von mir geschriebene Funktion aufgerufen wird.

Woher ich das weiß, dass meine dll schuld ist:
ich habe eine App geschrieben welche dieselben dll-Verweise verwendet wie die App um die es geht. Bei denen habe ich dasselbe Startverhalten gehabt obwohl nicht eine einzige Zeile Code von mir hinzugefügt worden ist.
Dann habe ich die Verweise nach und nach entfernt und meine eigene dll war dann der Verursacher.
Dann habe ich die Verweise meiner dll nach und nach entfernt und der Programmstart war genau dann wieder normal-schnell als ich den sqlite Verweis entfernt habe.

Ich mach jetzt noch weitere Tests mit Applikationen und SQLite wobei ich dann aber auf statische Funktionen verzichte.
Was mich nur tierisch wurmt ist, dass dieses Phänomen nur bei Rechnern mit RAID-System auftritt! Sonst läuft ja alles wie gewollt :/

Upgrade auf eine neuere Visual Studio Version wird wohl nötig sein. Momentan habe ich hier nur 2005 was für meine Zwecke allerdings auch vollkommen ausreicht..
 
#9
Upgrade auf eine neuere Visual Studio Version wird wohl nötig sein. Momentan habe ich hier nur 2005 was für meine Zwecke allerdings auch vollkommen ausreicht..

Em Visual Studio 2015 ist gratis es spricht also nichts gegen einen Wechsel

ob es nun das Problem löst oder nicht sei mal dahin gestellt. Visual Studio 2015 ist übrigens auch für Firmen gratis solange du nicht mehr als 5 Lizenzen im Einsatz hast. Dafür hast du 1Mio mehr Möglichkeiten mit dem aktuellen Framework und Visual Studio. Wobei da auch einige must have Sachen dabei sind wie LINQ und async/await...


Aber auch Probleme mit der Leistung lassen sich dank Analystetools einfach finden.



Kann es sein das die dll einen Bug hat?

Oder du beim Start gleich irgendwelche Daten im Hintergrund lädst?

Könnte sein das dies dein Programm blockiert. Dann könntest du das Problem sehr einfach lösen. Beim Lokalen testen fallen solche Sachen meist nicht ins Gewicht da man so oder so viel zu viel Leistung hat. Welche auf einem Produktievsystem dann nicht mehr zur Verfügung stehen.


Die nächste Frage ist auch ob sich das verhalten nach mehrmaligem Starten ändert?


Gruss

Ademo
 

pschilling

Erfahrenes Mitglied
#10
Hallo Ademo,

wie bereits vorher beschrieben findet de krasse Zeitverzögerung beim Erstellen der MainForm statt und bis dahin passiert rein gar nichts.
Auch bei mehrmaligen Startversuchen ergibt sich keine Änderung im Laufzeitverhalten.

Performanceunterschiede der Rechner kann man ausschließen da die Zeitverzögerung auch bei Applikationen auftritt welche keinerlei Programmfunktionalitäten beinhalten aber ebenfalls auf die besagte dll verweist.
Der einzige Unterschied ist halt das RAID-System. Ohne RAID gibt es keinerlei messbaren Verzögerungen, egal wie lahm der Rechner auch ist..

Ich habe die App auf verschiedensten Systemen (XP, Win7, Win8 / 32 & 64 Bit) getestet und überall läuft es perfekt.
Nur wenn ein RAID System beteiligt ist ergibt sich die üble Zeitverzögerung...

Meine momentane Vermutung sind halt die 5 Klassen, welche zusammen ca. 120 statische SQLite-Methoden beinhalten welche wiederum Objekte aus anderen dll's als Parameter erwarten.
 

pschilling

Erfahrenes Mitglied
#12
Das ist ein Intel RAID 1...

Das es die Zugriffszeiten sind bezweifle ich da andere Applikationen normal schnell starten und ich wenn es daran liegen würde eine Verzögerung von maximal ein paar Sekunden und nicht einer ganzen Minute erwartete..

Ich bin schon am verzweifeln, da diese dll über die letzten Monate hinweg gewachsen ist und bei meinen Tests über verschiedene Plattormen hinweg nie Probleme aufwies..
Wenn ich die jetzt wegen dieser RAID-Problematik umschreiben muss ziehen locker einige Wochen ins Land :(
 
#13
Schade ich dachte es ist ein exotisches raid das hätte eine Ursache sein können aber bei Raid 1 glaub ich nicht.

Da ich gerade leider auch keine Idee habe und ich verstehe das es Schei*** ist wen du zu viel umschreiben musst.

Deshlab hau ich mal einfach ein paar Ideen ins blaue raus.

- https://www.microsoft.com/germany/msdn/library/net/WindowsFormsAnwendungen.aspx

- Lazy Initialization -->
https://msdn.microsoft.com/de-de/library/dd997286(v=vs.110).aspx

- Ich weiss das es eine möglichkeit gibt den Programmstart zu beeinflussen so das Programme nach mehrmaligem starten der Anwendungs der Start beschleunigt wird. Ich dachte jedoch das es sich dabei um eine Grundeinstellung handelt. Es kann aber natürlich auch sein das dies erst bei späteren .net versionen eingeführt wurde.
Im moment kommt es mir aber gerade nicht in den Sinn wo ich das schon mal gehört habe. Eventuell findest du was beim googeln.

- Ich kenne ja dein code nicht aber mal ganz naiv gefragt ist es möglich einen Teil in einen seperaten Threed zu verlagern das man wenigsten nicht das gefühl hat das es so Lange dauert? (asynchron)
 

pschilling

Erfahrenes Mitglied
#14
Bis hierhin erstmal vielen Dank für euer Bemühen und eure Hilfsbereitschaft (y)

Bevor ich die dll und meine Nerven jetzt vollends zerpflücke werde ich erstmal auf eine aktuellere Visual Studio Version upgraden und hoffen das sich das Problem mit einer aktuelleren nNET. Runtime in Wohlgefallen auflöst..

Melde mich nächste Woche mit hoffentlich guten Nachrichten ..
 

pschilling

Erfahrenes Mitglied
#15
Tja, da hab ich wohl Pech gehabt..

Ich habe jetzt die dll, das Programm und alle beteiligten Dienste auf .NET 3.5 hochgezogen aber das Startverhalten bleibt leider identisch...

Im neuen Jahr bekomme ich 'nen neuen Entwicklungsrechner mit RAID-System und dann werd ich wohl doch anfangen müssen die dll auseinanderzunehmen :(
 

pschilling

Erfahrenes Mitglied
#17
Hi saftmeister,

vielen Dank für den Vorschlag. Ich hab die App mal auf einen PC mit Raid-System über den Profiler durchlaufen lassen aber finde leider nichts verwertbares was mit dem langsamen Programmstart zu tun haben könnte.

Ich habe allerdings vorher noch nie mit dem Profiler gearbeitet. Vielleicht magst du ja mal einen Blick darauf werfen?

Grüße,
peter
 

Anhänge

saftmeister

Nutze den Saft!
Premium-User
#18
Hi,

also wenn ich mir das Logfile in den Profiler lade und auf "Histogram by Age" gehe, ist relativ auffällig, dass lange Zeit gar nichts passiert. Ca. 204 Sekunden ist das Programm damit beschäftigt, Objekte anzulegen. Allerdings sehe ich nicht, welchen Typs die Objekte sind, die lange für die Erzeugung benötigen. Möglicherweise ist der CLR Profiler nicht das richtige Tool für den Zweck. Aber schau mal, es gibt ANTS als 14-Tage-Probe-Version: http://www.red-gate.com/products/dotnet-development/ants-performance-profiler/ Damit sollte sich herausfinden lassen, in welcher Funktion das Programm genau hängt.

Es gibt eine Menge Resourcen auch in der MSDN zum Thema Profiling: https://msdn.microsoft.com/en-us/library/z9z62c29.aspx?f=255&MSPPError=-2147217396 Es schadet auf keinen Fall, sich mal damit auseinanderzusetzen. Hier noch ein "Tutorial" zum Thema CLR Profiler: http://geekswithblogs.net/robp/arch...c-part-4-using---and-understanding---clr.aspx Wobei dieser vor allem seine Stärken in der Auffindung von Speicher-Problemen zu haben scheint und der Performance eher wenig Beachtung schenkt.

Du könntest natürlich auch mal mit den VisualStudio-Board-Mitteln analysieren: https://msdn.microsoft.com/en-us/library/ms182403.aspx
 

saftmeister

Nutze den Saft!
Premium-User
#19
Noch was: Wie genau hast du via CLR Profiler die Analyse gestartet? Ich sehe da zwei Haken, die man setzen kann "Allocations" und "Calls". Das "Calls" klingt jetzt erstmal vielversprechend.
 

pschilling

Erfahrenes Mitglied
#20
Jo, das mit den 204 Sekunden ist mir auch sehr Schleierhaft, da die Applikation nach ca. 50 Sekunden bereits aktiv war ?! Und beim Starten hatte ich beide Häkchen aktiviert..

Ich werds mal mit dem Ants probieren! Danke dir ..
 
Anzeige

Neue Beiträge

Anzeige