2009-03-24 14 views

risposta

13

ho trovato Gprof2Dot estremamente utile. L'output dei moduli di profiling che ho provato non è intuitivo da interpretare.

Gprof2Dot trasforma l'output cProfile in un grafico dall'aspetto grazioso, con la catena più lenta (?) Evidenziata e un po 'di informazioni su ciascuna funzione (nome funzione, percentuale di tempo trascorso su questa funzione e numero di chiamate).

An example graph (1429x1896px)

io non ho fatto molto con l'App Engine, ma a profilare gli script non webapp, tendo al profilo lo script che esegue tutti i Unittests, che non può essere molto preciso al mondo reale situazioni

Uno (meglio?) metodo sarebbe quello di avere uno script che faccia una richiesta WSGI fasulla, quindi tracciarlo.

WSGI è un protocollo molto semplice, è fondamentalmente una funzione che accetta due argomenti, uno con informazioni di richiesta e il secondo con una funzione di richiamata (che viene utilizzata anche per impostare le intestazioni, tra le altre cose). Forse qualcosa di simile al seguente (il che è possibile per la lavorazione del pseudo codice) ...

class IndexHandler(webapp.RequestHandler): 
    """Your site""" 
    def get(self): 
     self.response.out.write("hi") 

if __name__ == '__main__': 
    application = webapp.WSGIApplication([ 
     ('.*', IndexHandler), 
    ], debug=True) 

    # Start fake-request/profiling bit 
    urls = [ 
     "/", 
     "/blog/view/hello", 
     "/admin/post/edit/hello", 
     "/makeanerror404", 
     "/makeanerror500" 
    ] 

    def fake_wsgi_callback(response, headers): 
     """Prints heads to stdout""" 
     print("\n".join(["%s: %s" % (n, v) for n, v in headers])) 
     print("\n") 

    for request_url in urls: 
     html = application({ 
     'REQUEST_METHOD': 'GET', 
     'PATH_INFO': request_url}, 
     fake_wsgi_callback 
     ) 
     print html 

In realtà, la documentazione di App Engine spiega un modo migliore di profiling vostra applicazione:

Da http://code.google.com/appengine/kb/commontasks.html#profiling:

Per definire il profilo delle prestazioni dell'applicazione, rinominare innanzitutto la funzione main() dell'applicazione su real_main(). Quindi, aggiungere una nuova funzione principale per la vostra applicazione, denominata profile_main() come quello qui sotto:

def profile_main(): 
    # This is the main function for profiling 
    # We've renamed our original main() above to real_main() 
    import cProfile, pstats 
    prof = cProfile.Profile() 
    prof = prof.runctx("real_main()", globals(), locals()) 
    print "<pre>" 
    stats = pstats.Stats(prof) 
    stats.sort_stats("time") # Or cumulative 
    stats.print_stats(80) # 80 = how many to print 
    # The rest is optional. 
    # stats.print_callees() 
    # stats.print_callers() 
    print "</pre>" 

[...]

Per abilitare il profiling con l'applicazione, impostare main = profile_main. Per eseguire l'applicazione normalmente, è sufficiente impostare main = real_main.

3

Per il profiling delle chiamate API, Guido van Rossum ha rilasciato una libreria chiamata Appstats che registrerà e mostrerà un sacco di cose buone sulla tua app.

È possibile ottenere la libreria qui: https://sites.google.com/site/appengineappstats/

ho scritto un articolo su di esso sul mio blog (con alcuni screenshot): http://blog.dantup.com/2010/01/profiling-google-app-engine-with-appstats

Appstats http://blog.dantup.com/pi/appstats_4_thumb.png

+2

Aggiornamento: questo è ora parte del GAE SDK: http://googleappengine.blogspot.com/2010/02/app-engine-sdk-131-including-major.html http: // codice .google.com/appengine/docs/python/tools/appstats.html – Turadg

Problemi correlati