繁体   English   中英

如何减少Google App Engine数据存储延迟?

[英]How can I reduce Google App Engine datastore latency?

通过appstats,我可以看到我的数据存储区查询大约需要125ms(api和cpu组合),但在执行查询之前通常会有很长的延迟(例如最多12000ms)。

我可以看到来自数据存储区的延迟与我的查询无关(例如,相同的查询/数据具有截然不同的延迟),所以我假设它是app引擎的调度问题。

其他人是否也看到同样的问题?

有没有减少延迟(例如管理控制台设置)?

这是appstats的屏幕截图。 这个servlet只有很少的cpu处理。 它执行getObjectByID,然后执行数据存储区查询。 该查询具有OR运算符,因此它被app引擎转换为3个查询。

appstats截图 如您所见,在第一个getObjectByID执行之前需要6000ms。 get操作之前没有处理(除了获取pm)。 我认为这6000ms的延迟可能是由于实例预热,所以我将我的空闲实例增加到2以防止任何热身。

然后在getObjectByID和查询之间有大约1000ms的第二个延迟。 get和查询之间没有代码行。 代码只是获取getObjectByID的结果,并将数据用作查询的一部分。

总计是8097ms,但我的数据存储操作(以及99%的servlet)只有514ms(45ms api),尽管每次运行servlet时数字都会改变。 这是另一个appstats屏幕截图,它是针对相同的数据在同一个servlet上运行的。 在此输入图像描述

这是我的java代码的基础知识。 出于安全考虑,我不得不删除一些细节。

user = pm.getObjectById(User.class, userKey);           
//build queryBuilder.append(...
final Query query = pm.newQuery(UserAccount.class,queryBuilder.toString());
query.setOrdering("rating descending");
query.executeWithArray(args); 

编辑:使用Pingdom,我可以看到GAE延迟从450毫秒到7,399毫秒不等,或差异为1,644%!! 这是两个空闲实例,网站上没有用户。 在此输入图像描述

在我的一些应用程序中,我观察到非常类似的延迟(在7000-10000ms范围内)。 我不认为问题的大部分(6000毫秒)在于你的代码。

在我的观察中,问题与AppEngine启动新实例有关。 设置最小空闲实例可能有助于缓解但它无法解决它 (我尝试了多达2个空闲实例),因为基本上即使你有N个空闲实例,应用程序引擎也会更喜欢激活动态的实例,即使单个请求进来,也会如果发生疯狂的流量高峰,请“保存”闲置的。 这是非常反直觉的,因为您希望它使用已经存在的实例并为将来的请求启动动态实例。

无论如何,根据我的经验,这个问题(10000毫秒延迟)很少发生在任何非零负载下,很多人每隔几分钟就不得不恢复一些ping(可能是cron工作)的王(曾经工作5分钟)但是最近实例的死亡速度更快,所以它更像是每2分钟一次ping一次)来保持动态实例,以便为没有其他人开启的网站用户提供服务。 这种ping是不理想的,因为它会消耗你的免费配额(每隔5分钟就会吃掉一半以上),但到目前为止我还没有找到更好的选择。

回顾一下,总的来说,我发现app引擎在加载时非常棒,但是当你在网站上只有很少(1-3)个用户时,它就不是很出色。

Appstats仅在您进行GAE API / RPC调用时帮助诊断性能问题。

对于图表,在实例上运行代码时会花费“空白”时间。 这不会是安排时间。

您猜测初始延迟可能是因为实例预热很有可能。 它可能是正在执行的框架代码。 我无法猜测Get和Query之间的延迟。 可能有0行代码,但是你在Query中调用了一些需要时间来处理的函数。

如果不了解语言,框架或实际代码,没有人能够帮助您。

您需要自己添加某种性能跟踪才能诊断出这种情况。 最简单(但不是非常准确)的方法是在代码执行时添加定时器和日志定时器值。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM