【发布时间】:2019-01-22 02:17:19
【问题描述】:
在 Google Cloud Platform (GCP) 上,我的 Java 应用在标准应用引擎 (GAE) 上运行。昨天我部署了该应用程序。作为该应用程序的唯一用户(直到它上线),我注意到在发出第一个请求时启动时间(也称为“预热”)大约需要 15 到 30 秒。如果我继续每隔几秒发出请求,响应时间会很快(大约一秒或更短)。但是如果我在大约 10 秒后没有提出请求,下一个请求通常需要 15 到 30 秒才能返回。这告诉我 GAE 识别出超过 10 秒的空闲时间并决定终止实例。
这当然不好。即使应用上线,最初也只有少量用户,请求之间的时间肯定会超过 10 秒。
我决定在应用程序中添加一些代码来保持每个微服务的活力。我通过在任务队列中创建一个任务来做到这一点,该任务将调用一个方法,该方法反过来会对每个微服务进行 HTTP 调用。这些是每个服务中的虚拟方法,但它们迫使 Java 加载类。完成所有 HTTP 调用后,我将等待 5 秒,然后将另一个任务放入队列中并重复相同的过程。这行得通。我注意到我不再看到 15 到 30 秒的预热时间。
我在下午晚些时候启动了应用程序,让它运行一夜,看看第二天早上会有什么反应。第二天早上,我注意到反应很快,虽然没有以前那么快。但是大约一个小时后,当我突然收到可怕的“已达到配额”响应并且该应用不再可用时,我感到非常惊讶。
然后我检查了我的帐单,发现我已经支付了 1.50 美元。然而,我的预算设置为 100 美元。那么为什么会达到我的配额并且应用程序停止接受请求?毕竟,即使我达到了配额,我的预算仍然设置为 100 美元,并且最低警报阈值设置为 50%。
然后我查看了我的帐单并看到以下内容:
前端:2,857.24 分钟(1.03 美元) 后端:574.99 分钟(0.03 美元)
所以 2,857 小时大约是 47 小时。由于他们免费为您提供 28 小时,这意味着我需要支付大约 20 小时的费用。 20 乘以 0.05 美元大约是 1.00 美元,这就是我所看到的。
那么,当应用程序运行了大约 12 小时后,为什么我使用 47 小时呢?一个可能的原因是 GAE 启动了多个实例。不幸的是,我没有在 Instances 页面上查看它使用了多少个实例,因为它每天都会重置它,所以我不知道。
如果我的“保持活动”代码每 5 秒保持一次实例活动,为什么 GAE 还要费心启动另一个实例?我的意思是,以 5 秒为间隔的请求非常长。这绝不应该给 GAE 算法一些迹象,表明该实例正在被大量使用并需要启动另一个实例。
我决定停用我的“保持活动”代码并在 GAE 中进行设置,将实例数限制为 1,但我也选择将最小实例数设置为 1。我假设这将使实例保持活动状态并处理我所有的请求,并且每天 28 小时永远不会用完。还是我误解了这些实例时间的工作方式?
【问题讨论】:
-
我投票决定将此问题作为题外话结束,因为这是向 Google 客户服务提出的问题。
-
您必须检查特定设置,考虑提供您的应用 YAML 文件,特别是因为所有解释都缺少您使用的缩放类型(自动、基本、手动)以及您指定了哪些选项用于扩展(min_instances、target_cpu_utilization、target_throughput_utilization、min_idle_instances、idle_timeout 等)。
标签: java google-app-engine google-cloud-platform