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

Java 如何减少Google App Engine数据存储延迟?,java,google-app-engine,jdo,latency,Java,Google App Engine,Jdo,Latency,通过appstats,我可以看到我的数据存储查询大约需要125ms(api和cpu加在一起),但在执行查询之前通常会有很长的延迟(例如高达12000ms) 我可以看出,数据存储中的延迟与我的查询无关(例如,相同的查询/数据具有截然不同的延迟),因此我假设这是app engine的调度问题 其他人也看到了同样的问题吗 是否有办法减少延迟(例如管理控制台设置) 下面是appstats的屏幕截图。这个servlet只有很少的cpu处理。它先执行getObjectByID,然后执行数据存储查询。该查询具

通过appstats,我可以看到我的数据存储查询大约需要125ms(api和cpu加在一起),但在执行查询之前通常会有很长的延迟(例如高达12000ms)

我可以看出,数据存储中的延迟与我的查询无关(例如,相同的查询/数据具有截然不同的延迟),因此我假设这是app engine的调度问题

其他人也看到了同样的问题吗

是否有办法减少延迟(例如管理控制台设置)

下面是appstats的屏幕截图。这个servlet只有很少的cpu处理。它先执行getObjectByID,然后执行数据存储查询。该查询具有OR运算符,因此应用程序引擎将其转换为3个查询

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

然后,getObjectByID和查询之间还有大约1000毫秒的第二个延迟。get和查询之间没有代码行。代码只接受getObjectByID的结果,并将数据用作查询的一部分

总数是8097ms,但我的数据存储操作(以及servlet的99.99%)只有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延迟从450ms到7399ms不等,或者说相差1644%!!这是两个空闲实例,站点上没有用户。

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

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

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

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


您需要自己添加某种性能跟踪,以便对此进行诊断。最简单(但不是非常精确)的方法是在代码执行时添加计时器和记录计时器值。

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

根据我的观察,这个问题与AppEngine创建一个新实例有关。设置最小空闲实例可能有助于缓解问题,但它不会解决问题(我尝试了最多2个空闲实例),因为基本上即使您有N个空闲实例,app engine也会在单个请求进入时启动动态实例,并在出现疯狂流量峰值时“保存”空闲实例。这是非常违反直觉的,因为您希望它使用已经存在的实例,并为将来的请求提供动态实例

无论如何,根据我的经验,这个问题(10000毫秒延迟)在任何非零负载情况下都很少发生,许多人不得不每隔几分钟就恢复一次ping(可能是cron作业)(过去工作时间为5分钟,但最近实例死亡得更快,所以更像是每2分钟ping一次)保留动态实例,以便在没有其他用户的情况下为访问站点的用户提供服务。这种ping并不理想,因为它会消耗掉你的免费配额(每5分钟ping一次会消耗掉一半以上),但到目前为止,我还没有找到更好的替代方法


总而言之,我发现AppEngine在负载下非常出色,但在站点上只有很少(1-3)个用户的情况下并不出色。

你的问题听起来很奇怪。Appstats不会指示执行查询时的任何调度延迟。你能把你的appstats页面的图片包括进来看看你在说什么吗?是的,这很奇怪。我已经用appstat图片和一些更详细的信息更新了这个问题。非常感谢您的帮助。您能发布正在执行的相关代码吗?好的,在问题中添加了代码。鉴于您并不总是观察到延迟,我怀疑您的代码是否是主要问题(这并不意味着它最终可以优化,但我怀疑更改您的代码会解决问题)。我的猜测是,正如你所说,你正在经历热身延迟。请参阅我的答案,我将分享我对类似问题的经验。感谢您的反馈。我在上面添加了代码。这是一个非常简单的Javaservlet,使用JDO访问数据存储。它没有使用任何框架。在我的应用程序的其他部分中,我使用的是GWT,但如果它影响到这个servlet,我会感到惊讶。我还应该指出,同一个servlet和数据请求并不总是有很长的延迟。我附上了另一个快速运行的appstats屏幕截图。谢谢你的回答。有道理。我要试试ping这个主意。