WN

WN (https://www.wn.se/forum/index.php)
-   Serversidans teknologier (https://www.wn.se/forum/forumdisplay.php?f=4)
-   -   Överbelastad webbplats (https://www.wn.se/forum/showthread.php?t=36756)

ledstrom 2009-05-11 21:19

Hej!

Vi kör en liten tjänst som är AJAX baserad, när vi kör tjänsten så får vi cirka 5,000 förfrågningar per sekund, vi ligger idag hos Loopia och kör i .NET miljö med MySQL som databas.

Det är otroligt lite data som hämtas men det är viktigt att det hämtas varje sekund så där kan vi inte göra något åt det. Vi hämtar data ifrån MySQL Servern och sedan lägger det i cachen.

Problemet vi har är helt enkelt att HTTP förfrågningarna går för segt, på dom cirka 10 raderna kod så är nog allt optimerat.

Vad behöver vi? Mer bandbredd? En snabbare server? Vad rekomenderas?
Vi vill helst inte alls hålla på med att sätta upp server utan att programmera. Duger en VPS? Vad är rekomenderad konfiguration?

Jonas 2009-05-11 22:00

Du ger ingenting egentligen.

AJAX anropet, vad anropar filen? Vad gör denna filen? Vad är det för output från filen?
Kör du ett JS ramverk (prototype, jquery, dojo mm)?

Har själv inte Loopia, men enligt tidigare poster här så verkar Loopias MySQL vara rätt seg, tillåter bara ett visst antal anslutningar mm.

ledstrom 2009-05-11 23:08

Hej!

Ursäkta, jag tror egentligen att det är en hårdvaru fråga.
Vi använder oss utav jQuery och det är json output ifrån filen med ett väldigt enkelt objekt, tjänsten fungerar klockrent när det är lite belastning. Så i och med det uteslutar vi klientsidan.

Men eftersom vi inte kör några MySQL frågor alls i princip eftersom hela webbplatsen har bara en fråga och den använder sig uta Cache.

Jag håller med om att Loopias MySQL inte är den bästa, 15 anslutningar tillåter dom bara, men jag tor ändå inte det är där felet ligger.

Jonas 2009-05-11 23:11

Hur ser queryn ut?
MySQL är väldigt kass på att cacha frågor, uppdateras tabellen så förloras cachen.

Vad för cache är det?

ledstrom 2009-05-12 07:53

Vi använder cachen som är inbyggd i ASP.NET
Queryn är en vanlig SELECT Test FROM tabel ORDER BY ID DESC <- Ungefär så, väldigt simpel

taz76 2009-05-12 08:03

Det kanske blir en skillnad om ni lägger query som en lagrad procedur istället? under förutsättning det körs mysql 5.x men det gör det väl säkert..

ledstrom 2009-05-12 08:55

Jag tror inte det beror på SQL frågan då den i sig själv inte är seg alls och desutom cachas. Problemet är nog att vi har så mycket besökare under korta interval och då känns det som att webservern inte klarar trycket.

danjel 2009-05-12 09:25

LÅter som CPU går i taket på webbservern..
Även om den läser från minnes cachen så är ju 5000/sek vääldigt mycket

taz76 2009-05-12 13:54

En lagrad procedur i mssql är iaf snabbare att köra än en sqlsats och jag förmodar det är liknande i mysql.

ledstrom 2009-05-12 14:21

danjel, det är alltså CPU kraft vi behöver om vi ska skaffa en ny server? Eller använder sig systemet utav mycket Minne?

Perben 2009-05-12 14:51

Alltså.. 5000 requests/sekund på en server, som ni kanske inte ens är exklusiva om, är en hel del. Varför inte be Loopia lastabalansera det på fler servrar, eller gör en balansering på DNS-nivå? Med sådana trafikmängder brukar man lämna "vanlig hosting" bakom sig och börja bygga någonting rejälare. Du nämner inte vad för sorts trafik det är, så svårt att veta vilken budget det rör sig om.

Vid små korta anrop behöver man pilla på Apaches och OS:ets inställningar för TCP-stacken för att optimera mot rätt sorts trafik, så hör med Loopia om du måhända kan få en egen webfront om inte annat. Man kan också göra väldigt mycket cachning ute i weblagret så att bara vänder ner till applagret visst ofta, mao att man stoppar in en Apache-modul som är gjord för just din tillämpning.

znap 2009-05-12 14:53

sätt upp en frontcache med varnish

Innocast 2009-05-12 15:13

SELECT SQL_CACHE `kolumn` FROM `table` WHERE `column` = 'value' LIMIT 1

Kan ju vara ett steg på vägen om inte Loopia / er lösning inte stödjer ovanstående förslag.

Onkelborg 2009-05-12 15:30

Det finns en sak till att fundera på: Behöver man 1 förfrågan/sekund? Är det någon som funderat över det?

I mina öron låter det som att man vill få saker i realtid, frågan är dock vad man vill få i realtid. Det kan nämligen finnas andra lösningar än att ligga och fråga servern varje sekund, lösningar som dessutom är mer responsiva än att konstant fråga servern. En vanlig variant är att servern väntar med att returnera ett svar tills det faktiskt kommit in någonting att skicka tillbaka, t.ex. ett meddelande i en chat. Man kommer visserligen få många parallella anslutningar till servern, men de flesta kommer vara vilande.

(Kräver Windows 2008 dock, dvs. IIS 7)

Innocast 2009-05-12 15:37

Citat:

Originally posted by Onkelborg@May 12 2009, 15:30
Det finns en sak till att fundera på: Behöver man 1 förfrågan/sekund? Är det någon som funderat över det?
I mina öron låter det som att man vill få saker i realtid, frågan är dock vad man vill få i realtid. Det kan nämligen finnas andra lösningar än att ligga och fråga servern varje sekund, lösningar som dessutom är mer responsiva än att konstant fråga servern. En vanlig variant är att servern väntar med att returnera ett svar tills det faktiskt kommit in någonting att skicka tillbaka, t.ex. ett meddelande i en chat. Man kommer visserligen få många parallella anslutningar till servern, men de flesta kommer vara vilande.
(Kräver Windows 2008 dock, dvs. IIS 7)

Och som uppföljning, om det är uppdatering varje sekund och det är 5000 requests / s så borde en ändring till uppdatering var 5:e sekund sänka antalet förfrågningar till 1000 / s. Ser ingen direkt anledning till en uppdatering så ofta som varje sekund. Eller hämta mer data med längre tid mellan.

eliasson 2009-05-12 15:49

Citat:

Originally posted by Onkelborg@May 12 2009, 13:30
Det finns en sak till att fundera på: Behöver man 1 förfrågan/sekund? Är det någon som funderat över det?
I mina öron låter det som att man vill få saker i realtid, frågan är dock vad man vill få i realtid. Det kan nämligen finnas andra lösningar än att ligga och fråga servern varje sekund, lösningar som dessutom är mer responsiva än att konstant fråga servern. En vanlig variant är att servern väntar med att returnera ett svar tills det faktiskt kommit in någonting att skicka tillbaka, t.ex. ett meddelande i en chat. Man kommer visserligen få många parallella anslutningar till servern, men de flesta kommer vara vilande.
(Kräver Windows 2008 dock, dvs. IIS 7)

Precis som han förklarar så bör du antagligen tänka om, för jag kan inte heller se någon anledning att skapa en ny HTTP-request varje sekund - och istället bör man då använda long-polling eller liknande.

danjel 2009-05-12 15:50

Citat:

Originally posted by ledstrom@May 12 2009, 14:21
danjel, det är alltså CPU kraft vi behöver om vi ska skaffa en ny server? Eller använder sig systemet utav mycket Minne?
vid närmare eeftertanke..nja inte säkert men om ni cachar resultatet i asp.net så lagras det i minnet och så många läsningar kan ju få CPU att jobba även vid en så enkel operation..

men hur länge cachar ni..? kanske cachen invaliderar och under den tid som det tar för sql frågan att gå klart och cacha upp igen i .net så hinner det dundra in en mängd databas frågor

Robert 2009-05-12 17:44

Med så många requests så kan man också ta en titt på.Net's garbage collector som timear ut gammalt skräp efter ett tag. Dock så kan en webserver gå ned på knä om GC'n blir full. En vanlig fallgrop är att använda strängkonkatenering då det blir mycket skräp (strängobjekt) som måste kasserars hela tiden. Kolla upp i dina 10 rader kod så att du inte har några sådana utan kör tex stringbuilder istället.
Kan vara värt att kolla även fast det sannorlikt inte är problemet.

Har du möjlighet (och inte ligger på ett webhotel) så sätt mätpunkter och mät via performance monitor vad som sker och när det sker...

dAEk 2009-05-12 19:48

Citat:

Originally posted by eliasson@May 12 2009, 15:49
Precis som han förklarar så bör du antagligen tänka om, för jag kan inte heller se någon anledning att skapa en ny HTTP-request varje sekund - och istället bör man då använda long-polling eller liknande.
Det är inte första gången jag ser dig tipsa om det här så jag måste fråga: har du nån erfarenhet av att sätta upp sådana lösningar? 5 tusen visningar/sekund är trots allt en hel del och det inte är direkt trivialt att implementera en lösning som är skalbar.
Jag är intresserad av hur hur du brukar gå till väga. Vilken plattform, vilka servrar? IIS, Apache och vilka ytterligare komponenter? Egenutvecklade kanske? I så fall, hur gör du för att komma runt problemet med sockts och trådar som käkar begränsade resurser?

Sorry för OT men det är ett intressant ämne. :)

eliasson 2009-05-13 07:10

Citat:

Originally posted by dAEk@May 12 2009, 17:48
Det är inte första gången jag ser dig tipsa om det här så jag måste fråga: har du nån erfarenhet av att sätta upp sådana lösningar? 5 tusen visningar/sekund är trots allt en hel del och det inte är direkt trivialt att implementera en lösning som är skalbar.
Jag är intresserad av hur hur du brukar gå till väga. Vilken plattform, vilka servrar? IIS, Apache och vilka ytterligare komponenter? Egenutvecklade kanske? I så fall, hur gör du för att komma runt problemet med sockts och trådar som käkar begränsade resurser?
Sorry för OT men det är ett intressant ämne.

Jag använder uteslutande Debian med Apache tillsammans med PHP och MySQL.
Vad det gäller trådar som käkar resurser så är det inga problem, om man jämnför med 5000 HTTP-requests/sekund.

Istället för att t ex göra en SQL fråga varje HTTP-request, så läser jag av cache tills det finns något värde, och sedan pushar detta till klienten med lämplig teknik - men självklart fortfarande har igång tråden - och fortsätter.

Dock har jag inte haft erfarenhet av så många anslutningar samtidigt (och när jag får det så lär jag också byta webbserver till någon lightweight) men jag vet att X antal HTTP-requests/sec väger tyngre än X antal öppna long polling trådar.

Hoppas att jag besvarade din fråga.

andi 2009-05-13 08:23

eliasson, hur fungerar long polling på server-sidan?
Vad är det för typ av cache du läser och hur (med MySQL/PHP)?

eliasson 2009-05-13 09:06

Citat:

Originally posted by andi@May 13 2009, 06:23
eliasson, hur fungerar long polling på server-sidan?
Vad är det för typ av cache du läser och hur (med MySQL/PHP)?

Danga: memcache
PHP: memcache

ledstrom 2009-05-13 09:12

Tyvärr ligger jag i ASP.NET och Windows Miljö.. Jag kanske har glömt och förtydlga det.

Angående databasen så sker det inga läsningar därifrån mer än 1 per minut. Sen lägger det i .NET inbyggda cachemekanism. Cachningen är alltså inte MySQLs egna.

Jag har hittat ett bra exempel för .NET http://www.codeproject.com/KB/aspnet...ltiClient.aspx som jag hade tänkt och implantera, jag kan återkomma om hur det gick =) Alltså vad det gäller Comet lösning med Long Polling

danjel 2009-05-13 15:27

Citat:

Originally posted by ledstrom@May 13 2009, 09:12

Angående databasen så sker det inga läsningar därifrån mer än 1 per minut. Sen lägger det i .NET inbyggda cachemekanism. Cachningen är alltså inte MySQLs egna.


Men du cachar alltså i en minut...då är det ju onödigt att köra en ajax call per sekund då informatiionen uppdateras varje minut..?
Eller cachar du per användare..?

ledstrom 2009-05-13 19:29

danjel, cachen ligger max i en minut, men förändras databasen så förstörs cache objektet och ett nytt skapas. Det är själva objektet som cachas men sedan körs en enklare uträkningen med objektet och det är resultatet som förändras varje sekund. Cachen är global för applikationen

ledstrom 2009-05-13 19:31

Själva requsten sker ifrån en annan webbplats så det är Cross Site, så min färdiga ASP.NET kontroll jag hittade kommer inte fungera alltså.

Onkelborg 2009-05-13 20:36

Den beräkningen, vad handlar den om? Går den att flytta till klienten?

dAEk 2009-05-14 23:15

Citat:

Originally posted by eliasson@May 13 2009, 07:10

Vad det gäller trådar som käkar resurser så är det inga problem, om man jämnför med 5000 HTTP-requests/sekund.

Dock har jag inte haft erfarenhet av så många anslutningar samtidigt (och när jag får det så lär jag också byta webbserver till någon lightweight) men jag vet att X antal HTTP-requests/sec väger tyngre än X antal öppna long polling trådar.

Hoppas att jag besvarade din fråga.

Okej, så Apache klarar 5000 samtidiga långvariga trådar bättre än 5000 vanliga requests per sekund menar du? Intressant.
En av mina tidigare arbetsgivare har en egenutvecklad plattform för att komma runt skalningsproblemen med Apache så när du skriver som du gör förstår du kanske att jag blir intresserad. För mig är det här riktigt high-tech. :D

eliasson 2009-05-15 10:03

Citat:

Originally posted by dAEk@May 14 2009, 21:15
Okej, så Apache klarar 5000 samtidiga långvariga trådar bättre än 5000 vanliga requests per sekund menar du? Intressant.
En av mina tidigare arbetsgivare har en egenutvecklad plattform för att komma runt skalningsproblemen med Apache så när du skriver som du gör förstår du kanske att jag blir intresserad. För mig är det här riktigt high-tech.

Som jag förklarar så har jag ingen erfarenhet av så många anslutningar med apache, men vid de tester jag kört så har 100 långvariga trådar presterat bättre än 100 trådar/sekund.

Någon lightweight webbserver för just "streaming"/long polling är att rekommendera.

danjel 2009-05-15 10:41

Citat:

Originally posted by ledstrom@May 13 2009, 19:29
danjel, cachen ligger max i en minut, men förändras databasen så förstörs cache objektet och ett nytt skapas. Det är själva objektet som cachas men sedan körs en enklare uträkningen med objektet och det är resultatet som förändras varje sekund. Cachen är global för applikationen
OK då är jag med...!:)
Har ni någon cache dependency mot databasen? Jag funderar just vad som händer under den korta tid när cachen invaliderar ,då kan möjligen ett flertal requests gå ner mot DB..vi kan ju kolla koden om du postar den

dAEk 2009-05-22 20:33

Citat:

Originally posted by eliasson@May 15 2009, 10:03
Någon lightweight webbserver för just "streaming"/long polling är att rekommendera.
Yep, en server eller tjänst som hanterar förfrågningar och svar asynkront via events, det borde vara mycket bättre. Vanliga HTTP-servrar fungerar oftast inte så, inte vad jag vet iaf.

En annan grej som också kan vara intressant är frågan hur man på ett bra sätt kan uppskatta (och mäta last-) belastningen på en Ajax-intensiv sajt. Vet ni några sjysta verktyg för det får ni gärna skriva en rad eller två.

gsoc 2009-05-22 20:34

apachetop borde ju visa ajax skapligt om man vill se live

Onkelborg 2009-05-22 22:48

dAEk: IIS 7 har möjlighet att köra asynkront har jag för mig, dvs. inte binda upp en anslutning = en tråd. Tomcat tror jag också klarar det? Lighttpd?

dAEk 2009-05-25 20:00

Som sagt, jag är inte heller speciellt kunnig inom området så det kan mycket väl stämma, och det gör det säkert. :)


Alla tider är GMT +2. Klockan är nu 07:32.

Programvara från: vBulletin® Version 3.8.2
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Svensk översättning av: Anders Pettersson