如何减少 GAE 启动的前端实例数量?
Posted
技术标签:
【中文标题】如何减少 GAE 启动的前端实例数量?【英文标题】:How to reduce the number of front end instances launched by GAE? 【发布时间】:2013-06-04 19:11:30 【问题描述】:我正在对我的 GAE/J 应用程序运行两个不同的负载测试。
Loadtest #1 (LT1):每 2 秒调用 /rest/cheap1,每 60 秒调用 /rest/cheap2
Loadtest #2 (LT2):除了 LT1 的 URL,每个用户还调用四个不同的 URL /rest/expensive1,2,3,4。这些 URL 中的每一个大约每 60 秒调用一次。
两个负载测试都去
在 30 分钟内从 0 到 10.000 个并发用户, 在 10.000 个用户中停留 30 分钟, 然后在 30 分钟内降至 0 个用户。网址的主要区别在于延迟。平均而言,延迟为
/rest/cheap1,2 为 70 毫秒 /rest/expensive1,2,3,4 600 毫秒在运行 LT1 时,GAE 仅启动少数实例,每个实例最多可发出 。在 LT2 中添加 /rest/expensive1,2,3,4 后,GAE 启动的实例显着增加,并且每个实例仅放置 5-7 个请求/秒,导致成本增加。 p>
如何使用更少的实例? 有没有办法利用最频繁操作 /rest/cheap1 的小延迟?有很多settings for the GAE scheduler,例如最小/最大挂起延迟、最小/最大空闲实例、实例类。 在这种情况下,我如何利用它们来发挥自己的优势?
/rest/expensive1,2,3,4 的延迟更改如何影响实例计数?如果响应时间减半,GAE 会启动一半的实例?
设置 min.等待延迟到 >= 600 毫秒?
更新:
是的,我在我的应用程序中将 threadsafe 设置为 true。【问题讨论】:
【参考方案1】:在我的测试中,我进行了所有优化并使用外部页面检查器进行了测量,发现 Google App Engine 中最大的延迟来自第一个字节服务器,即您的 python 实例不是“温暖的”。
在实际进行开发而不是预先编写的测试以减少延迟时的一些技巧是
在任何地方都使用 memcache - 也许是最大的收获 获取列表而不是单个实体 如果没有必要,不要迭代 获取键而不是实体 Ajax 可以比纯 python 更快为了使您的测试表现更好,我建议您查看测试的编写方式以及它是否测试了您想要测试的内容。
当你的 python 实例启动时它会快得多,它是我测试中慢的第一个字节。
【讨论】:
您似乎在谈论如何总体上减少延迟。我想要做的是减少端点上给定延迟的实例数。谢谢!【参考方案2】:减少实例数
要减少实例数量,您有多种选择:
减少内存和 CPU 占用
减少代码的内存和 CPU 使用率,以便在给定实例上进行更多的执行。我不会继续这样做,因为从你的问题我知道你不想修改你的代码。
减少最大空闲实例数
在 App Engine 控制台中,减少“最大空闲实例数”参数。这些实例由 App Engine 保留以处理负载峰值。如果您可以在负载峰值期间增加延迟,您可以减少实例数量。
让请求等待一个可用的实例
在 App Engine 控制台中,增加“最小等待延迟”参数。此参数决定 App Engine 调度程序在决定启动新实例以服务您的请求之前等待多长时间。它越高,启动的实例就越少。但当然,您的请求的延迟会增加。
进一步讨论 GAE 可扩展性
所有这些选择都是取舍。您将无法在保持延迟不变的同时减少实例数量。
请注意,“最小待处理延迟”不是请求的完整延迟。这只是请求在等待提供可用实例时在队列中花费的时间。它没有考虑实际处理请求所需的时间(例如 Datastore 调用)。
Check this article for a better understanding of how App Engine handles scalability。我特别推荐最佳做法表,以便更好地了解 App Engine 控制台中可用的性能参数。我将在下面复制它:
【讨论】:
以上是关于如何减少 GAE 启动的前端实例数量?的主要内容,如果未能解决你的问题,请参考以下文章
前端程序员的蜕变——JS的 event 对象属性使用实例兼容性处理(极大提高代码效率减少代码量)