webForumDet fria alternativet

Akut Hjälp - Webhotellet stängt sidan pga scriptfel

ASP

11 svar · 531 visningar · startad av nill

Medlem sedan okt. 2001387 inlägg
Frågan#1

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."
Medlem sedan mars 20002 836 inlägg
#2

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

Medlem sedan okt. 2001387 inlägg
#3

jag får inga fel lokalt .. det som är det skumma.

tima?

Medlem sedan aug. 20021 752 inlägg
#4

Bara kollat lite snabbt, vad händer om gaster är 0? blir det evighets loop då?

/Viktor

Medlem sedan dec. 19992 555 inlägg
#5

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 ... :)

Medlem sedan feb. 20001 590 inlägg
#6

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.

Medlem sedan okt. 2001387 inlägg
#7

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
Medlem sedan okt. 2001387 inlägg
#8

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

Medlem sedan mars 20002 836 inlägg
#9
	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

Medlem sedan okt. 2001387 inlägg
#10

usch det blev mycket att tänka på det där.
kan man inte bara få ett kodförslag :)

Medlem sedan mars 20002 836 inlägg
#11

tyvärr, vet inte riktigt vad det är som ska göras, ej heller vet jag db-strukturen .......

cya,
PatrikB

Medlem sedan okt. 2001387 inlägg
#12

det har jag ju beskrivit och förklarat :(

264 ms totalt · 4 externa anrop · v20260731065814-full.a51de22e
124 ms — deklarationer (db)
0 ms — hämta statistik (cache)
134 ms — hämta tråd, inlägg och bilagor (db)
126 ms — ändringar (db)