Hej
Undrar om någon har något bra förslag på skalning av en drupal sajt.
Vi får för närvarande statistik via en leverantör som ftp:ar upp en xml fil under varje event. Ca 10 event per år. Live sänder eventen med stream.
Under eventen har vi ca 500 samtidiga användare (vill dock klara betydligt fler) som alla läser statistik filen var 5sec för att få de senaste uppdateringarna.
Vi har just nu parsat xml med PHP och i vår custom modul skapat ett block som visar statistiken och sen med javascript laddar om blocket var 5 sekund. Sen har vi en sida till med all statistik som parsar om hela xml:en varje gång.
Som det är nu slår servern i taket ganska direkt. 4 processorer 8 gig minne. Genom att köra ett script som gör om blocket till HTML var 5 sekund lugnar servern ner sig något då den abra behöver parsa xml:en var.
Hur skulle ni sätta upp detta för att klara fler användare.
Har satt upp apache worker och den borde iaf klara 4000 trådar samtidigt.
MySQL verkar inte vara något problem alls.
Ett är att lägga varnish-cache eller nginx framför och cache allt. Men vet inte hur bra det fungerar med dynamisk statistik (men kan ju göra så att resten av sidan går utmärkt även iaf vi får störningar).
Alternativ två att lägga all parsening med AJAX och låta klienternta ladda ner XML:en och paras på egna datorerna.
Alternativ nummer tre sätta upp någon typ av Sökmotor typ solr och köra in all information där och sedan fråga den om statistik.
Någon som har någon annan idé?
Comments
Som du själv skriver att låta
Som du själv skriver att låta varje användare parsa filen varje gång med hjälp av PHP är bara dumt och det finns ingen vits med det heller. Hur ofta laddas xml filen upp? Skulle du inte kunna göra något server skript som får event från FTP och om den ändras uppdatera innehållet? Alternativt ha ett php-script som körs i en while-loop och varannan sekund kolla xml-filen, annars görs en sleep i 2 sekunder (vi vill inte uppehålla CPU).
Du skriver att blocket görs om till HTML var 5 sekund. Är det per användare eller för alla användare?
För jag skulle nog rekommendera att göra om filen till statisk HTML. Sedan via Javascript endast hämta ut den statiska HTML-sidan. Då behöver inte drupal-laddas in utan endast webbserver jobbar. Apache bör klara att leverera en statisk HTML sida. På en av mina webbservrar som görs som VPS med en kärna (x5650 @ 2.67 GHz) och 2GB ram så klarar min apache att leverera 10'000 statiska html sidor (a 8,5kB) på 3.56 sekunder. Alltså 0,356 ms per sida. Nu är det lokalt så det är ingen nätverk, men det verkar ju inte vara ditt problem heller utan CPU.
Att leverera 500 sidor skulle då ta, 178 ms. Alltså gott om tid inom dina 5 sekunder. Men som riktmärket för din egen del bör du ha att en hemsida som kan levereras inom 10ms. Om inte kommer dina 500 besökare vara inne på varv två innan alla hunnit med första uppdateringen. Du kan göra lite tester själv lokalt med ab (apache benchmark).
ab -n 10000 -c 10 http://www.domain.se/test.html
Första parametern är hur många sidor som ska hämtas. Andra parameterna är hur många trådar som ska göras. Sista är hemsidan. Tänk nu på att du har 4 processorer. Varje processor kanske har 2-4 kärnor. Alltså 8-16 samtida förfrågningar kan du hantera. Så din -c variabel kanske ska höjas till typ -c 30. För att testa hur det är att maxa belastningen.
När detta är kört ska du titta efter följande:
Time per request: 1.780 [ms] (mean)
Time per request: 0.356 [ms] (mean, across all concurrent requests)
Första parameterns är snittet att leverera en hemsida sett ur varje individuella användarens sida. Andra parametern är snittet att leverera alla användare sidor sett från server sida. I mitt exempel ovan ser vi att jag som sagt kunde i snitt leverera en sida på 0.356ms. Men varje användare får sin sida på 1.780ms. Alltså under tiden jag behandlar 1 användare behandlas också 4st andra. Så totalt 5 statiska sidor per 1.780ms levereras.
Att installera nginx ger inte så mycket då det inte löser huvudproblemet, en mer optimera struktur vore bättre. Men om du får problem med apaches förmåga att leverera statisk html så kan du testa.
Att installera varnish skulle kunna hjälpa. Dock behöver du plugga på hur den ska konfigureras. Det man kan göra isåfall är att varnish behöver cache i minst 5 sekunder. Och levererar från minne under den tiden, vilket skulle ge bra prestandard. Linux kommer också att cacha din statiska HTML i minnet via fil-cache i apache varianten. Så fördelen med Varnish är att den fungerar för alla urler även de som inte är optimerade med statiska HTML.
Men eftersom ditt behov är så lokalt för just en fil och ett block. Skulle jag gå på lösningen.
Statisk HTML för den blockets innehåll. Uppdaterat HTML sidan på server nivå när XML har uppdateras via FTP. Hos klienten använda javascript som uppdaterar sidan.
Ett alternativ kan vara att göra blocket iframat på just den statiska htmlsidan och sedan har javascripet i den statiskt html sidan som refresar var 5 sekund. Dock har du risken där att om filen uppdateras precis när en användare uppdaterar sin hemsidan så hamnar den utanför loppen av refresh.
Hoppas det hjälper och ett trevligt lite problem du har. Att hantera mycket besökare tycker jag alltid är en lyx-problem. :)
Här kan du läsa lite statesik om olika lösningar för statisk HTML:
http://nbonvin.wordpress.com/2011/03/14/apache-vs-nginx-vs-varnish-vs-gwan/
Här kan vi se att visst. ngnix är bättre än apache på statiskt innehåll. Varnish är lite sämre på statiskt innehåll än ngnix medan G-wan är bäst. Men tittar vi på apache så är den god att leverera 10 000 sidvisningar per sekund med 500 samtidiga användare. Eller så kan vi tolka statistiken så här. Vid 100 samtida användare är minimum runt 7000 sidor i sekunden. Alltså på 5 sekunder klarar man av 5*7000 = 35000 besökare. Så 500 besökare borde inte vara problem att hantera med statiskt innehåll.