【问题标题】:Python App Engine webapp2 slow to routePython App Engine webapp2路由缓慢
【发布时间】:2017-04-20 19:27:17
【问题描述】:

我有一个 Python App Engine 应用程序,每天处理大约 300 万个请求。我正在尝试优化应用程序以节省我可笑地膨胀的托管费用。

November, App Engine Frontend Instances: 12924.391 Hours, $604.22

我将请求处理到一些 memcached 调用,但现在我注意到它通常需要大约 20 毫秒,有时甚至长达 166 毫秒,然后 webapp2 甚至将请求传递给我。

在下图中,您可以看到在 166 毫秒发生的显示“发布”的跟踪。

这是提供此服务的代码。

import logging
logging.info("main.py logging imported")
from imports import *
from handlers import *
logging.info("completed importing others")

class Main(webapp.RequestHandler):
    def post(self):
        logging.info("Post")
        self.get()


...

app = webapp.WSGIApplication(
    [
     ('/.*', Main)
    ],
    debug=False
)

我尝试了什么?

我启用了线程安全,因此在请求得到处理之前不应进行任何导入。可以肯定的是,我还添加了日志记录以查看导入何时发生,并且您可以看到它们并未针对每个请求完成。

更多信息

延迟低并不重要,除了节省托管费用。即使有 1 分钟的响应时间(请求是 API webhook)我也可以,只要它不计入前端实例时间!

如果相关,这里是我的 app.yaml 的开头。

application: coolestsports-hrd
version: 1
runtime: python27
threadsafe: yes
api_version: 1
automatic_scaling:
  min_idle_instances: 1
  min_pending_latency: 1000ms

【问题讨论】:

  • 我不确定您的 url 方案是什么样的,但如果可能的话,它可能有助于从 url 匹配中删除通配符
  • @BRadC 我在 app.yaml 顶部和通配符之前的 WSGIApplication 中添加了 URL 的直接路由,但似乎没有什么不同(每个请求仍然需要 20 多毫秒)。
  • 我想知道“前端实例”时间是否包括TCP套接字建立成本(包括往返)?这或许可以解释这一点
  • @DanCornilescu 谢谢,是

标签: python google-app-engine optimization webapp2


【解决方案1】:

如果保持较低的实例小时数选项卡比保持较低的请求延迟更有意义,那么也许您可以放弃自动扩展以支持基本扩展。来自Scaling types and instance classes

基本缩放

具有基本扩展的服务将在应用程序收到请求时创建一个实例。实例将在以下情况下被拒绝 应用程序变得空闲。基本缩放是理想的工作 间歇性或受用户活动驱动。

自动缩放

自动扩展基于请求率、响应延迟和其他应用程序指标。

Automatic Sc​​aling 旨在提供更好的用户体验,并且可以根据传入的流量模式启动大量实例。

您可以使用config parameters 来调整扩展行为,但对于自动扩展,基本上没有限制并行运行的实例数量,这可能导致实例小时数激增。顺便说一句,您的 min_idle_instances: 1 几乎可以一直保持一个实例处于活动状态,几乎总是处于空闲状态(其他实例实际上会处理大部分请求)。

另一方面,基本扩展有一个max_instances 配置,可用于有效限制账单的实例小时数:

最大实例数

必填。 App Engine 可创建的最大实例数 对于此服务版本。这对于限制成本是有用的 服务。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-13
  • 2013-09-09
  • 2011-10-10
  • 2012-11-15
  • 2016-12-04
  • 1970-01-01
相关资源
最近更新 更多