通过appstats,我可以看到我的数据存储查询需要大约125毫秒(包括API和CPU),但是通常在执行查询之前会出现长时间的延迟(例如高达12000毫秒)。
我可以看到我的数据存储从数据存储中获取的延迟与我的查询无关(例如,相同的查询/数据具有非常不同的延迟),因此我认为这是一个应用程序引擎的调度问题。
其他人是否遇到了同样的问题?
有没有办法减少延迟(例如管理控制台设置)?
这是来自appstats的屏幕截图。此servlet几乎没有CPU处理。它使用getObjectByID然后执行数据存储查询。查询具有OR运算符,因此它被应用程序引擎转换为3个查询。
正如您所看到的,在第一个getObjectByID执行之前需要6000ms。在get操作之前没有任何处理(除了获取pm)。我认为这6000ms的延迟可能是由于实例预热造成的,因此我将空闲实例增加到2个以防止任何预热。
然后在getObjectByID和query之间有大约1000ms的第二个延迟。在get和query之间没有代码行。代码仅使用getObjectByID的结果,并将数据用作查询的一部分。
总计为8097ms,但是我的数据存储操作(以及99.99%的servlet)仅为514ms(45ms API),尽管每次运行servlet时这些数字都会发生变化。以下是对相同数据运行相同servlet的另一个appstats截图。
这是我的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毫秒,相差1644%!! 这是在两个空闲实例和网站上没有用户的情况下。