Python 2 SDK 包含用于分析应用的 RPC(远程过程调用)性能的 Appstats 库。App Engine RPC 是应用程序与 App Engine 服务 API 之间的往返网络调用。例如,所有这些 API 调用都是 RPC 调用:
- Datastore 调用,例如
ndb.get_multi()
、ndb.put_multi()
或ndb.gql()
。 - Memcache 调用,例如
memcache.get()
或memcache.get_multi()
。 - 网址提取调用,例如
urlfetch.fetch()
。 - 邮件调用,例如
mail.send()
。
优化或调试可扩展应用颇具挑战,因为导致性能低下或出现意外费用的问题数不胜数。借助常规信息源(如日志或请求时间统计信息)调试这些问题非常困难。多数应用请求将大部分时间花在等待网络调用完成,以满足请求的需要上。
为了让您的应用保持较快的速度,您需要了解以下方面:
- 您的应用是否在进行不必要的 RPC 调用?
- 您的应用是否应该缓存数据,而不是进行重复的 RPC 调用来获取相同的数据?
- 如果多个请求并行执行而非串行执行,应用的性能是否会更好?
Appstats 库可帮助您解答以上问题,并允许您分析 RPC 调用来验证应用是否以最有效的方式使用 RPC 调用。Appstats 允许您跟踪给定请求的所有 RPC 调用,并报告每次调用的时间和费用。
优化应用的 RPC 使用率也可以节省费用。请参阅管理应用资源。
设置
您无需下载或安装任何程序即可开始使用 Appstats。您只需按照以下步骤中的说明配置应用、重新部署和访问 Appstats 控制台。Appstats 库即会负责完成其余工作。
1. 安装事件记录器
要记录有关网络请求的统计信息,应用的各个请求处理程序都必须调用 Appstats。根据应用所用的框架,请选择以下任一项:
WSGI 请求处理程序
要将 Appstats 与 WSGI 请求处理程序(包括 webapp2 等 WSGI 框架)一起使用,您必须用 Appstats 中间件封装 WSGI 应用。要实现此目的,最简单的方法是定义一个 WSGI 中间件,以使用
appengine_config.py
封装每个 WSGI 应用。如果该文件尚不存在,请在应用的根目录中创建名为
appengine_config.py
的文件。将以下函数添加到文件中:在调用 WSGI 应用之前,运行时将导入此文件并调用
webapp_add_wsgi_middleware
函数(如果找到)。如需详细了解
appengine_config.py
,请参阅下面的可选配置。Django 框架
要在 Django 应用程序中安装 Appstats 中间件,请编辑
settings.py
文件,并将下列行添加为MIDDLEWARE_CLASSES
中的第一项:MIDDLEWARE_CLASSES = ( 'google.appengine.ext.appstats.recording.AppStatsDjangoMiddleware', # ... )
Appstats 中间件必须是第一项,这样分析器才可以在其统计信息中纳入其他中间件。
Django 中间件会根据需要调用 Appstats 来记录事件。您无需更改任何其他应用代码。
2. 设置控制台路径
您可以通过在网络浏览器中访问应用的网址来访问 Appstats 控制台。您必须通过以下两种方式之一设置网址的路径:
默认网址
要将 Appstats 映射至默认目录 (
/_ah/stats/
),请将appstats
内置指令添加到app.yaml
文件中:自定义网址
如需将 Appstats 映射到非默认目录,可以在
app.yaml
中使用url
指令:- url: /stats.* script: google.appengine.ext.appstats.ui.app
3. 可选配置
您可以通过向应用根目录中的 appengine_config.py 文件添加内容来配置 Appstats 的行为。有关配置选项的完整示例,请参阅 SDK 中的文件 google/appengine/ext/appstats/sample_appengine_config.py
。
您需掌握 appengine_config.py
的一些知识:
- 如果请求处理程序修改
sys.path
,则必须对appengine_config.py
中的sys.path
进行同样修改,以便 Appstats 网页界面能够查看所有文件。
显示费用
AppStats 可以跟踪 RPC 费用和时间。如果您的应用足够快速,但费用比您预期的高,请寻找费用超出预期的操作。如要开启费用跟踪,请在 appengine_config.py
文件中设置 appstats_CALC_RPC_COSTS = True
。
4. 使用开发服务器测试 Appstats
您可以使用开发服务器测试 Appstats 设置。如果您将控制台路径配置为使用上述默认网址,则可以通过 http://localhost:8080/_ah/stats/ 访问控制台。
5. 部署
完成 Appstats 设置后,请部署应用。如果您已将控制台路径配置为使用上面的默认网址,则可以通过 http://your_app_id.appspot.com/_ah/stats
访问控制台。
浏览 Appstats 控制台
Appstats 控制台提供有关进行的 RPC 调用、请求的网址路径、最近请求的历史记录的高层次信息,以及各个请求的详细信息:
RPC Stats(RPC 统计信息)表显示应用执行的每种 RPC 的统计信息。点击加号按钮展开条目,以按 RPC 显示路径请求明细:
Path Stats(路径统计信息)表显示发送给应用的每个路径请求的统计信息。点击加号按钮展开条目,以按路径请求的 RPC 显示明细:
如果您启用了 API 费用跟踪功能,该表还会显示费用。
Requests History(请求历史记录)表显示与各个请求相关的数据。点击加号按钮展开条目,按 RPC 显示明细。点击请求链接显示包括单个 RPC 计时的请求的时间轴:
RPC Timeline(时间轴)图表显示特定 RPC 调用的时间以及处理请求的时长。RPC 总计栏显示等待 RPC 调用的总时间,Grand 总计栏显示处理请求的总时间。从下面的时间轴可以看出,大部分时间都花费在 RPC 调用上。这是导致应用性能低下的常见原因。其他标签页会显示关于请求的其他信息。在分析 RPC 调用的性能时,了解 RPC 调用对应用响应时间的影响是非常重要的。
交互式游乐场允许开发人员将任意 Python 代码输入网络表单并在其应用环境中执行。
导航到 Appstats 后,点击交互式游乐场的链接。这时就会显示带有单个文本区域的表单。在文本区域中输入您喜欢的任意 Python 代码,然后提交表单以执行。打印到标准输出的任何结果都会显示在文本区域旁,并显示代码生成的 RPC 调用的时间轴分析。
您可以启用或停用交互式游乐场。SDK 中默认为启用;生产环境中默认为停用。要启用此功能,请将以下行添加到
appengine_config.py
文件中:<pre suppresswarning="yes" class="prettyprint"> appstats_SHELL_OK = True </pre>
运作方式
Appstats 使用 API 挂接将其本身添加到 App Engine 服务 API 所在的远程过程调用框架。 它记录在请求处理程序期间进行的所有 API 调用的统计信息,然后使用 __appstats__
命名空间将数据存储到 memcache 中。Appstats 可以保留最近 1,000 次请求的统计信息。数据包括摘要记录(每条记录大约 200 字节)和详细记录(每条记录不超过 100 KB)。您可以控制详细记录中存储的详细信息量。(请参阅可选配置和示例配置文件。)
API 钩子会给请求处理程序增加开销。Appstats 会向“info”级别的日志添加消息,以报告 Appstats 库本身消耗的资源量。日志行类似如下:
<pre suppresswarning="yes" class="prettyprint">
INFO 2009-08-25 12:04:07,277 recording.py:290] Saved; key: __appstats__:046800, part: 160 bytes, full: 25278 bytes, overhead: 0.019 + 0.018; link: http://your_app_id.[REGION_ID].r.appspot.com/stats/detail?time=1234567890123
</pre>
此行报告了已更新的内存缓存密钥、摘要 (part
) 记录和详细信息 (full
) 记录的大小、以及记录此信息所花的时间(以秒为单位)。此日志行还提供了指向可显示此事件数据的 Appstats 管理界面的链接。