Shery és RePa

2009. szeptember 27.
Ezen a napon, korábban: A Microsoftnal tudnak rolam! (2007), broadband router vs 100 MB/s (2005), Treo 700w (2005), pmg_openmeasgrplist.cpp (2004)

10 éves érettségi találkozó

dyuri @ 19:32:35

Bizony már ennyire megöregedtem :)

A gimiben volt a találkozó - ahol ránézésre túl sok minden nem változott -, elég sokan eljöttek, mindenki elmondta, hogy kb. mi történt vele az elmúlt tíz évben, vacsiztunk, aztán beszélgettünk. A fő téma a szülés és a babák voltak, amibe én kevésbé tudtam beleszólni, de majd egy későbbi talin esetleg :)

Képek is készültek

Szerintem jól sikerült, én jól éreztem magam, köszi a szervezést!

2009. szeptember 20.
Ezen a napon, korábban: "Why I hate Django" (2008), "Why I hate Django" (2008), Epitsd! (2006), munkatempo (2005), Jercemellfile Kijevi modra (2004), bankrablo vs. or (2004)

tornado performance teszt

dyuri @ 17:19:29

Ha már megcsináltam, hogy tornado működjön rendesen Solarison is, akkor gondoltam meg is mérem, hogy mennyire rendes az - de legalábbis összehasonlítom az általunk használt hagyományos fascgi megoldással.

Igazából a tornadot nem WSGI appok futtatására találták ki, de azt is tudja, és hát egy tipikus python webalkalmazás belehelyezhető (jó esetben) egy WSGI konténerbe, úgyhogy miért ne. A tesztalkalmazás egy nagyon alap Django project lett, amiben nincs semmi, csak amit a django-admin.py startproject legyárt, illetve egy extra view, ami kiírja ügyesen, hogy Hello World!.

Hat féle felállást hasonlítottam össze, minden előtt volt egy nginx, azért is mert a cucc egy zónában futott, illetve mert a fastcgi-ket nem tudom közvetlen megszólítani "böngészővel":

  1. fastcgi/threaded
  2. fastcgi/prefork
  3. tornado/_Select
  4. tornado/_LibEvent
  5. nginx/4*tornado
  6. haproxy/4*tornado

A mérést az előzőhöz hasonlóan az apache féle ab programmal végeztem, a 1, 10, 100, 1000, 5000 és 10000 párhuzamos klienst szimulálva, az utolsó esetben összesen 50000, egyébként 10000 lekéréssel. Az áteresztő képességen kívül (request/sec) felírtam a kliensek 50/95/99/100%-ának kiszolgálási idejét (milisec). Utóbbi adatokból inkább nem rajzoltam grafikont :)
Az előzőhöz hasonló módon a teszt egy x86-os Solaris 10-on futott - nem ugyanazon a gépen -, és ugyanúgy minden tesztet háromszor futtattam le, a legjobb eredményt feljegyezve.

Grafikon az áteresztőképességekről:

Konklúzió: a tornado bizony jóval hatékonyabb, mint a sima fastcgik, pláne, ha egy többmagos/többprocesszoros gépen a processzormagok számának megfelelő mennyiségűt indítunk (...reméljük a GIL-től majd megszabadul a python, és akkor ki lehet használni a szálakat rendesen...). Ahogy látszik viszont a _Select alapú ioloopnak meg vannak a korlátai, ha valahol ezt vagyunk kénytelenek használni, ott nginx oldalon tudunk korlátozni, hogy ne kapjon egyszerre mondjuk ezernél több kérést.
Bár a haproxy gyengébben szerepelt, mint az nginx magában, az azért lehet, mert Solaris 10-en még nem támogatja az event ports féle pollingot, csak a régebbi /dev/poll féle megoldást - ennek ellenére jól teljesít, linux alatt valószínűleg ő nyert volna.

A lényeg, hogy a tornado úgy fest valóban képes megbirkózni a tízezer kliens problémájával, és django alkalmazások alatt is jól használható, ha sok klienst kell kiszolgálni.

A nyers számok, ha valakit érdekel: tovább...

2009. szeptember 16.
Ezen a napon, korábban: Babalatogatas (2007), mert NEM (2005), Feature Request Sheet (2004)

libevent + tornado

dyuri @ 9:22:57

Úgy kezdődött a dolog, hogy a facebookos srácok nyílt forrásúvá tették és kiadták a FriendFeed mögött álló python alapú webszervert, a Tornadot. Aranyos dolog, mert nem blokkol, sok klienst képes párhuzamosan kiszolgálni és relatíve gyors mert esemény vezérelt. Feltéve, hogy Linuxon használjuk, mert csak és kizárólag az epollt támogatja (illetve a hagyományos select()-et, nade akkor oda minden előnye).
Viszont én Solaris alatt is szeretném kihasználni a fent említett előnyöket, úgyhogy gyorsan összedobtam egy apró wrappert a libevent köré, ami működik is, és így a Solaris/FreeBSD felhasználók is örülhetnek.

Gyorsan nézzük hogyan történt a dolog.

Először a libeventet kellett letölteni és lefordítani. Szerencsére gond nélkül fordult update 7-es Solaris 10-en.
(jelenleg az 1.4.12-es változat a stabil, azt használtam)

$ ./configure --prefix=/opt/bitnet
...
checking port.h usability... yes # solaris event ports, ez kell nekünk
...
$ make install

Hogy python alól használni tudjuk, ahhoz szükségünk van a python-libevent csomagra, amit én kézzel tettem fel innen, mert a sajtboltos változat ősrégi.

$ export CFLAGS="-I/opt/bitnet/include"
$ export LDFLAGS="-L/opt/bitnet/lib"
$ python setup.py install

Ezután jött az érdemi munka, a tornadot rábeszélni, hogy a libevent-et használja. Ehhez egy ugyan olyan wrapper osztályt csináltam, amit a srácok csináltak maguknak a saját epoll, illetve a hagyományos select() támogatásához, ami igazából a standard python Poll objektum által megvalósított interface:

class _LibEvent(object):
    """A libevent based IOLoop implementation"""
 
    def __init__(self):
        self._eb = libevent.EventBase()
        self._events = {}
        self._ready_fds = {}
 
    def _fd_ready(self, fd, events, eventObj):
        eventmask = (IOLoop.READ * (events & libevent.EV_READ) / libevent.EV_READ) | \
                    (IOLoop.WRITE * (events & libevent.EV_WRITE) / libevent.EV_WRITE) | \
                    (IOLoop.ERROR * (events & libevent.EV_TIMEOUT) / libevent.EV_TIMEOUT)
 
        self._ready_fds[fd] = eventmask
 
    def register(self, fd, events):
        # ezt a reszt is at lehetne alakitani olyanna, mint az elozo fuggveny
        eventmask = 0
        if events & IOLoop.READ:
            eventmask = eventmask | libevent.EV_READ | libevent.EV_PERSIST
        if events & IOLoop.WRITE:
            eventmask = eventmask | libevent.EV_WRITE
        if events & IOLoop.ERROR:
            # does libevent has error event type?
            eventmask = eventmask | libevent.EV_TIMEOUT
 
        self._events[fd] = self._eb.create_event(fd, eventmask, self._fd_ready)
        self._events[fd].add_to_loop()
 
    def modify(self, fd, events):
        self.unregister(fd)
        self.register(fd, events)
 
    def unregister(self, fd):
        self._events[fd].remove_from_loop()
        del self._events[fd]
 
    def poll(self, timeout=10):
        self._ready_fds = {}
 
        self._eb.loop_exit(timeout)
        # libevent.EVLOOP_NONBLOCK hasznalatakor a timert sem varja meg, es megeszi a cpu-t
        self._eb.loop(libevent.EVLOOP_ONCE)
 
        return self._ready_fds.items()
 
...
 
# legvegere, illetve a mar ott levo 'try' blockba:
try:
    import libevent
    _poll = _LibEvent
except:
    _poll = _Select

Illetve ha nem akarjuk belehackolni a tornadoba a cuccot, akkor "monkey patching" technikával is bedolgozhatjuk, ekkor az alkalmazásunk ioloopjanak indítása előtt kell megmondanunk explicite, hogy libeventet használjon:

import tornado.ioloop
tornado.ioloop._poll = _LibEvent
tornado.ioloop.IOLoop.instance().start()

(remélem ezt nem kell sokáig megtenni, jeleztem a fejlesztők felé, hogy jó lenne a libevent támogatást a fő fejlesztési vonalon látni)

Csináltam is néhány gyorstesztet az egyik szerverünkön, sok párhuzamos kérés esetén látszik a fejlődés. A teszteket az apache féle ab paranccsal mértem, ahol az 'n' az összes lekérés, a 'c' pedig a konkurenciát (ennyi szálon próbálkozik párhuzamosan) jelenti. A parancsokat háromszor egymás után megismételtem, és a legjobb eredmény került ki ide.
(ulimit -n unlimited)

  1. _Select:
    • n=10000, c=100: 1048.10 [#/sec]
    • n=10000, c=1000: 683.96 [#/sec]
    • n=10000, c=2000: 672.85 [#/sec] (a háromból egyszer meghalt a lenti hibával)
    • n=10000, c=5000: háromszor egymás után: filedescriptor out of range in select()
  2. _LibEvent:
    • n=10000, c=100: 1056.57 [#/sec]
    • n=10000, c=1000: 1013.59 [#/sec]
    • n=10000, c=2000: 1004.94 [#/sec]
    • n=10000, c=5000: 954.52 [#/sec]
    • n=10000, c=10000: 781.10 [#/sec]
    • n=20000, c=10000: 934.32 [#/sec]

Első körben nekem elég is volt ennyi, hogy lássam, hogy megérte, aztán majd valami egyszerű webalkalmazással meg kéne nézni, hogy a többi megoldáshoz képest (fcgi, cherrypy, esetleg mod_wsgi) hogy muzsikál a cucc.

Használjátok egészséggel!

2009. szeptember 15.
Ezen a napon, korábban: Wii, Red Steel (2006), 120 (2005), meboo (2005), Villamospotlas (2005), ehe (2004), youmaygay!? (2004), sanyi?! (2004), aikido (2004)

Családlátogatás

dyuri @ 8:20:54

Tegnap este meglátogattuk a patkányainkkal Vivit, és Zsebi gyermekeit, akik vele laknak - egy kiszsebi, aki teljesen ugyan olyan, mint az anyja, természetben is, nem csak kinézetben, és a kis kopaszkánk, Nyüzüge-Babe, aki szintén megnőtt, de annál kevesebb szőre maradt :). Íme:

Egyből jól megvoltak az öregekkel és úgy néznek ki, mint akiknek jól viselik gondjukat, bár erről eddig sem volt kétségünk :)

Buta módon semmi esővédő felszerelést nem vittünk magunkkal, hazafele úton éppen beértünk a buszmegálló fedezéke alá egy hatalmas felhőszakadás elől, de végül alig áztunk meg, az egerek meg teljesen szárazak maradtak.

2009. szeptember 11.
Ezen a napon, korábban: backup/swap file helye - vimeseknek (2007), 22. (2007), gazcso (2006), CTF (2006), gaz (2006), 21 (2006), 20y (2005), page 23 (2005), box (2004), szept. 11. (2004)

24.

dyuri @ 14:32:02

amellett, hogy még mindig fiatal barátnőm van, azért nem csak én öregszem :P

Boldog szülinapot azoknak, akik napjában többször daginak neveznek :*

2009. szeptember 5.
Ezen a napon, korábban: Forkbomb (2008), Forkbomb (2008), Forkbomb (2008), Forkbomb (2008), Forkbomb (2008), Forkbomb (2008), Forkbomb (2008), Forkbomb (2008), Cokin P - szabadban (2007), drog (2007)

Tihanyi képek

dyuri @ 18:26:07

Na végre sikerült végigválogatni a tihanyi képeket, [ ÍME ].

2009. szeptember 3.
Ezen a napon, korábban: Google Chrome (2008), tarcsa (2007)

Macskaszag

dyuri @ 8:16:42

Tegnap este gyerekkori barátoméknál, Hoffyéknál vendégeskedtünk, igen kiadós vacsit kaptunk, és jól elbeszélgettünk, csak hát mi 6-kor kelünk, aztán nem maradtunk túl sokáig. Van nekik két cicájuk, amiket picit megsimogattunk, de semmi túlzott ölelgetés.

Éjfél körül értünk haza, és az egerek szokásukhoz hűen vártak minket. Na mikor Shery megpróbálta megsimogatni őket, Émike valószínűleg megérezte a macskaszagot, bemenekült az rejtekhelyükre, és nem lehetett semmivel sem kicsalni. Zsebi meg kicsit értetlenül, de követte az idősebb jelzéseit, és ő is "bemenekült", bár látszott rajta, hogy nemigazán érti hol a veszély. Mivel Émi életében nem látott macskát, ez genetikailag kódolt félelem :)

Ez egy blog. A velemenyunk a mienk, ezert szubjektiv, es meglehet, hogy neha csak picit fedi az egyetemes igazsagot. Mellesleg akinek nem tetszik, az nezze helyette a tvt.

Egyebkent nyugodtan lehet idezni, kepeket toltogetni, szabadok vagyunk.

Ha esetleg valami szemelyes kozolnivalod van, amit nem szeretnel kommentbe leirni, akkor tobbek kozott elerhetsz minket a [akiacikketirta] kukac horak pont hu emailcimen.