Du må være registrert og logget inn for å kunne legge ut innlegg på freak.no
X
LOGG INN
... eller du kan registrere deg nå
Dette nettstedet er avhengig av annonseinntekter for å holde driften og videre utvikling igang. Vi liker ikke reklame heller, men alternativene er ikke mange. Vær snill å vurder å slå av annonseblokkering, eller å abonnere på en reklamefri utgave av nettstedet.
  27 4102
Vi har laget en mobil applikasjon som leverer dynamiske bilder. I denne sammenheng trenger vi et setup som takler 1000 request per sekund på bilder med størelse rundt 0.2 MB.

Vi har vurdert tredjeparts tjenester som amazon s3, men sammenlignet med vp fra digitalocean.com er vp'en mye billigere. Vi loaded en nginx server med 7500 over 30 sec (250 i sekundet) og resultet ble slik: http://i.stack.imgur.com/n6OdT.png.

Resultatet var ved å benytte php, x-accel og redis for å cache content så en slipper å hente fra disk hver gang. Vi vurderer å kjøre dobbel nginx server med dette setupet der vi har en loadbalancer forran. Problemet er at dette vil bare kunne takle rundt 500 r/s med dårlig respnose time. Har dere noen forslag til hva vi kan gjøre ?
Er bildene lagret i Redis eller på disk?
Hva skjer med en ucachet request (bildet ligger på disk)? (Typisk nginx->fastcgi->php->filsystem)
Hva skjer med en cachet request (bildet ligger i Redis)? (Ideelt sett nginx->redis).
Er cachen varmet opp når dere kjører load-testing? (alle bilder i redis)

* Kjør noen benchmarks som ser på forskjellen mellom request som går direkte til redis, og de som går innom Fastcgi/PHP. Implementer eventuelt dette om det mangler.
* Er det mulig å fikse slik at bildene ikke er dynamiske?
* Er det nok minne til å holde alle bildene i cache?
* Prøv en kraftigere server.


[COLOR="Gray"](PS: Er dere Gobi?)
[/COLOR]
Trigonoceps occipita
vidarlo's Avatar
Donor
1 million requests i sekundet, og du vurderer å køyre det på billigaste vpsen du finn?

Du er sprøyte gal.

1M*0.2MB=195GB/sekund.
Trådstarter
6 0
Edit:
Det er 1K request, ikke 1000k r/s

Bildene er lagret på disk, men vi prøver ut redis slik at de bildene som blir spurt om ofte ikke trenger å leses fra disk, men heller fra RAM.
Det vil nok gå nginx->fastcgi->php->filsystem (er ikke helt sikker, men bruker nginx med php og headeren x-accel)
cachet request blir dessverre nginx->Redis->php (så tjener ikke så mye på det)
Det er varmet opp der vi kjører et gitt utvalg av bilder. Skal sies at redis/ikke redis har ikke så mye å si.
Har vurdert å implementere varnish og cashe hvert bilde response, men vet ikke om dette ville vært effektivt?


Bildene blir lastet opp av brukeren og er veldig dynamiske, er Gobi ja.


Her er php koden:
try {
$redis = new Predis\Client(array(
"scheme" => "tcp",
"host" => "127.0.0.1",
"port" => xxxx));

if ($redis->exists($image) == false){
$redis->set($image, file_get_contents("/uploads/". $image));//value is binary
$filename = $image; //this is the file name user will get

header('Cache-Control: public, must-revalidate');
header('Pragma: no-cache');
header('Content-Type: application\jpg');
header('Content-Disposition: attachment; filename='.$image.'');
header('Content-Transfer-Encoding: binary');
header('X-Accel-Redirect: '. '/protected_files/'. $image);
}
else {
$value = $redis->get($image);
header("Content-Type: application/octet-stream");
// header('Content-Disposition: attachment;filename="'.$image.'"');
echo $value;
}




}
Vis hele sitatet...
Og hvorfor bruker dere ikke en tjeneste som Azure Blob Storage?
Returner image url til appen, appen tar seg av lastingen fra azure.
Trådstarter
6 0
Azure blob storage 3T transfer = 248,11/MO DO = 20 / mo
Mulig jeg overser noe i beskrivelsen, men hvilken funksjon har fastcgi og PHP i dette oppsettet? Kan ikke nginx servere filene rett fra disk? Og ja, varnish vil nok kunne hjelpe en god del.
Trådstarter
6 0
Fastcgi er en php prossesing for Nginx servere der Nginx primært er laget for proxing:
https://www.digitalocean.com/communi...xying-in-nginx
Vi bruker php for sikkerhet og da må man også bruke fastcgi.
Sist endret av hahajjjjj; 30. oktober 2015 kl. 16:15.
Sitat av hahajjjjj Vis innlegg
Azure blob storage 3T transfer = 248,11/MO DO = 20 / mo
Vis hele sitatet...
Om jeg ikke tenker helt feil så blir 1000/req/sec a 0.2MB ca. 200MB / sec eller drøyt 2Gbit/sec. Eller rundt 500TB overføring/mnd. (forbehold om avrundinger og regnefeil).

Om du klarer å trykke det ut av en VPS til 20 USD/mnd over tid (dvs at du ikke blir stengt ned el.l.) så skal du få en hundrings av meg.
Trådstarter
6 0
Det vi ønsker å tåle er loadspikes på 1000 r/s. Vi forventer så klart ikke dette i gjennomsnitt
Sist endret av hahajjjjj; 30. oktober 2015 kl. 20:31.
Først og fremst så tror jeg ikke et sekund på at dere kommer til å bevege dere opp mot 1kreq/s, det er helt fantasi. Ikke halvparten av det engang, regn litt på det så ser du fort hvorfor. Vi snakker titalls millioner requests om dagen.

Du er nødt å forklare oss hvorfor disse bildene må bli generert on the fly kontinuerlig. Forklaringen din på bruk av FastCGI gir absolutt ingen mening, Nginx er på ingen måte "primært laget for proxying", det er kanskje den mest avanserte webserveren som finnes.

Hvis den lar seg caches er det helt problemfritt å levere den mengden trafikk, gitt at du har båndbredden til det. Du er mer eller mindre bare begrenset av båndbredde når det kommer til f.eks. Varnish. Men en VPS vil ikke gi deg den båndbredden, til og med Amazon vil ha deg til å gjøre "pre-warming" av Elastic LoadBalancers hvis du skal dytte så store mengder trafikk.
Finn en norsk isp som normalt sett har privatkunder og lei plass til egen boks der. Dei har normalt sett masse ledig utgående trafikk tilgjengelig. Men noen k må du basere deg på å betale.
Vil nok tro det er høyst usannsynlig at dere kommer til å måtte takle 1000rps med mindre dette er snakk om en tjeneste på størrelse med en stor nettavis.

Løsningen du nå har implementet selv ved å bruke Redis som cache er ikke spesielt effektiv da du uansett må gå til PHP og fra PHP til Redis. Det er selvsagt mer effektivt enn å levere rett fra disk, men det finnes bedre alternativer.

Det rette å gjøre her er å sette opp en cache i front hvor du cacher bildene i minnet. Bilder er jo stortsett svært statiske data som ikke må genereres for hvert request så du kan også kjøre høy cachetid på dette.

Nginx har innebygget cachemuligheter straight out of the box. Men min klare anbefaling er å bruke Varnish med malloc som storage backend. Setter du opp dette er det kun maskinvare og nettlinje som vil begrense deg.
Sist endret av stigma; 30. oktober 2015 kl. 21:14.
Trådstarter
6 0
@Deezire - " Nginx has become one of the most flexible and powerful web server solutions available. However, in terms of design, it is first and foremost a proxy server", "FastCGI proxying within Nginx is generally used to translate client requests for an application server that does not or should not handle client requests directly", "Nginx must rely on a separate PHP processor to handle PHP requests". Ikke det at jeg har veldig kontroll på det, med var det jeg leste.

Mhm, vi har gått bort fra Redis og prøver heller å cashe x-accel response på Nginx. Hvis ikke dette funker effektivt skal vi prøve med varnish + Nginx. Vi kjører deretter en loadbalancer forran og 2 av disse Nginx serverene som er koblet til en felles bildeserver.
Sist endret av hahajjjjj; 31. oktober 2015 kl. 14:33.
Det er forøvrig ingenting i den PHP-koden der som gir mer sikkerhet enn å la webserveren servere filene direkte.
Sist endret av fuzzy76; 31. oktober 2015 kl. 14:53.
Jeg er ganske sikker på at Igor Sysoev ikke vil stå inne for den forklaringen. Det blir flisespikkeri, men Nginx er langt mer enn bare en reverse proxy server, hvis det var tilfellet så hadde den vært mer eller mindre vært som Varnish, bare enda mer begrenset når det kom til håndtering av caching. Og med den tankegangen så vil også Apache2 være en reverse proxy, hadde det ikke vært for mod_php. Man har bare innsett problemet med å bundle applikasjonskode inn i webserveren, det gjør den unødvendig treg når man ikke skal bruke denne funksjonaliteten. Det er en konseptuell endring i hvordan vi snakker om webserver og applikasjonsserver. Det er i samme gate som å omtale Varnish som en webserver, det forvirrer folk.

Hvis filene kan leses rett fra disk og serveres direkte så vil du ikke oppnå noe særlig ved å sette Varnish forran Nginx. Moderne maskiner bruker virtual memory og har mange nivåer av read caching på filsystemet. For alle praktiske formål er det ikke mye forskjell å bruke malloc eller file som storage engine på Varnish, med mindre man snakker om optimalisering på et langt høyere nivå enn jeg tror dere trenger å tenke på enda.

Dere vil være begrenset av båndbredden på denne last balansereren, så jeg er ikke helt sikker på hva dere oppnår med å gjøre det, med mindre det er fordi det krever mye prosessorkraft å generere disse bildene, noe du har konsekvent utelate å skrive noe som helst om. Generelt så er det umulig å komme med anbefalinger og råd når du er så tilbakeholden med hva du faktisk ønsker å oppnå.

En kompis dro 275kreq/s gjennom Varnish på sin maskin. Tall uten substans og mening er ganske poengløst.
Husk å slå på gzip ratio 5 eller 6 i nginx for de fleste normale maskiner. gzip er blandt de mer effektfulle optimaliseringene nginx kan gjøre mot nettleser.
Trigonoceps occipita
vidarlo's Avatar
Donor
Sitat av nudo Vis innlegg
Husk å slå på gzip ratio 5 eller 6 i nginx for de fleste normale maskiner. gzip er blandt de mer effektfulle optimaliseringene nginx kan gjøre mot nettleser.
Vis hele sitatet...
Ikkje på bilete. Der er det nær bortkasta CPU-bruk. Kjapp test på 208kB PNG sparte 8kB med gzip. På eit JPEG-bilete var differansen nøyaktig null.

gzip er veldig effektivt på tekst, og tok f.eks. forsida på VG frå 248kB til 40kB. Men OP har altså spesifikt bilete som last.
Sist endret av vidarlo; 31. oktober 2015 kl. 20:58.
Sitat av hahajjjjj Vis innlegg
Resultatet var ved å benytte php, x-accel og redis for å cache content så en slipper å hente fra disk hver gang. Vi vurderer å kjøre dobbel nginx server med dette setupet der vi har en loadbalancer forran. Problemet er at dette vil bare kunne takle rundt 500 r/s med dårlig respnose time. Har dere noen forslag til hva vi kan gjøre ?
Vis hele sitatet...
Det er alltid greit å sjekke hvilken trafikk som faktisk er der med wireshark.

Husk å benytte loopback interface mot undertjenester som kjører på samme node; da denne aktiviteten garantert ikke vil benytte et nettverkskort's båndbredde.

Sjekk med ethtool at du faktisk benytter 100, 1000 eller 10000 eller hva det nå enn er som er høyeste kapasitet på det aktuelle nettverkskortet/ene.

Tweak også iostat til å redusere flaskehalser.
Trigonoceps occipita
vidarlo's Avatar
Donor
Sitat av nudo Vis innlegg
Det er alltid greit å sjekke hvilken trafikk som faktisk er der med wireshark.
Vis hele sitatet...
Eg er veldig nysjerrig på korleis du vil nytte wireshark til dette føremålet. Kan du utdjupe?
Ved å kjøre tcpdump eller wireshark til å lagre trafikken som går på en port eller en adresse vil du få filer som du kan analysere og sjekke hvor mye trafikk du faktisk forholder deg til og i så måte planlegge ut ifra det.

Det er i hovesak 2 ting man kan gjøre; 1) øke kapasiteten eller 2) redusere behovet for kapasitet; 2a) bedre datamodeller eller 2b) mer kompresjon.

Dette er enkle banale grep som de fleste aldri tenker på.
Sist endret av nudo; 31. oktober 2015 kl. 22:40.
Trigonoceps occipita
vidarlo's Avatar
Donor
Sitat av nudo Vis innlegg
Ved å kjøre tcpdump eller wireshark til å lagre trafikken som går på en port eller en adresse vil du få filer som du kan analysere og sjekke hvor mye trafikk du faktisk forholder deg til og i så måte planlegge ut ifra det.

Det er i hovesak 2 ting man kan gjøre; 1) øke kapasiteten eller 2) redusere behovet for kapasitet; 2a) bedre datamodeller eller 2b) mer kompresjon.

Dette er enkle banale grep som de fleste aldri tenker på.
Vis hele sitatet...
Igjen - ab vil gi deg samme informasjonen, utan alt analysearbeidet.

Kode

Completed 100 requests
Completed 200 requests
Completed 300 requests
Completed 400 requests
Completed 500 requests
Finished 500 requests


Server Software:        Apache/2.2.22
Server Hostname:        example.org
Server Port:            80

Document Path:          /
Document Length:        1688 bytes

Concurrency Level:      10
Time taken for tests:   5.148 seconds
Complete requests:      500
Failed requests:        0
Total transferred:      1003500 bytes

HTML transferred:       844000 bytes
Requests per second:    97.13 [#/sec] (mean)
Time per request:       102.950 [ms] (mean)
Time per request:       10.295 [ms] (mean, across all concurrent requests)
Transfer rate:          190.38 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:       44   50   2.1     50      57
Processing:    46   52   7.7     51     141
Waiting:       46   52   7.7     51     141
Total:         92  102   8.5    101     197

Percentage of the requests served within a certain time (ms)
  50%    101
  66%    102
  75%    103
  80%    104
  90%    105
  95%    107
  98%    142
  99%    144
 100%    197 (longest request)
Du får total, du får nyttelasta og du får timing. Det er mykje arbeid å få tak i med wireshark/tcpdump, og eg vil påstå at dei er feil verkty. Det er protokollanalyse, ikkje trafikkanalyse-verkty. Kor mykje trafikk du får er trivielt å sette seg ned og rekne ut, med papir og blyant.

Når det gjeld kompresjon av bilete, så funker ikkje gzip, bzip2 eller andre liknande ting. Auka jpeg kompresjon funker, men går utover kvalitet. I tillegg er det nyttig å finne ut kva som er bottleneck - og det gjer en ved å sjå på lasta på serveren, typisk io-bruk, cpubruk og nettverksbruk.

Forslaga dine i denne tråden har utan unntak vore på viddene.
Hvordan kan man kjøre ab mot nginx?

For å være vertskap for bildene i seg selv bør man trolig sette opp L2ARC med ZIL eller tilsvarende, slik at bildene kan ligge i RAM bildene ville jeg servet fra en nginx underliggende nginx, eller lighthttpd.
Sist endret av nudo; 1. november 2015 kl. 01:26. Grunn: Automatisk sammenslåing med etterfølgende innlegg.
Wat.

Du mangler helt elementær forståelse for hvordan et filsystem opererer. Når et bilde lastes inn fra filsystemet blir det liggende i virtual memory, der vil operativsystemet selv sørge for at de mest benyttede filene ligger raskest tilgjengelig. Når du ser på minnebruken din, se på "buffers and cache", det er akkurat dette. Det er mulig å optimalisere dette, men her er det mange fallgruver.

ab, eller apache benchmark er bare et verktøy for å gjøre parallelle spørringer mot en webserver. Du kan gjøre det mot alt som snakker HTTP/1.1. Et annet alternativ er httperf.

Øke kapasiteten er ikke et enkelt banalt grep som ingen tenker på. Det er mer eller mindre det eneste grepet folk gjør. Og strengt tatt stort sett det eneste grepet folk bør gjøre, da folk flest ikke innehar den kompetansen til å optimalisere uten at det går utover f.eks. dataintegritet.

Kan du forresten utbrodere litt hva du mener med å optimalisere iostat? Eller er det nok en buzzword dumping fra din side, siden du konsekvent utelater å forklare hva du mener med ting som "bedre datamodeller" eller "sjekke hvilken trafikk som faktisk er der med wireshark".
Med iostat kan man bl a sjekke hvor flaskehalser ligger i forhold til hvilke lagringsmedia man henter data fra. Jeg har bl a 2 DAS; ett for SSD og ett for SAS disker i tillegg til ZIL, det å kunne måle hvor mye båndbredde som brukes hvor gjør at man kan optimalisere bruken.

Med ss kan man sjekke at cwnd( Congestion window size ) er optimal.

En ting som ikke har vært nevnt enda er hvor mange ganger hvert bilde skal lastes ned. Dersom hvert av de 1000 bildene som lastes ned 20 ganger hver er det kanskje andre optimaliseringer som er mer relevante? Da kan muligens ipfs vurderes?
Sist endret av nudo; 1. november 2015 kl. 02:17. Grunn: Automatisk sammenslåing med etterfølgende innlegg.
Optimalisere på hvilken måte? Igjen, har du satt deg inn i hvordan virtual memory fungerer? Det er helt essensielt for dette. Ethvert moderne operativsystem bruker det, det er robust. Det er ikke uten grunn at Varnish selv ikke håndterer minnet selv, men lar kernelen gjøre det.

Som om du ikke er en parodi på deg selv så var du nødt til å nevne ipfs. Jeg er ikke sikker på om du er et troll eller bare veldig dum.
Sist endret av Deezire; 1. november 2015 kl. 02:27.
Praktisk eksempel IPFS implementasjon: https://www.youtube.com/watch?v=skMTdSEaCtA&t=270
Bortsett fra at matematikken hans er helt whack. Hvis du skal sende en 1MB stor fil, gjennom 8 hops, så regner du det ikke som 8MB overført data.

Og man bruker CDN med en kombinasjon av anycast og GeoDNS. Så eksemplet hans med et Facebook-bilde blir helt feil, da bildet du laster ned når du aksesserer Facebook mest sannsynlig er fra en maskin inni eller tett opp mot din egen ISP sitt kjernenett.

IPFS er bare en morsom hack som har svært få praktiske formål. Og hvis du bryr deg om latency så har du virkelig ikke lyst å være avhengig av JavaScript performance i nettleseren til Gunnlaug på 75 år som har maskinen full av virus.