Új ruby http szerver - Thin
March 20th, 2008
Ma egy új ruby projectre akadtam, aminél leálltam kicsit, és alaposabban szemügyre vettem. Mióta a rails befutott, rengeteg jogos kritika éri a sebességére vonatkozóan - a rails nagyon lassú. Köszönhető ez magának a ruby interpreternek, illetve a gyönyörű és elegáns kódolást lehetővé tevő háttérmatekolásnak, de hát valamit valamiért. Ez a lassúság orvosolható különféle technikák segítségével, a legtöbb megoldás igyekszik perzisztenssé tenni a rails alkalmazást, pl. a fastcgi interface. Nem is olyan rég született egy nagyon ígéretes fejlesztés, a mongrel, ami a rails-t az átlagos php sebesség közelébe emelte, ami nagyon hiányzott már ahhoz, hogy éles, nagyobb látogatottságú oldalak is alkalmazhassanak rails megoldásokat. Félretéve a rails-t, a mongrel önmagában is egy nagyon jó, egyszerű webrick-helyettesítő (és több), amit egy-két saját projectben fel is használtam, többek között az Árukereső egyik kritikus kódjának gyorsítására, illetve még inkább kiváltására. Ami nagyon megfogott a mongrelben az az egyszerűsége, és a teljesítménye.
Most azonban nem a mongrelről szeretnék írni, a ma felfedezett ruby gyöngyszem a thin, ami azzal robbant be a rails-gyorsító projektek közé, hogy gyorsabbnak nevezi magát a mongrelnél. Ennek nem tudtam ellenállni, és végeztem egy gyors tesztet - az eredmény igazolta a thin nagy mellényét.
Egyszerű “hello world” tesztek különféle megoldással, ab2 benchmark, 10k request, 100as concurrency:
- apache statikus hello.txt kiszolgálás : 8-900 req/s
- apache + mod_php echo “hello world”: 6-700 req/s
- mongrel : 1500-2000 req/s
- thin: 2500-2600 req/s
Ez azért nem semmi. Önmagában az sem, hogy a 2500 req/s érték úgy jön ki, hogy minden körben ruby kódot értelmez a thin, mivel cache-elés nincs.
Nézzük, hogy mitől ilyen gyors a kis drága:
- Az alapja ugyanaz a mongrel parser, mint a mongrelnek - ez pedig a ragel állapotgép-engine-t használja. Ez ideális protokollok implementálására - gyors és pontos (ez azállapotgép, mint olyan fogalomköréből következik) - bővebben:http://www.zedshaw.com/tips/ragel_state_charts.html
- A hálózati I/O-t pedig az eventmachine kezeli - egy újabb nagyszerű szoftver, ami megérdemelne egy külön postot, vagy akár rovatot - talán egyszer sort kerítek rá :)
- A webszerver és a framework közötti kötőanyag pedig a rack, ami szintén egy minimalisztikus, gyors lib.
A rails supportot nem tanulmányoztam, mint ahogy a mongrel esetében sem, tisztán csak az egyéni felhasználás érdekelt. Ebben a tekintetben megegyezik a mongrellel a tudása: definiálhatunk elérési utakat (URL alapon), amiket kiszolgáló osztályokhoz köthetünk (mapping). A kiszolgáló osztályok állítják össze a HTTP választ, a fejléc legapróbb részleteitől kezdve testreszabható módon, de - mint mongrelben - kényelmes wrapperek állnak rendelkezésre (éljenek a ruby szintaxis-trükkjei), hogy ne macerás munka legyen ebből az egészből. Az eredmény egy tökéletesen testreszabható, de ha kell, nagyon magasszintű application server, annak minden előnyével, és egy iszonyat gyors webszerver, készen, kézben. Skálázhatóság? Tegyünk az egész cucc elé egy nginx-et, és máris készen vagyunk. Sőt, az nginx és a thin képes már UDSen is kommunikálni, ami még párszáz req/s-et dob a teljesítményen.






July 3rd, 2008 at 8:11 pm
[...] probably already guessed what’s coming: Thin. I won’t say much about it now, read my older post or use ye olde faithful google. This is good. Thin is really simple. Thin is fast. Thin scales well [...]
August 15th, 2008 at 8:43 am
[...] already guessed what’s coming: Thin. I won’t say much about it now, read my older post oruse ye olde faithful google. This is good. Thin is really simple. Thin is fast. Thin scales [...]