Har du testat och timat de olika delarna av scripten?
Kan vara något att gå på för att få en vink om "vart" i scriptet som flaskhalsen ligger.
cya,
PatrikB
11 svar · 531 visningar · startad av nill
Har ett akut problem. Min sida, ett webspel (dekrim.tk) har blivit tillfälligt stängd. Så här skrev de till mig:
"Vi har precis stängt av ert hemsida. Detta pga ett script ni lagt upp
konsumerade så mycket processor-kraft och/eller minne, att andra sidor
slutade fungera och/eller servern hängde sig.
Det script/sida som krånglar är: /dekrim/asp/lyan.asp och
/dekrim/asp/fester.asp"
Så det är ganska uppenbart att jag behöver snabb hjälp. Hade cirka 800 unika besök per dag innan så.
Där är cirka 700 rader kod i både de filerna så jag vet inte var jag ska börja. Jag är villig att lägga upp all kod om någon är intresserad.
Det finns ett stycke kod som är ganska gemensam för de båda så ser om någon kan se något allvarligt fel på det så länge:
VarDammit = "SELECT pengar FROM users WHERE ID = " & Session("userID")
RecSet.Open VarDammit, Connect, 3, 3
If RecSet("pengar") >= cInt(Request.Form("bjud")) Then
RecSet("pengar") = RecSet("pengar") - cInt(Request.Form("bjud"))
RecSet.Update
RecSet.Close
Dim Gaster, Vilka(), TotaltAntal, RndTal, Loopen, InteSamma
If Int(Request.Form("bjud")) = 500 Then Gaster = 5
If Int(Request.Form("bjud")) = 1500 Then Gaster = 10
If Int(Request.Form("bjud")) = 3000 Then Gaster = 20
If Int(Request.Form("bjud")) = 10000 Then Gaster = 50
Randomize
Redim Vilka(Gaster)
VarDammit = "SELECT ID FROM users"
RecSet.Open VarDammit, Connect, 3, 3
arrUser = RecSet.GetRows()
For i = 0 To (Gaster - 1)
Loopen = True
Do Until Loopen = False
Vilka(i) = arrUser(0, Round(Rnd * Ubound(arrUser, 2)))
Loopen = False
For k = 0 To (i - 1)
If Vilka(k) = Vilka(i) Then Loopen = True
Next
If Vilka(i) = Session("userID") Then Loopen = True
Loop
VarDammit = "INSERT INTO meddelande (typ, texten, till, fron, tid, datum) VALUES ('Inbjudan', 'Du är bjuden på fest hos mig Natt " & (Natt + 4) & ". <BR><A HREF=""/dekrim/asp/fester.asp?pyssel=acceptera&ID=" & Session("userID") & """>Klicka HÄR för att acceptera inbjudan</A>', " & Vilka(i) & ", " & Session("userID") & ", #" & Time & "#, #" & Date & "#) "
Connect.Execute VarDammit,,128
Next
VarDammit = "INSERT INTO fester (festhos, natt, bjuden) VALUES (" & Session("userID") & ", " & (Natt + 4) & ", " & Session("userID") & ") "
Connect.Execute VarDammit,,128
Set RecSet = Nothing
Connect.Close
Set Connect = Nothing
Response.Write "Inbjudningar till dina " & Gaster & " gäster är nu skickade.<BR> Festen kommer att äga rum 4 nätter från nu, alltså <B>Natt " & (Natt + 4) & "</B><P>Observera att du måste vara hemma åtminstonde en liten stund natten då festen äger rum. Så att du kan ta emot dina gäster."
Har du testat och timat de olika delarna av scripten?
Kan vara något att gå på för att få en vink om "vart" i scriptet som flaskhalsen ligger.
cya,
PatrikB
Lita inte till 100% på vad de skriver. Hade själv ett liknande problem med en relativt simpel ASP-sida som låg hos swede.com (eller snarare en sida jag skrivit åt en kund).
De kom med allehanda beskyllningar (som att jag skulle sänkt deras server med flit) och stängde sidan utan pardon. Men när det kom till kritan kunde deras s.k. "experter" inte peka ut vad det skulle varit som orsakade serverkrasherna (sidan hade fungerat utan problem innan, både på ett annat webbhotell, samt på swede.com innan de uppgraderade sina servrar -- fungerade även utan problem på det webbhotell vi bytte till efter att ha tröttnat på swede.com).
Hjälper dig kanske inte så mycket, men ... :)
Det är en hyfsad loop i databashanteringen. Kan vara det.
Fråga webbhotellet hur många domäner dom har på servern.
Jag kan tyvärr inte se i koden om du ansluter till databasen med en DSN anslutning, men jag misstänker att databasen ligger på samma server som webbservern. Är det många domäner som kör med databaser, och allt är på samma server, så KAN det vara ett serverproblem, fel optimering dålig prestanda mm.
Fast din kod är ju inte helt optimerad, så både din kod och trög server tror jag är problemet
Om webbhotellet inte vill tala om hur många domäner dom har, så hota med att flytta...
Dessutom tycker jag att webbhotellet ska påvisa scriptfelet, och inte bara hänvisa till din fil.
Har fått lite mer specikik info om vad som är fel. Åtminstonde en sak. Något i den här koden:
VarDammit = "SELECT bjuden FROM fester WHERE festhos = " & Request.QueryString("ID")
RecSet.Open VarDammit, Connect, 3, 3
Dim Festfolk, Fortsatt
Festfolk = RecSet.GetRows()
RecSet.Close
For i = 0 To UBound(Festfolk, 2) ' Så att man inte känner folk 2 gånger
For k = 0 To UBound(Festfolk, 2)
VarDammit = "SELECT * FROM relationer WHERE person1 = " & cInt(Festfolk(0, k)) & " And person2 = " & cInt(Festfolk(0, i)) & " Or person1 = " & cInt(Festfolk(0, i)) & " And person2 = " & cInt(Festfolk(0, k))
RecSet.Open VarDammit, Connect, 3, 3
Fortsatt = False
If RecSet.EOF Then Fortsatt = True
RecSet.Close
If k <> i And Fortsatt = True Then
VarDammit = "INSERT INTO relationer (person1, person2) VALUES (" & cInt(Festfolk(0, i)) & ", " & cInt(Festfolk(0, k)) & ") "
Connect.Execute VarDammit,,128
End If
Next
Next
'Lägga till Horor
If cInt(Session("userID")) = cInt(Request.QueryString("ID")) Then
VarDammit = "SELECT * FROM horor WHERE skapades = " & Natt & " And agare = " & Session("userID")
RecSet.Open VarDammit, Connect, 3, 3
If RecSet.EOF Then
RecSet.Close
Dim Horor, Namn
Randomize
Horor = Int(Rnd * 5) + 1
Namn = Array("Hora", "Tracy", "Dolly", "Molly", "Polly", "Cindy", "Dixie")
For i = 1 To Horor
VarDammit = "INSERT INTO horor (namn, pris, skapades, agare) VALUES ('" & Namn(i) & "', " & (Int(Rnd * 2000) + 200) & ", " & Natt & ", " & Session("userID") & ") "
Connect.Execute VarDammit,,128
Next
Else
Horor = RecSet.RecordCount
RecSet.Close
End If
End If
VarDammit = "SELECT nick FROM users WHERE ID = " & Request.QueryString("ID")
RecSet.Open VarDammit, Connect, 3, 3
If cInt(Session("userID")) = cInt(Request.QueryString("ID")) Then
Response.Write "Du är för närvarande upptagen med din egen fest och kommer <BR>att vara det hela kvällen."
Response.Write "<P>Det har kommit några <B>horor</B> till din fest och du får numret till " & Horor & " av dem. "
Else
Response.Write "Du är för närvarande på fest hos " & RecSet("nick") & " och kommer <BR>att vara det hela kvällen."
End If
Response.Write "<BR>Du super, minglar och snackar <BR>med lite av folket på festen. De är: <P>"
RecSet.Close
VarDammit = "SELECT fester.bjuden, users.nick, users.titel FROM fester LEFT JOIN users ON fester.bjuden = users.ID WHERE fester.festhos = " & Request.QueryString("ID") & " And fester.bjuden <> " & Session("userID")
RecSet.Open VarDammit, Connect, 3, 3
If RecSet.EOF Then
Response.Write "<I>Det kom inga gäster</I>"
Else
%><UL STYLE="list-style-type: square;"><%
Do Until RecSet.EOF
Response.Write "<LI><B>" & RecSet("nick") & "</B> - " & RecSet("titel") & "<BR>"
RecSet.MoveNext
Loop
%></UL><%
End If
RecSet.Close
Set RecSet = Nothing
Connect.Close
Set Connect = Nothing
kan förklara en liten del av koden. Den jag misstänker krånglar.
I tabellen 'fester' finns de användare som ska gå på en fest.
alla på festen ska lära känna varandra och relationer lagras i tabellen 'relationer'. tabellen består av 2 kolumner 'person1' och 'person2'. I de kolumner lagras användarnas ID. t.ex användare 1 känner användare 2.
självklart ska det inte finnas en post där användare 2 känner användare 1.
och den koden jag har löst det med är följande:
VarDammit = "SELECT bjuden FROM fester WHERE festhos = " & Request.QueryString("ID")
RecSet.Open VarDammit, Connect, 3, 3
Dim Festfolk, Fortsatt
Festfolk = RecSet.GetRows()
RecSet.Close
For i = 0 To UBound(Festfolk, 2) ' Så att man inte känner folk 2 gånger
For k = 0 To UBound(Festfolk, 2)
VarDammit = "SELECT * FROM relationer WHERE person1 = " & cInt(Festfolk(0, k)) & " And person2 = " & cInt(Festfolk(0, i)) & " Or person1 = " & cInt(Festfolk(0, i)) & " And person2 = " & cInt(Festfolk(0, k))
RecSet.Open VarDammit, Connect, 3, 3
Fortsatt = False
If RecSet.EOF Then Fortsatt = True
RecSet.Close
If k <> i And Fortsatt = True Then
VarDammit = "INSERT INTO relationer (person1, person2) VALUES (" & cInt(Festfolk(0, i)) & ", " & cInt(Festfolk(0, k)) & ") "
Connect.Execute VarDammit,,128
End If
Next
Next
och är också den koden jag skulle uppskatta om någon kunde ge något mindre resurskrävande förslag på.
For i = 0 To UBound(Festfolk, 2) ' Så att man inte känner folk 2 gånger
For k = 0 To UBound(Festfolk, 2)
VarDammit = "SELECT * FROM relationer WHERE person1 = " & cInt(Festfolk(0, k)) & " And person2 = " & cInt(Festfolk(0, i)) & " Or person1 = " & cInt(Festfolk(0, i)) & " And person2 = " & cInt(Festfolk(0, k))
RecSet.Open VarDammit, Connect, 3, 3
Fortsatt = False
If RecSet.EOF Then Fortsatt = True
RecSet.Close
If k <> i And Fortsatt = True Then
VarDammit = "INSERT INTO relationer (person1, person2) VALUES (" & cInt(Festfolk(0, i)) & ", " & cInt(Festfolk(0, k)) & ") "
Connect.Execute VarDammit,,128
End If
Next
Next
gör så att du rent teoretiskt kör hur många exekveringar mot db som helst.
Spåna på detta: arrayen <Festfolk> innehåller 50 st (de 50 som ska på fest)
Du börjar med att loppa Festfolk.
För varje varv i Festfolk så loopar du igenom den igen, dvs, du kör kvadraten av antal index i arrayen mot db, i detta fall: 50*50=2500 inserts mot dbn ..... e nog en liiiiiten propp ;)
<redigerat>
plus att du gör en hämtning från db oxå i varje varv
Kan tyvärr inte just nu på rak arm ge dig en lösning :(
</redigera>
cya,
PatrikB
usch det blev mycket att tänka på det där.
kan man inte bara få ett kodförslag :)
tyvärr, vet inte riktigt vad det är som ska göras, ej heller vet jag db-strukturen .......
cya,
PatrikB
det har jag ju beskrivit och förklarat :(