2012-06-26 17 views
18

He estado trabajando con el motor de aplicaciones desde hace bastante tiempo, sé que hay appstats pero esos solo muestran datastore/memcache y otros no relacionados con las estadísticas de uso de memoria.Perfilado/monitoreo de memoria (python) en Google App Engine

he tratado de integrarse con AppTrace (con todos los componentes de las versiones más recientes), pero no puedo continuar, ya que me sale este error:

ImportError: dlopen(../apptrace/guppy/sets/setsc.so, 2): Symbol not found: __PyLong_AsScaledDouble 
Referenced from: ../apptrace/guppy/sets/setsc.so 
Expected in: flat namespace 

Así que mi pregunta es: ¿cuál es el La mejor forma (en la última versión de appengine sdk) de perfilar/monitorear la memoria/detectar pérdidas de memoria y otras cosas relacionadas con la memoria de python (ya sea en el servidor local o en el servidor de Google).

por cierto, se utiliza Python 2.7 y estamos trabajando en Mac OS X (10.7.4)

+0

Parece que setsc.so probablemente fue construido para una versión diferente del pitón, dado que no podría haber construido ese módulo en la instalación.apptrace funciona en dev, creo que vale la pena intentarlo. –

+0

si no usa la recompensa, pierde el punto y no lo obtiene el cuerpo – Efazati

Respuesta

0

Creo que esto es mejor utilidad

appengine-perfilador - Google App perfilador motor en Python - Google Project Hosting ->http://code.google.com/p/appengine-profiler/

08-13 12:40AM 04.586 /camstore/upload 200 508ms 351cpu_ms 293api_cpu_ms 0kb libwww-perl/5.825,gzip(gfe) 
11.222.111.222 - - [13/Aug/2010:00:40:05 -0700] "POST /camstore/upload HTTP/1.1" 200 181 - "libwww-perl/5.825,gzip(gfe)" 
"example.appspot.com:443" ms=508 cpu_ms=352 api_cpu_ms=293 cpm_usd=0.018512 

[I] 08-13 12:40AM 05.021 
    Request summary (uptime=161, ID=6C0D1DD1:1.999999999 : Google App Engine/1.3.6 @ na5): 
    ms   = 425.66 (api_datastore_v3 = 98%, other = 2%) 
    cpu_ms  = 326.67 (api_datastore_v3 = 95%, other = 5%) 
    api_cpu_ms = 293.33 (api_datastore_v3 = 100%, other = 0%) 

también se puede utilizar memcacheApi y otra staf

+5

Pero, ¿esto no solo muestra la información de uso de la CPU? ¿Cómo puede usar esto para perfilar el uso de la memoria? (¿Qué es lo que OP está pidiendo?) – payala

+3

¿Cómo es esta una respuesta al OP exactamente? –

2

Creo que no hay herramientas para supervisar el uso de memoria en Google App Engine, podría perfil del programa, los tiempos de importación del módulo de monitor , cobertura de código. Entonces no son herramientas para detectar pequeñas pérdidas de memoria.

4

Esta publicación tiene 3 años, sin embargo, creo que vale la pena compartir esta respuesta para ayudar a los demás. Tengo soporte premium de Google App Engine y los contacté con respecto a este mismo problema.

El ingeniero de Google me informó que Google App Engine runtime API está en desuso, pero aún funciona. Proporciona un método llamado memory_usage.

from google.appengine.api.runtime import runtime 
import logging 

logging.info(runtime.memory_usage()) 

Esto generará estadísticas de uso de memoria, donde los números se expresan en MB. Por ejemplo:

current: 464.0859375 
average1m: 464 
average10m: 379.575 

Mediante la colocación de la declaración de registro en puntos clave en su código, se puede calcular qué parte está causando una pérdida de memoria.

+0

Esto es exactamente lo que necesitaba, lamentablemente ahora parece que memory_usage devuelve una cadena vacía :( –

+0

¿Qué pasa si prueba runtime.memory_usage(). Current()? – Milo

+0

.current() informa 0.0 desafortunadamente. Estoy en OSX –

0

Pympler: https://github.com/pympler/pympler Actualmente tiene que quitar la parte de 'ImportError' de la excepción de bloque en la línea 1330 en asizeof.py (es decir, por lo que captura todas las excepciones) como statvfs no es utilizable en GAE:

try: 
    from os import statvfs 
    _typedef_both(type(statvfs(curdir)), refs=_statvfs_refs, # statvfs_result 
        item=_sizeof_Cvoidp, leng=_len) 
except: # ImportError: <- Comment out, or add an OSError except as well 
    pass 

de lo contrario, funciona a la perfección:

import logging, traceback 

try: 
    from pympler.asizeof import asizeof 
    for variables in [locals(), globals()]: 
    logging.debug(str({k: asizeof(variables[k]) for k in variables}) 

except Exception as e: 
    logging.warning('Could not perform memory check: %s\n%s' % (str(e), str(traceback.format_exc())))