【发布时间】:2013-01-03 03:56:26
【问题描述】:
通过 appstats,我可以看到我的数据存储查询大约需要 125 毫秒(api 和 cpu 结合),但在执行查询之前通常会有很长的延迟(例如,长达 12000 毫秒)。
我可以看到我的数据存储延迟与我的查询无关(例如,相同的查询/数据有很大不同的延迟),所以我假设这是应用引擎的调度问题。
其他人是否也遇到过同样的问题?
有没有办法减少延迟(例如管理控制台设置)?
这是来自 appstats 的屏幕截图。这个 servlet 几乎没有 cpu 处理。它执行 getObjectByID,然后执行数据存储查询。该查询有一个 OR 运算符,因此它被应用引擎转换为 3 个查询。
. 如您所见,在第一个 getObjectByID 执行之前需要 6000 毫秒。 get操作前没有任何处理(除了获取pm)。我认为这 6000 毫秒的延迟可能是由于实例预热造成的,因此我将空闲实例增加到 2 个以防止任何预热。
然后在 getObjectByID 和查询之间有大约 1000 毫秒的第二次延迟。获取和查询之间有零行代码。该代码仅获取 getObjectByID 的结果并将数据用作查询的一部分。
总计为 8097 毫秒,但我的数据存储操作(以及 99.99% 的 servlet)只有 514 毫秒(45 毫秒 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 毫秒不等,或相差 1,644%!这是有两个空闲实例且站点上没有用户。
【问题讨论】:
-
你的问题听起来很奇怪。 Appstats 不会在执行您的查询时表示任何调度延迟。您能否附上您的 appstats 页面的图片以查看您在说什么?
-
是的,很奇怪。我已经用 appstat 图像和更多细节更新了这个问题。感谢您的帮助。
-
你能发布正在执行的相关代码吗?
-
好的,已将代码添加到问题中。
-
鉴于你并不总是观察到延迟,我怀疑你的代码是主要问题(这并不意味着它最终可以被优化,但我怀疑这个问题会通过改变而消失你的代码)。我的猜测是,正如您所建议的那样,您正在经历预热延迟。在我分享类似问题的经验的地方查看我的答案。
标签: java google-app-engine jdo latency