【问题标题】:Memory profiling/monitoring (python) on Google AppEngineGoogle AppEngine 上的内存分析/监控 (python)
【发布时间】:2012-06-26 07:22:01
【问题描述】:

我已经使用应用引擎很长一段时间了,我知道有 appstats 但那些只显示数据存储/内存缓存和其他与实际内存使用统计信息无关的信息。

我已尝试与 AppTrace 集成(与所有组件的最新版本)但我无法继续,因为我收到此错误:

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

所以我的问题是: (在最新的 appengine sdk 上)分析/监控内存/捕获内存泄漏和其他与 python 内存相关的东西(在本地或 Google 服务器上)的最佳方法是什么?

顺便说一句,我们使用 Python 2.7,我们正在使用 Mac OS X (10.7.4)

【问题讨论】:

  • 看起来 setsc.so 可能是为不同版本的 python 构建的,因为您无法在安装时构建该模块。 apptrace 确实在 dev 中工作,我认为值得尝试让它运行。
  • 如果你不使用赏金,你会失去点,没有人得到它

标签: python google-app-engine memory-leaks


【解决方案1】:

这篇文章已有 3 年历史,但我认为这个答案仍然值得分享以帮助他人。我有高级 Google App Engine 支持,并就同样的问题与他们联系。

Google 工程师告诉我,Google App Engine runtime API 已弃用,但仍然可以使用。它提供了一个名为 memory_usage 的方法。

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

logging.info(runtime.memory_usage())

这将输出内存使用统计信息,其中数字以 MB 表示。例如:

current: 464.0859375
average1m: 464
average10m: 379.575

通过将日志记录语句放置在代码中的关键点,您可以找出导致内存泄漏的部分。

【讨论】:

  • 这正是我所需要的,不幸的是现在看来 memory_usage 返回一个空字符串:(
  • 如果你尝试 runtime.memory_usage().current() 会怎样?
  • .current() 不幸地报告 0.0。我在 OSX 上
  • 我在本地运行时得到了 0.0。但是,当我将它部署到 GAE 时,它就起作用了。如果您尝试部署它会发生什么?
  • 有人可以帮我找到 python 3.7 env 的替代品吗?在应用引擎中?
【解决方案2】:

我认为 Google App Engine 中没有监控内存使用的工具,您可以分析程序、监控模块导入时间、代码覆盖率。所以不是检测小内存泄漏的工具。

【讨论】:

    【解决方案3】:

    皮普勒:https://github.com/pympler/pympler 目前必须删除 asizeof.py 中第 1330 行的 except 块的“ImportError”部分(即它捕获所有异常),因为 statvfs 在 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
    

    否则,完美运行:

    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())))
    

    【讨论】:

      【解决方案4】:

      有关替代方案,请参阅Best way to profile/optimize a website on google's appengine

      为了解决这个特殊问题,这篇帖子(虽然很旧)http://sourceforge.net/tracker/?func=detail&aid=3047282&group_id=105577&atid=641821 建议重新安装/更新 guppy。

      ps:下次能不能把完整的traceback,以及相关库的版本贴出来

      【讨论】:

        【解决方案5】:

        我认为这是最好的实用程序

        appengine-profiler - Python 中的 Google App Engine 分析器 - Google 项目托管 -> 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%)
        

        你也可以使用 memcacheApi 和其他工作人员

        【讨论】:

        • 但是,这不只显示cpu使用信息吗?如何使用它来分析内存使用情况? (这是 OP 要求的)
        • 这究竟是对 OP 的回答?
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-04-05
        • 2016-10-02
        • 2014-09-24
        相关资源
        最近更新 更多