【问题标题】:What is AppEngine database "cold start time"?什么是 AppEngine 数据库“冷启动时间”?
【发布时间】:2010-05-03 09:21:39
【问题描述】:

我读到的关于 AppEngine 数据库(用于 Java)的一个更常见的抱怨是,它在“冷启动时间”方面非常慢。这是什么意思?这是我应该担心的事情吗?

【问题讨论】:

  • 如果您现在计划部署您的应用程序,您应该担心。应用引擎团队正在研究一种保留活动 JVM 的方法,这样您就不会像以前那样频繁地加载请求了。
  • 不知道为什么这会导致担心,但这是个好消息。目前,流量很少的应用程序在 JVM 启动方面确实受到影响。

标签: database google-app-engine


【解决方案1】:

这是你应该担心的事情。

当您的应用在特定时间段内没有任何请求时,Google App Engine 会启动一个新的 JVM 来处理请求。从“冷”获取数据存储的句柄 - 即第一次在 JVM 中 - 可能需要相当长的时间,多达 5 秒以上。

在您处理完数据存储(通常是 PersistenceManager 的实例)之后,一切都很好(在 JVM 的生命周期内!)。

编辑:

在 GAE-Java 中启动新的 JVM 也很慢。阅读http://code.google.com/appengine/docs/java/datastore/overview.html,您会看到他们使用单例类来获得PersistenceManagerFactory,因为他们将实例化一个类的操作描述为“昂贵”。

您可以自己测试一下。在 GAE-Java 上创建一个仅返回“Hello World!”的全新应用程序。并且您会发现对应用程序的第一个请求需要几秒钟。

PersistenceManagerFactory添加一个请求,你会发现第一个请求需要多几秒钟。

编辑编辑:

为了您的观看乐趣,我现在创建了这个测试:

http://stackoverflowanswers.appspot.com/helloworld

您将立即看到“Hello, world 0”或“Hello, world xxxx”,其中 xxxx 是以 MS 为单位的计数,表示处理数据存储所需的时间。我认为数据存储区中索引的复杂性和数量可能会影响处理数据存储区所需的时间,因为在这个应用程序中它比在我的其他一些应用程序中更快。

PMF 是应用引擎文档中提供的精确副本。

@SuppressWarnings("serial")
public class HelloWorldServlet extends HttpServlet {
    public void doGet(HttpServletRequest req, HttpServletResponse resp)
            throws IOException {
        long a = System.currentTimeMillis();
        PersistenceManager p = PMF.get().getPersistenceManager();
        long b = System.currentTimeMillis() - a;
        resp.setContentType("text/plain");
        resp.getWriter().println("Hello, world "+b);
    }
}

编辑编辑编辑:

我更改了我的代码,以便它为每个请求实例化一个 PersistenceManagerFactory,现在它会引发 500 个服务器错误,并且在日志中:

javax.jdo.JDOFatalUserException: 应用程序代码试图创建一个 PersistenceManagerFactory 命名 交易 - 可选,但有一个 这个名字已经存在!实例 PersistenceManagerFactory 是 创建速度极慢,而且它是 通常不需要创建一个 多次使用给定名称。 相反,创建一个单例并共享 它贯穿你的代码。如果你 确实需要创建一个副本 PersistenceManagerFactory(例如对于 一个单元测试套件),设置 appengine.orm.disable.duplicate.pmf.exception 系统属性来避免这个错误。

我认为我不需要再提供任何证据证明在应用引擎中处理数据存储是缓慢的。

【讨论】:

  • 请注意,这与数据存储无关 - App Engine 是一个平台。
  • 嗯,这两者似乎齐头并进。 App Engine 使用 JDO 或 JPA 实现了自己的 Bigtable 数据存储。数据存储是平台的一部分。
  • finbarr,您是否有测量结果表明冷启动的主要延迟是连接到数据存储?我认为延迟是从启动 JVM 开始的。他们的 python 运行时还需要获取数据存储的句柄,并且它没有相同的冷启动问题。这让我觉得慢的不是数据库本身,而是 java 或 java 库。例如,如果您使用低级 API 与使用 JDO 会发生什么?
  • @finbarr Java FAQ 中有一个完整的部分基于性能和“加载请求”(受需要启动新 JVM 影响的请求) - 问题似乎是启动新 JVM实例(和您的应用程序的实例),无法访问数据存储区 code.google.com/appengine/kb/…
  • 阅读这个:code.google.com/appengine/docs/java/datastore/overview.html 你会注意到他们为PersistenceManagerFactory 使用了一个单例类,因为创建一个新实例是一项昂贵的操作。他们甚至强调在单例代码上方讨论这个事实。创建一个测量实例化PersistenceManagerFactory 所用时间的应用程序将是微不足道的,是的,它肯定很慢 - 首先是 JVM 很慢。
猜你喜欢
  • 2021-12-05
  • 2020-05-18
  • 1970-01-01
  • 1970-01-01
  • 2020-10-04
  • 2016-04-02
  • 1970-01-01
  • 2020-03-05
  • 2014-05-21
相关资源
最近更新 更多