Startgeschwindigkeit einer Forms-Anwendung miit einem RAID-System

pschilling

Erfahrenes Mitglied
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
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.
 

Endurion

Erfahrenes Mitglied
Gibt es irgendwelche Events, die an der ListView hängen und evtl. eine Bearbeitung von irgendetwas auslösen?
 

pschilling

Erfahrenes Mitglied
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
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 :(
 

sheel

I love Asm
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
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..
 

ademo

Mitglied
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
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.