【问题标题】:Why a client create new instance on GAE just after a warmup request为什么客户端在热身请求后在 GAE 上创建新实例
【发布时间】:2012-09-05 22:52:48
【问题描述】:

我将 GAE 用于我的小型服务。我每天只有 3 或 4 个客户,而且从不在同一时间。 我的服务是用 Java 编写的,带有 spring MVC、spring security 和 objectify。 因此启动时间可能需要 15 到 20 秒。

为了避免我的客户出现这种启动延迟,我激活了计费并将最小空闲实例设置为 1(最大空闲实例设置为 1)。 但即使使用这种配置,有时我的客户也必须等待 15 秒才能收到第一个请求。

正如您在我的日志中看到的,在一个预热请求(从未使用过)之后,客户端启动了一个新实例(以后从未使用过):

示例 1:

2012-09-10 23:23:31.442 /myIndex.do 200 18997ms 15kb Mozilla
x.x.x.x - - [10/Sep/2012:14:23:31 -0700] "GET /myIndex.do HTTP/1.1" 200 15048 - "Mozilla" "www.mysite.fr" ms=18997 cpu_ms=10442 cpm_usd=0.001682 loading_request=1 instance=00c61b117c2e937c04807734919256d8a5cee8

2012-09-10 23:05:05.260 /_ah/warmup 200 14225ms 0kb
0.1.0.3 - - [10/Sep/2012:14:05:05 -0700] "GET /_ah/warmup HTTP/1.1" 200 0 - - "3.360029581669528772.mywebsite.appspot.com" ms=14225 cpu_ms=8969 loading_request=1 instance=00c61b117c10680b3f12b4c8f80f7b7191ce8bab

示例 2:

2012-08-31 18:51:16.096 /myIndex.do 200 14676ms 14kb Mozilla
x.x.x.x - - [31/Aug/2012:09:51:16 -0700] "GET /myIndex.do HTTP/1.1" 200 14954 "http://www.mysite.fr/myIndex.do" "Mozilla" "www.mysite.fr" ms=14676 cpu_ms=8514 cpm_usd=0.001671 loading_request=1 pending_ms=1022 instance=00c61b117cf69060fbcfbfe9dbd6ed735b869817

2012-08-31 18:39:43.895 /_ah/warmup 200 19812ms 0kb
0.1.0.3 - - [31/Aug/2012:09:39:43 -0700] "GET /_ah/warmup HTTP/1.1" 200 0 - - "3.360029581669528772.mysite.appspot.com" ms=19812 cpu_ms=10243 loading_request=1 instance=00c61b117c1d4303f8698a615149d5a40dcac7

让我担心的是,我已经有 4 个客户遇到这种类型的问题:/

也发现了类似的问题http://code.google.com/p/googleappengine/issues/detail?id=7865

谁能确认这两个问题是否相关?

谢谢

塞缪尔

【问题讨论】:

    标签: java google-app-engine


    【解决方案1】:

    我不确定我能否正确回答你的问题,但我会尽我所能让你走上正轨。

    在向您的应用程序实例发送“实时”请求之前,应用程序服务器会调用预热请求。这是您调用/初始化尽可能多的代码的机会,以便将其加载到内存中。当“实时”请求击中您的应用程序时,它会迅速执行。查看您的日志,对 /myIndex.do 的请求需要 14 秒才能执行。从任何标准来看,这都是相当长的。

    这导致我提出以下建议:

    1. 尝试找出您正在导入的哪些库会导致请求过长。一旦确定了这一点,请确保在预热处理程序中加载/使用它们。
    2. 如果不是库加载问题,这意味着您正在对请求进行大量处理。我建议将其中一些委托给异步处理程序(使用 AJAX)。
    3. 最后,您可以安排一个任务来定期(每分钟左右)调用您的 /myindex.do,以确保它是“热的”。

    【讨论】:

    • 您对预热请求的想法是正确的,但对问题中描述的情况是错误的。对 index.do 的请求的日志条目清楚地说明了“loading_request=1”,表明这些请求被定向到新实例,并且没有使用现有的(“暖”)实例。这些请求需要 15-19 秒,因为这些新实例必须先启动。
    猜你喜欢
    • 1970-01-01
    • 2020-08-11
    • 2017-06-26
    • 2012-11-30
    • 2011-10-19
    • 2023-03-18
    • 1970-01-01
    • 2014-02-09
    相关资源
    最近更新 更多