[APDN] Impacte de l’arquitectura del node

May 25, 2008 – 2:35 am

Si recordeu algun dels meus últims posts sobre el meu projecte final de carrera, recordareu que us havia parlat de APDN, App Python Distributed Network. Doncs bé si tot va bé d'aquí a tres de setmanes presentaré davant del tribunal el projecte de forma definitiva. Finalment ha arribat el moment de començar a fer les proves de rendiment.

APDN és un middleware i com a tal s'interposa com una capa transparent entre el l'usuari i els nodes on s'executen tasques en segon pla. A cada node s'utilitza un programa anomenat apdnn, aquest s'encarrega d'executar les instàncies python, de seguir-les i finalment tancar-les.

El programa del node utilitza un model preforking per a realitzar el llançament de tasques, i utilitza un conjunt d'estructures de dades, un seguit de pipes i altres mecanismes IPC per a comunicar-se amb processos en espais d'adreces diferents.

Avui he he mesurat l'impacte de la infraestructura en el node. Aquesta tasca intenta mesurar quin overhead, si n'hi ha, provoca la pròpia infraestructura de programari de apdnn sobre el procés python. Normalment estructures, mecanismes de sincronització o altres com els comentats que formen part de apdnn poden provocar una penalització de CPU.

Un cop superats certs problemes amb el model d'atenció de peticions de xarxa sobre el servidor*, he pogut fer les proves que m'interessaven. Cal dir que ja m'esperava un impacte relativament baix, el propi programari apdnn no és molt intrusiu pels processos en segon pla un cop aquests s'estan executant.

En la prova que he fet he intentat demostrar que els processos python en un entorn amb APDN activat no tenen una penalització d'ús de la CPU versus un entorn no APDN. El resultat dels experiments l'he pogut reflectir amb el següent gràfic.

Número mig de claus md5 generades sobre un numero de processo simultanis

Aquest gràfic mostra quin és el nombre mig de claus md5 generades en un temps determinat per un conjunt de processos que incrementen de forma quadràtica. Lògicament si anem augmentant el nombre de processos aquests rivalitzen per la CPU i el nombre de claus md5 cau estrepitosament. Es interessant veure com l'arquitectura APDN no penalitza el procés batch amb menys CPU.

EL programa APDN per a fer aquesta demo es diu md5challenge, i té la següent pinta :

 
#!/usr/bin/python
#
# Example of app python code for app envelope
# Pau Freixes, pfreixes@milnou.net
# 2008-05-23
 
import signal
import md5
 
_nrdigest = 0
_const_b = 20
_f = None
_signal = False
 
def handler_alrm(signum, frame):
    global _signal
    global _nrdigest
    global _f
 
    _signal = True
 
def try_me():
    global _nrdigest
    global _f
    global _signal
 
    _f = open("/dev/urandom","r")
    while _signal is not True:
        buff = _f.read(_const_b)
        md5.md5(buff).hexdigest()
        _nrdigest = _nrdigest + 1
 
    if _f is not None :
        _f.close()
 
# Define entry point with one input variable
# req is a instance of Request object, usefull members of this object are:
# req.input is a dictionary with input.xml variables
# req.constants is a dictionary with constants defined into signature.xml
# req.output is void dictionary for full with output variables
# req.config is a dictionary with config values take from namespace
# req.apdn_pid is a pid of aplication
 
def main( req ):
    global _nrdigest
 
    signal.signal(signal.SIGALRM, handler_alrm)
    signal.alarm(req.input['time'])
 
    try_me()
 
    req.output['count'] = _nrdigest
 
    return req.OK
 
if __name__ == "__main__":
 
    # test code
    class test_req:
        pass
 
    req = test_req()
    req.input = { 'time' : 10 }
    req.output = { 'ret' : 0, 'count' : 0 }
    req.OK = 1
 
    main(req)
 
    print "Reached %d digests" % req.output['count']
 

Com podeu veure està preparat per córrer en standalone o bé sobre l'arquitectura APDN. Si ho fa en standalone un petit truc de python ens permet recrear un objecte del tipus Request i assignar-li en temps real els diccionaris necessaris perquè funcioni l'aplicació. En un entorn APDN la funció main ja rep de forma automàtica l'objecte Request. Aquest model d'execució és molt semplant al de mod_python.

*El model de xarxa ha canviat de working threads a un mix de working threads + dinamic temp threads. També s'ha afegit un model de cues per atenció de paquets de xarxa que fa el servidor una mica més equitatiu i evita el starvation de clients sobre nodes.

Post a Comment

*
To prove you're a person (not a spam script), type the security word shown in the picture. Click on the picture to hear an audio file of the word.
Click to hear an audio file of the anti-spam word