Laden...

ASP Performance

Erstellt von Lion1984 vor 16 Jahren Letzter Beitrag vor 16 Jahren 4.808 Views
L
Lion1984 Themenstarter:in
770 Beiträge seit 2006
vor 16 Jahren
ASP Performance

Hallo liebes Forum,

ich komme mit einem Problem zu euch, wo ich ehrlich gesagt nicht mehr weiter weiß. Folgendens:

Es handelt sich um eine ASP Webseite, bei welcher mir der Datenbankzugriff sehr langsam erscheint. Ist auf einer Seite kein Datenbankzugriff, so geht dieser normal rassant, befindet sich jedoch ein zugriff, so braucht die Seite mal gute 15, 20 Sekunden zum laden. Auch bei einer Auswahlbox im PostBack braucht diese 15,20 Sekunden.

Daher meine Frage, wo das Problem liegen könnte um diesen Zugriff zu verkürzen?
Bei der Abfrage handelt es sich um eine SP, die ein Feld zurückliefert und die Tabelle nicht gerade groß ist (zurzeit max. 3000 Datensätze)
Die abfrage selbst scheint zu gehen, habe die zeit davor und danach gelesen (DateTime.NOW() und die war gleich). In den Page_Loads steht auch nichts, ausser eben der DB zugriff.

An der Verbindung kanns auch nicht liegen, da andere Seiten dieses PRoblem nicht haben.

Um es zu betiteln. Einige brauchen 2 min für einen Prozess (Seite starten, eingaben machen, seite drucken) andere bis zu 5 min.

Hoffe hab alles wichtige erklärt, wenn code auschnitte benötigt werden, werden diese am M;ontag nachgereicht, da am Wochenende nicht gearbeitet wird 🙂

lg Lion

lg Lion

5.941 Beiträge seit 2005
vor 16 Jahren

Hallo Lion

Reden wir hier von ASP oder ASP.NET?
An ASP (egal welche Version) kann das, laut deinem Beschrieb, sicher nicht liegen.
Bitte gib doch mal ein paar Informationen zu deiner Datenbank preis.
Der relevante Code dazu wäre sicherlich auch hilfreich.

Gruss Peter

--
Microsoft MVP - Visual Developer ASP / ASP.NET, Switzerland 2007 - 2011

L
Lion1984 Themenstarter:in
770 Beiträge seit 2006
vor 16 Jahren

Hallo,

also es handelt sich ASP.NET, und wie gesagt, bis Montag gibts kein Source, werde ihn aber nach bestem gewissen beschreiben und nachreichen.

Also Die Datenbank liegt auf MS SQL server, und hat, geschätzt 10 Tabellen.
Bei der SP handelt es sich um eine Tabelle, es werden auch keine Joins oder ähnliches angeführt. Es sind, wie erwähnt knapp 3000 Datensätze erhalten mit ungefüjr 15 Spalten. Es wird 1 Parameter übergeben, nach diesem wird gefiltert und nach einer ID absteigend geordnet.

Soviel zur Datenbank, codetechnisch realisiere ich dieses per "Hand". also ich hab den Conenction string zur Datenbank (mit Pooling = false und username/pw), lege den Typ auf SP fest, gib den Namen an, öffne die Verbindung und hole mir den Reader.

Beim Reader mache ich .read(), da mich eh nur der erste Datensatz interessiert, und lese eine gewisse Spalte aus. Das wärs codetechnisch.

Die Angaben beziehen sich auf 1 Seite, die wichtig ist, bei anderen wäre es egal ob sie langsam ist oder nicht. (nehm aber an, dass das Problem das gleiche ist)

Was ich sagen kann ist, dass wenn ich in der Auswahl ein Item auswähle, die Seite beginnt neuzuladen, der Ladebalken läuft eigentlich sehr flüssig durch, aber am ende hackt er und macht eben diese lange Pause, da der User 3mal was wählen muss, addiert sich das doch schon zu einer gewissen Wartezeit, die ich gern umgehen mag.

An der Verbindung "sollte" es nicht liegen, da der ping auf 21 ms ist, und wie gesagt, andere Seiten flüssig laufen.

Hoffe ich habe mal einiges aufklären können.
lg

lg Lion

S
8.746 Beiträge seit 2005
vor 16 Jahren

Beim DB-Zugriff das Pooling abzuschalten kostet enorm Performance. Vielleicht liegt es ja daran.

L
Lion1984 Themenstarter:in
770 Beiträge seit 2006
vor 16 Jahren

Hallo,

das hatte ich mir auch gedacht und hab es mal entfernt, da dauert die Seite noch länger, habe aber nicht daran gedacht, es per hand mal zu aktivieren. werde ich nachholen.

lg

lg Lion

L
Lion1984 Themenstarter:in
770 Beiträge seit 2006
vor 16 Jahren

Guten Morgen, Montag ist und wie versprochen, der relevante code:

Der ConnectionString in der config:

<add name="NameDesStrings" connectionString="Data Source=DataSource;Initial Catalog=xxx;User ID=sa; Password=xxx;Pooling=True; " providerName="System.Data.SqlClient"/>

Die folgende DB Abfrage: (wird auf der relvanten Seite 3mal aufgerufen, aber wie gesagt, das Prolbem ist auch auf anderen Seiten des selben Projekte/Anwendung)

        SqlCommand cmd = new SqlCommand("name_der_SP", new SqlConnection(GetConnectionString()));
        cmd.CommandType = CommandType.StoredProcedure;
        cmd.Parameters.AddWithValue("suche", Location);
        cmd.Connection.Open();
        SqlDataReader reader = cmd.ExecuteReader(CommandBehavior.CloseConnection);
        reader.Read();
        return reader["Result_der_SP"].ToString();


Das wars eigentlich, diese Funktion wird Aufgerufen und mit dem Ergebniss ein wenig gearbeitet (1 x Split und einmal String's zusammenführen).

Die SP bekommt den paramenter, selektiert alle Reihen in der Tabelle, wo eine passende Spalte diesen Wert hat, Ordner sie Absteigend und gib den ersten Datensatz zurück (TOP 1). Es werden hier keine "unnötigen" Spalten mitabgefragt / zurückgegeben, sondern nur auf dieser einen Spalte.

Pooling habe ich nun aktiviert und warte darauf, dass ich auf den Testrechner kann.

lg Lion

5.941 Beiträge seit 2005
vor 16 Jahren

Hallo Lion1984

Sieht soweit nicht verdächtig aus 😉
Aber folgendes kannst du noch ändern:


SqlDataReader reader = cmd.ExecuteReader(CommandBehavior.CloseConnection);
        reader.Read();
        return reader["Result_der_SP"].ToString(); 

wird zu:


return cmd.ExecuteScalar().ToString();

Gruss Peter

--
Microsoft MVP - Visual Developer ASP / ASP.NET, Switzerland 2007 - 2011

L
Lion1984 Themenstarter:in
770 Beiträge seit 2006
vor 16 Jahren

Das es nicht verdächtig aussieht, ist mir klar, denn wenn was verdächtig aussieht, hätte ich ja das Problem eingrenzen können 🙂

ExecuteScalar habe ich auch vorher verwendet, aber habs einmal umgestellt, weil es eben vielleicht daran lag, war aber nicht der fall und ich habs nicht zurück geändert.

Was noch zu sagen ist, ich bekam seit start der Anwendung bis vor kurzem die Fehlerwarnung: Event message: Membership credential verification failed.

Dies habe ich bereits behoben und scheint nun keine Probleme mehr zu machen, aber liegt es even. an der falschen Auth. Methode?

Das Problem was hier war/ist, dass, wie das Projekt angefangen hat, das Ziel war, dass Benutzer (AD) auch derren Gruppenzugehörigkeit beibehalten und nur bestimmte Aktionen/Funktionen in der Webseite benützen können, dass ging aber dann baden. Jetzt verwende ich, aus anderen Zwecken, die mitgelieferte ASP Datenbankmethode und habe in der config die Methode auf Forms eingestellt.

Aber dieses Problem war davor und danach.

lg Lion

L
Lion1984 Themenstarter:in
770 Beiträge seit 2006
vor 16 Jahren

Hallo,

also weder Pooling = true noch die Codeverbesserung brachte was.

Wie gesagt, was für mich unverständlich ist, ist dass der Ladebalken vom IE flüssig durchrennt und am ende erst hackt. d.h. aus meiner Sicht, dass er am Ende (oder beim Neuladen ?) was drin, was eben diese Wartezeit verursacht. Nur ich finde nichts..

Morgen gehts mal vor ort.. Daher gleich die Frage an die Experten. Macht es ein unterschied ob ich "Remote Debugger" verwende oder das Projekt direkt im FileSystem öffne? Falls es an der Verbindung liegt, wäre das doch egal, denn die Verbindung wäre in beiden Fällen gleich ?

lg Lion

1.274 Beiträge seit 2005
vor 16 Jahren

Hallo,

wie lange dauert die ausführung der StoredProcedure im SQL Server direkt?

lg.
LastGentleman

"Das Problem kennen ist wichtiger, als die Lösung zu finden, denn die genaue Darstellung des Problems führt automatisch zur richtigen Lösung." Albert Einstein

L
Lion1984 Themenstarter:in
770 Beiträge seit 2006
vor 16 Jahren

Hallo,

also wenn ich die SP im Management Studio ausführe und das unten die Zeit ist, dann steht da 00:00:00. also das ergebnis ist sofort da.

lg

lg Lion

L
Lion1984 Themenstarter:in
770 Beiträge seit 2006
vor 16 Jahren

Hallo,

also für alle Helfer und mitleser, das rätzel raten geht weiter 🙂

ich war nun vor ort und habe mir das angeschaut, öffne ich das Projekt am laufwerk und führ es aus, so rennt das ding ohne Performance Probleme, weder Datenzugriff, noch laden, noch irgendwas.

Dies lässt mich jetzt vermuten, dass der IIS schlecht für diese Anwendung eingestellt ist, und da stehe ich an, ich wüßte keine Einstellung, die Performance Probleme mitsich bringt.

Habt ihr da Tipps wo man ansetzten könnte?

lg

lg Lion

1.274 Beiträge seit 2005
vor 16 Jahren

Ich hab noch einen, verbinde dich mit dem Visual Studio zum IIS und debuge den ausführenden Code. Vielleicht siehst du eine Zeile wo er hengt.

Lg.
LastGentleman

"Das Problem kennen ist wichtiger, als die Lösung zu finden, denn die genaue Darstellung des Problems führt automatisch zur richtigen Lösung." Albert Einstein

L
Lion1984 Themenstarter:in
770 Beiträge seit 2006
vor 16 Jahren

Hallo,

das konnte ich leider vor ort nicht machen, er lehnte die verbindung ab, ich muss die server extension nachinstallieren, dass muss ich nachholen und nächste woche wahrscheinlich wieder vor ort. wenns nicht besser wird.

lg

lg Lion

1.274 Beiträge seit 2005
vor 16 Jahren

Hast du die Datenbank bei dir, ist es lokal auch?

"Das Problem kennen ist wichtiger, als die Lösung zu finden, denn die genaue Darstellung des Problems führt automatisch zur richtigen Lösung." Albert Einstein

L
Lion1984 Themenstarter:in
770 Beiträge seit 2006
vor 16 Jahren

Hallo,

also die Datenbank war beim entwickeln natürlich lokal, wie die Anwendung dann startete, ging sie natürlich auf einen MS SQL Server 2005, der im LAN zugänglich ist. Von meinem Rechner bzw. im Firmen netzwerk war kein Unterschied an der Geschwindigkeit zu merken, ging alles problem los.

Dann (2 - 3 Monate später), meinte ein Manager, die Anwendung sei extern (also durchs Internet) relativ langsam im vergleich. Darauf hin schickte ich eine Rundmail und bekam von jedem einsatzort eine Besätigtung, dass dies anscheind der Fall ist.

Jetzt sitzte ich daran, und versuche den Fehler zu finden. Mir ist klar, dass durchs Internet/Intranet je nach Anbindung eine Verzögerung auftreten kann. Jedoch ist die Startseite, wo kein Datenbankzugriff ist, relativ schnell da, und er hackt eben nur bei einer Änderung, die die Datenbank betrifft.

Also war ich heute vor Ort und habe mir das angeschaut. Starte ich die Anwendung über's VS (Öffnen, Webseite, Pfad im Netzwerk) und mit dem integrierten Server starte, dann paßt alles einwandfrei (die Datenbank bleibt die selbe und die Verbindung ist die gleiche, wie es ein Rechner hat, der Probleme macht).

Daher liegt meine Vermutung, dass es nicht dirket die Anwendung ist, sondern eher eine Einstellungssache im IIS, nur da stehe ich zur Zeit an, weil wie erwähnt ich nicht weiß, welche Einstellung dieses Problem verursacht.

Das Problem nochmal zusammengefasst: Bei Änderung beginnt die Seite neuzuladen, unten der Ladebalken des IE's rennt flüssig durch, bis am ende, am Ende hackt es (5 - 10 sek). Nachdem der Anwender dies 3,4 mal machen muss, sind das mindestens 15 sekunden (wenn nicht mehr) die ich gewinnen kann.

lg

lg Lion

1.274 Beiträge seit 2005
vor 16 Jahren

Wie meldest du dich am SQL-Server an?
SQL Auth. oder Windows Auth.?

Kann es daher vielleicht kommen? Wurde der IIS schon mal neugestartet. Pingen die Rechner untereinander relativ Performant?

"Das Problem kennen ist wichtiger, als die Lösung zu finden, denn die genaue Darstellung des Problems führt automatisch zur richtigen Lösung." Albert Einstein

L
Lion1984 Themenstarter:in
770 Beiträge seit 2006
vor 16 Jahren

Hallo,

ich melde mich mit einer SQL Auth. an, dächte wäre aus dem Conencection string ersichtlich. wie man sieht, habe ich auch sa und einen eigenen Account dafür versucht, beides klappte nicht.

ping ist perfomant, habe ich aber, glaub ich, auch schon erwähnt 🙂

lg

lg Lion

1.274 Beiträge seit 2005
vor 16 Jahren

Wie sieht es den mit einer Abfrage aus die nicht auf die Datenbank zugreift, z.B. die SQL Server Version?

lg
LastGentleman

"Das Problem kennen ist wichtiger, als die Lösung zu finden, denn die genaue Darstellung des Problems führt automatisch zur richtigen Lösung." Albert Einstein

L
Lion1984 Themenstarter:in
770 Beiträge seit 2006
vor 16 Jahren

Hallo,

warum vermutest du, dass es noch der SQL Server ist?

den wie gesagt, ich war vor Ort, die Datenbankzugriffe sind es nicht.
Warum? Ganz einfach, weil wenn man einen Wert aus der Auswählt nimmt, wird eine Abfrage durchgeführt und das Ergebniss dargestellt. Das Ergebniss is unmittelbar vorhanden, nur eben lädt er die Seite neu, da hackt er am Ende / Anfang, wie mans nimmt.

Meine Page_Load's sind alle leer, ausser auf der Masterseite, da hab ich paar Zeilen Code, die mir den Titel des IE's schreiben.

lg

lg Lion

1.274 Beiträge seit 2005
vor 16 Jahren

Hast du schon mal einer neuen Seite probiert (ganz ohne schnick schnack), die Abfrage ausgeführt und die Zeit gemessen.

"Das Problem kennen ist wichtiger, als die Lösung zu finden, denn die genaue Darstellung des Problems führt automatisch zur richtigen Lösung." Albert Einstein

L
Lion1984 Themenstarter:in
770 Beiträge seit 2006
vor 16 Jahren

Hallo,

sry liest du eigentlich meine beiträge? soll kein böser vorwurf sein, also:

.) die startseite ist eine komplette leere Seite ohne schnick schnack, die lädt auch so wie es sich gehört.

.) der Datenbnak zugriff (wie öfters erwähnt) wird ausgeschlossen, da ich beim debuggen den aufruf flüssig überspringen kann und weil das ergebniss der abfrage bereits in der textbox steht, BEVOR die seite beginnt zu pausieren.

.) Zeit war mit meinen kenntniss stand nicht messbar, also wirklich nur paar ms oder weniger (kA wie schnell ein SQL Server wirklich ist)

Da der einzige Unterschied war, dass per Debugger am integrieten Webserver aufgerufen wird, und sonst per IIS vermute ich stark, dass der IIS oder die Einstellungen für meine Anwendung falsch / nicht optimal sind.
Nur da weiß ich nicht, welche Option dies verursachen könnte.

lg

lg Lion

1.274 Beiträge seit 2005
vor 16 Jahren

die startseite ist eine komplette leere Seite ohne schnick schnack, die lädt auch so wie es sich gehört.

oben hast du geschrieben, das es in einer Master Page drinnen ist, vielleicht ist dort noch Code,darum meine Aussage

der Datenbnak zugriff (wie öfters erwähnt) wird ausgeschlossen, da ich beim debuggen den aufruf flüssig überspringen kann und weil das ergebniss der abfrage bereits in der textbox steht, BEVOR die seite beginnt zu pausieren.

OK dann kann man das wirklich ausschließen.

Zeit war mit meinen kenntniss stand nicht messbar, also wirklich nur paar ms oder weniger (kA wie schnell ein SQL Server wirklich ist)

Da der einzige Unterschied war, dass per Debugger am integrieten Webserver aufgerufen wird, und sonst per IIS vermute ich stark, dass der IIS oder die Einstellungen für meine Anwendung falsch / nicht optimal sind.
Nur da weiß ich nicht, welche Option dies verursachen könnte.

Geht sonst alles ASP.NET Seiten auf dem Server flüssig?

lg

"Das Problem kennen ist wichtiger, als die Lösung zu finden, denn die genaue Darstellung des Problems führt automatisch zur richtigen Lösung." Albert Einstein

L
Lion1984 Themenstarter:in
770 Beiträge seit 2006
vor 16 Jahren

Hallo,

stimmt das hab ich noch nicht erwähnt, die startzeite ist gleichzusetzten mit der masterpage, also alles was dort ist, kommt von der masterpage.

Also andere Anwendungen sind von meinem Firmenvorgänger und ausschließlich mit VB. Da rennen die Anwendungen / Seiten flüssig, also keine Pausierungen wie es mir der Fall ist. Ich habe die Einstellungen zwischen den Seiten auch schon verglichen, finde dennoch keinen unterschied.

lg

lg Lion

L
Lion1984 Themenstarter:in
770 Beiträge seit 2006
vor 16 Jahren

Hat den keiner mehr eine Idee wo der Hund begrabben sein könnte?
Habe Schaufel bereits in der Hand ..

lg

lg Lion

5.941 Beiträge seit 2005
vor 16 Jahren

Hallo Lion

Original von Lion1984
Habe Schaufel bereits in der Hand ..

Nun denn, anfangen zu graben 🙂

Die Ablaufverfolgung könnte dich evt. weiterbringen:

Gruss Peter

--
Microsoft MVP - Visual Developer ASP / ASP.NET, Switzerland 2007 - 2011

L
Lion1984 Themenstarter:in
770 Beiträge seit 2006
vor 16 Jahren

Hallo,

danke für die Stichworte, werde mal dann, zwischen den Grabpausen mal schauen ob ich was nützliches find.. mein Server-PC hat schon einige Löcher drin.. dennnoch half es bis jetzt nicht 🙂

lg

lg Lion

L
Lion1984 Themenstarter:in
770 Beiträge seit 2006
vor 16 Jahren

Hallo,

also ich bin mir nicht sicher, wie die Werte des Traces bedeutung haben, denn dass ist/war die erste Webanwendung die ich trace.

folgendes kamm heraus:
Trace 1:

Trace Information
Category Message From First(s) From Last(s)
aspx.page Begin PreInit
aspx.page End PreInit 0,00272193513273512 0,002722
aspx.page Begin Init 0,00284947543308102 0,000128
aspx.page End Init 0,00299671724947901 0,000147
aspx.page Begin InitComplete 0,0030574502825142 0,000061
aspx.page End InitComplete 0,0030908084417677 0,000033
aspx.page Begin PreLoad 0,00351973947106467 0,000429
aspx.page End PreLoad 0,00359618945996462 0,000076
aspx.page Begin Load 0,00365879732739421 0,000063
aspx.page End Load 0,048779799339726 0,045121
aspx.page Begin LoadComplete 0,0488868303267712 0,000107
aspx.page End LoadComplete 0,048962432415013 0,000076
aspx.page Begin PreRender 0,0489945337620579 0,000032
aspx.page End PreRender 0,085184085391617 0,036190
aspx.page Begin PreRenderComplete 0,0852799346887331 0,000096
aspx.page End PreRenderComplete 0,0853156568007505 0,000036
aspx.page Begin SaveState 0,0927943382579365 0,007479
aspx.page End SaveState 0,0948232284676917 0,002029
aspx.page Begin SaveStateComplete 0,0948860640651967 0,000063
aspx.page End SaveStateComplete 0,094919694354729 0,000034
aspx.page Begin Render 0,0949503741791333 0,000031
aspx.page End Render 0,163322104856093 0,068372

Trace 2:

Trace Information
Category Message From First(s) From Last(s)
aspx.page Begin PreInit
aspx.page End PreInit 0,00053139524058465 0,000531
aspx.page Begin Init 0,000582381712845265 0,000051
aspx.page End Init 0,000664595850729381 0,000082
aspx.page Begin InitComplete 0,000697043089681249 0,000032
aspx.page End InitComplete 0,000730157047816155 0,000033
aspx.page Begin LoadState 0,000762031380917938 0,000032
aspx.page End LoadState 0,0147211968003208 0,013959
aspx.page Begin ProcessPostData 0,0148184998460316 0,000097
aspx.page End ProcessPostData 0,0330489519403605 0,018230
aspx.page Begin PreLoad 0,0331283645686377 0,000079
aspx.page End PreLoad 0,0332682953902563 0,000140
aspx.page Begin Load 0,0333011035598937 0,000033
aspx.page End Load 0,0365296951424745 0,003229
aspx.page Begin ProcessPostData Second Try 0,036603065046298 0,000073
aspx.page End ProcessPostData Second Try 0,0366764055886966 0,000073
aspx.page Begin Raise ChangedEvents 0,0367082297925365 0,000032
aspx.page End Raise ChangedEvents 0,038903766139832 0,002196
aspx.page Begin Raise PostBackEvent 0,039029265463087 0,000125
aspx.page End Raise PostBackEvent 0,0390982569339511 0,000069
aspx.page Begin LoadComplete 0,0391326527689256 0,000034
aspx.page End LoadComplete 0,0392060577632323 0,000073
aspx.page Begin PreRender 0,0392408116643631 0,000035
aspx.page End PreRender 0,048201924247524 0,008961
aspx.page Begin PreRenderComplete 0,0483014766648286 0,000100
aspx.page End PreRenderComplete 0,0483344839192489 0,000033
aspx.page Begin SaveState 0,0559369022980686 0,007602
aspx.page End SaveState 0,0578445563202257 0,001908
aspx.page Begin SaveStateComplete 0,0579001797492105 0,000056
aspx.page End SaveStateComplete 0,0579325338909617 0,000032
aspx.page Begin Render 0,05796345648422 0,000031
aspx.page End Render 0,111300164710432 0,053337

Trace1 ist, wie die Seite lädt, aber auch einen Datenbankzugriff hat, Trace 2 ist, wenn ich in einer Combobox das Item wechsle. nach den Zeiten nach sind die in 0,2 (großzügig gerundet) durch, dass sind sie aber nicht. Daher meine Frage, was folgt nachher? folgt nachher noch was oder is "End Render" auch das "ende des ladens"?

@Peter Bucher, die meisten zeigen wie man den trace aktivert, bis jetzt hab ich keine Seite, die mir die "Bedeutung" erklärt.

danke nochmal für die links (an die ich sicher noch länger lese 😄) und für die hilfe.
lg

lg Lion