3

我有一个低负载/零星负载的应用程序,启动新实例(大约 10 秒)导致的延迟远远超过处理我的请求所需的时间,这通常在 500 毫秒内完成。

所以为了避免新实例的产生(“加载请求”)导致的延迟峰值,我做了以下两个设置:

  • 设置 min idle instances = max idle instances = 1,确保始终有一个实例在运行(一个实例足以处理我的流量);和
  • 将挂起的延迟设置为 15 秒,以便 GAE 等待最多 15 秒以使一个常驻实例空闲而不是启动一个新实例。

计费已激活。但是,GAE 仍会启动新实例,从而导致无法接受的延迟。这是为什么?

在日志中我可以看到我的请求总是在不到 500 毫秒内返回;一个请求不可能排队长达 15 秒。

我能做些什么呢?非常感谢任何帮助。

更新:我的解决方案是设置一个每 5 分钟发出一次请求的 cron 作业,以始终运行动态实例。事实证明(见下面的答案),空闲实例是为疯狂的负载峰值保留的,而不是我 99% 的时间处于低负载场景。

4

2 回答 2

3

正如@koma 所说,app-engine 将创建一个动态实例以保持空闲实例的数量不变,但它不仅会创建一个新实例,而且还会立即使用它而不是平均使用空闲实例。如果您有一堆空闲实例,即使只有一个请求进来,应用引擎实际上仍然更喜欢启动动态实例,并且会“保存”空闲实例以防出现疯狂的流量高峰。

这是非常违反直觉的,因为您希望它使用已经闲置的实例来服务请求并为将来的请求启动动态实例,但这不是它的工作原理。

于 2013-01-21T17:14:03.367 回答
0

如果您设置 min idle instances = 1,它肯定会在第一次请求时产生另一个实例......因为不再有任何空闲实例(它正忙于处理第一个请求!)。而且既然启动了一个新实例,它还不如处理一些请求,不再空闲?

另请参阅Google App Engine 实例不断快速关闭

于 2013-01-20T11:53:49.157 回答