Google App Engine Standard 上的 Django 应用程序在 15 个请求后变慢

Django app on Google App Engine Standard slows down after 15 requests

我使用 F4 机器在 Google App Engine Standard 上部署了一个 Django 应用程序。 API 正在做一些机器学习,处理的持续时间在本地大约为 4 秒(在 3.5 到 4 秒之间)。对于我的用例,部署的应用程序也有 4-5 秒的延迟是可以的。但是,当我多次测试执行相同请求的已部署应用程序时,我发现第一个请求需要 3-4 秒,但在 10-15 次迭代后,它们需要大约 8 秒。

这是我用来测试我的应用程序的代码:

session = requests.Session()

all_times = []
for i in range(50):
    try:
        t0 = time.time()
        resp = session.post(url_api, headers=headers, json=data)
        t1 = time.time()
        print(t1 - t0)
        all_times.append(t1 - t0)
    except Exception as e:
        print("Err", e)
    

请求时长结果如下:

我想知道为什么在 15 个请求后会有这个差距,为什么有些点远高于平均 7-8 秒(例如 10 秒)。

我在查看 Google 云控制台中的延迟时得到了相同的模式:

我试过的

我尝试更改自动缩放参数,认为这可能是因为创建了实例。但是当我在 app.yaml:

中将实例数限制为 1 时,我得到了相同的模式
automatic_scaling:
  max_instances: 1

我也试过:

我的目标是尽量减少可变性并将请求持续时间保持在 5 秒以下。

更新

以下是 Cloud Trace 的跟踪列表示例,它显示了相同的模式:

我比较了与较大延迟相关的跟踪和与较低延迟相关的跟踪,但没有发现任何重要差异。

更新 2

感谢 Priyashree 的回答,将 min_idle_instances 设置为 1 以避免机器重启解决了问题:

在将 Google 云平台性能与本地性能进行比较时,您应该记住,在 GCP 上部署需要更多时间来导入所有必要的库并设置 Django 框架。

一般来说,将本地计算机上的性能与 GCE 上的性能进行比较没有多大意义,因为本地计算机可能 运行 不同 OS。但是,是的,我同意在 10-15 个请求后 GAE 服务的请求之间的延迟差异是不可接受的,而且很奇怪。

检查以下内容:

  • 如果实例超过了配置的最大内存 instance_class 在你的情况下是 F4 这可能会导致关闭 您的实例和 App Engine 创建一个新实例来代替它 可能是因为没有任何可用的实例,因为那是关于 部署实例所需的时间以及您已设置的时间 max_instances 到 1.
  • 如果您设置了 target_cpu_utilization。它指定 CPU 新实例将开始处理的使用阈值 旧实例达到目标 CPU 使用率时的流量。
  • 您发送请求的时间间隔很重要 在您的评论中提到,“您正在一个接一个地提出要求”。 当请求量减少时,App Engine 会减少 实例。当一个应用程序根本没有被使用时,App Engine 关闭其关联的动态实例,但很容易重新加载它们 只要他们需要。重新加载实例可能会导致 用户的额外延迟。为确保您没有重新加载 实例,指定 minimum number of idle instances。设置一个 根据您的应用程序适当数量的空闲实例 请求量允许您的应用程序为每个请求提供服务 延迟很小,除非您遇到异常高的请求 音量。

此外,根据 documentation if instance_class is set to F2 or higher, you can optimize your instances by setting max_concurrent_requests 设置一个高于默认值 10 的值。要确定最佳值,请逐渐增加它并监控应用程序的性能。

浏览 PageSpeed Insights,它分析网页的内容,然后生成使该网页更快的建议,并且可能会很方便。我还建议您联系 Google 支持以获取 1:1 交互,因为此 case/issue 是特定于环境的。